You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ao...@apache.org on 2017/09/28 13:24:50 UTC

[01/50] [abbrv] ambari git commit: AMBARI-22023 Upgrade dialog style issues.(atkach)

Repository: ambari
Updated Branches:
  refs/heads/branch-3.0-perf a670750c3 -> be73d167a


AMBARI-22023 Upgrade dialog style issues.(atkach)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/eead09be
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/eead09be
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/eead09be

Branch: refs/heads/branch-3.0-perf
Commit: eead09bebb0c1887c8dd8fe90aa8a6d50009e897
Parents: 40f705a
Author: Andrii Tkach <at...@apache.org>
Authored: Fri Sep 22 13:11:03 2017 +0300
Committer: Andrii Tkach <at...@apache.org>
Committed: Fri Sep 22 14:48:47 2017 +0300

----------------------------------------------------------------------
 .../main/admin/stack_and_upgrade_controller.js  |   2 +-
 ambari-web/app/messages.js                      |   2 +
 ambari-web/app/routes/stack_upgrade_routes.js   |  11 +-
 ambari-web/app/styles/stack_versions.less       |  77 ++++++---
 .../stack_upgrade/stack_upgrade_wizard.hbs      | 170 +++++++++++--------
 .../main/admin/stack_upgrade/upgrade_group.hbs  |  18 +-
 .../views/common/helpers/status_icon_view.js    |   1 +
 .../admin/stack_upgrade/upgrade_wizard_view.js  |   3 +
 .../admin/stack_and_upgrade_controller_test.js  |   2 +-
 .../stack_upgrade/upgrade_wizard_view_test.js   |   2 +-
 10 files changed, 186 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
index fba6ad6..6d7560b 100644
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
@@ -391,7 +391,7 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     } else if (this.get('upgradeData.Upgrade')){
       return this.get('upgradeData.Upgrade.request_status');
     } else {
-      return '';
+      return 'INIT';
     }
   }.property('upgradeData.Upgrade.request_status', 'App.upgradeSuspended'),
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 113fb8f..db25104 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1884,6 +1884,8 @@ Em.I18n.translations = {
   'admin.stackUpgrade.state.aborted': "Upgrade Aborted",
   'admin.stackUpgrade.state.completed': "Upgrade Finished",
   'admin.stackUpgrade.state.inProgress.downgrade': "Downgrade in Progress",
+  'admin.stackUpgrade.state.init': "Upgrade Initializing",
+  'admin.stackUpgrade.state.init.downgrade': "Downgrade Initializing",
   'admin.stackUpgrade.state.paused.downgrade': "Downgrade Paused",
   'admin.stackUpgrade.state.aborted.downgrade': "Downgrade Aborted",
   'admin.stackUpgrade.state.completed.downgrade': "Downgrade Finished",

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/routes/stack_upgrade_routes.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/stack_upgrade_routes.js b/ambari-web/app/routes/stack_upgrade_routes.js
index 24fa5e8..d36253a 100644
--- a/ambari-web/app/routes/stack_upgrade_routes.js
+++ b/ambari-web/app/routes/stack_upgrade_routes.js
@@ -40,7 +40,16 @@ module.exports = App.WizardRoute.extend({
           return App.ModalPopup.show({
             classNames: ['upgrade-wizard-modal'],
             modalDialogClasses: ['modal-xlg'],
-            header: Em.computed.alias('App.router.mainAdminStackAndUpgradeController.wizardModalTitle'),
+            headerClass: Em.View.extend({
+              header: Em.computed.alias('controller.wizardModalTitle'),
+              controllerBinding: 'App.router.mainAdminStackAndUpgradeController',
+              template: Ember.Handlebars.compile(
+                '{{view.header}}' +
+                '<div {{bindAttr class=":upgrade-options-link controller.isDowngrade:disabled" disabled="controller.isDowngrade"}} {{action openUpgradeOptions target="controller"}}>' +
+                '<i class="icon-cogs"></i><a>{{t admin.stackVersions.version.upgrade.upgradeOptions.header}}</a>' +
+                '</div>'
+              )
+            }),
             bodyClass: App.upgradeWizardView,
             primary: Em.I18n.t('common.dismiss'),
             secondary: null,

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/styles/stack_versions.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/stack_versions.less b/ambari-web/app/styles/stack_versions.less
index 2e4faff..0221311 100644
--- a/ambari-web/app/styles/stack_versions.less
+++ b/ambari-web/app/styles/stack_versions.less
@@ -418,7 +418,6 @@
   }
   .details-box {
     padding: 5px;
-    margin-right: 95px;
     .button-row {
       text-align: right;
       padding: 5px;
@@ -439,6 +438,7 @@
     }
   }
   .task-list {
+    width: 100%;
     overflow-x: hidden;
     .progress {
       margin-bottom: 0;
@@ -448,35 +448,70 @@
       margin-right: 5px;
     }
   }
+  .active-task-label {
+    padding: 8px 15px;
+    display: inline-block;
+  }
+  .col-md-2.task-list-main-wrap {
+    padding-left: 0;
+  }
+  .upgrade-groups {
+    padding-left: 0;
+    .progress {
+      width: 85%;
+      display: inline-block;
+    }
+    .percent {
+      display: inline-block;
+      vertical-align: top;
+    }
+  }
   .task-list-main-wrap i {
     font-size: 16px;
+    color: #0088cc;
+    margin-right: 3px;
   }
   ul.failed-info-list {
     max-height: 500px;
     margin-top: 5px;
   }
-  .upgrade-options-link {
-    position: absolute;
-    cursor: pointer;
-    right: 10%;
-    top: 22px;
-    width: 100px;
-    a {
-      font-size: 13px;
-    }
-    .glyphicon-cogs {
-      color: #0088cc;
-      margin-right: 3px;
+  .pause-button {
+    margin-top: -5px;
+    padding-right: 0;
+    i {
+      padding-right: 4px;
+      font-size: 15px;
     }
   }
-  .upgrade-options-link.disabled {
-    cursor: not-allowed;
-    a, .glyphicon-cogs {
-      color: #808080;
-    }
-    a:hover {
-      text-decoration: none;
-    }
+  .button-row {
+    text-align: right;
+    padding: 5px;
+  }
+}
+
+.upgrade-options-link {
+  padding-left: 50px;
+  display: inline-block;
+  cursor: pointer;
+  width: 150px;
+  vertical-align: bottom;
+  a {
+    font-size: 14px;
+    font-weight: normal;
+  }
+  .icon-cogs {
+    font-size: 16px;
+    color: #0088cc;
+    margin-right: 3px;
+  }
+}
+.upgrade-options-link.disabled {
+  cursor: not-allowed;
+  a, .icon-cogs {
+    color: #808080;
+  }
+  a:hover {
+    text-decoration: none;
   }
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
index cfbbb7a..7ab43b4 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
@@ -17,14 +17,11 @@
 }}
 
 <div id="stack-upgrade-dialog">
-  <div {{bindAttr class=":upgrade-options-link controller.isDowngrade:disabled"}} {{action openUpgradeOptions target="controller"}}>
-    <i class="icon-cogs"></i><a>{{t common.options}}</a>
-  </div>
 
   <div {{bindAttr class="view.isLoaded::hidden :row"}}>
-    <div class="col-md-3 task-list-main-wrap">{{statusIcon controller.requestStatus}}
+    <div class="col-md-2 task-list-main-wrap">{{statusIcon controller.requestStatus}}
       &nbsp;{{view.upgradeStatusLabel}}</div>
-    <div class="col-md-8">
+    <div class="col-md-7">
       {{view App.ProgressBarView
         progressBinding="view.overallProgress"
         statusBinding="controller.requestStatus"
@@ -33,73 +30,110 @@
     <div class="col-md-1">
       {{view.overallProgress}}%
     </div>
-  </div>
-
-  <div class="task-list scrollable-block task-list-main-wrap">
-    {{#if view.isLoaded}}
-      <div>
-        <div class="row">
-          {{#if showPauseButton}}
-            {{#if isDowngrade}}
-              <button
-                class="btn btn-default" {{action confirmPauseDowngrade target="view"}}>{{t admin.stackUpgrade.pauseDowngrade}}</button>
-            {{else}}
-              <button
-                class="btn btn-default" {{action confirmPauseUpgrade target="view"}}>{{t admin.stackUpgrade.pauseUpgrade}}</button>
-            {{/if}}
-          {{/if}}
-        </div>
-        {{#if view.runningItem}}
-          <div class="panel panel-default details-box row">
-            <div class="row col-md-12">
-              <div class="pull-left col-md-6">{{t admin.stackUpgrade.dialog.inProgress}}&nbsp;{{view.runningItem.text}}</div>
-              {{#if view.isDetailsOpened}}
-                  <div class="pull-right col-md-6"><a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.hide}}</a></div>
-                {{#if view.runningItem.isTasksLoaded}}
-                  <div class="clear col-md-12">
-                    {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}}
-                  </div>
+    <div class="col-md-2 pause-button pull-right">
+        {{#if view.isLoaded}}
+            {{#if showPauseButton}}
+                {{#if isDowngrade}}
+                  <button
+                    class="btn btn-default pull-right" {{action confirmPauseDowngrade target="view"}}>{{t admin.stackUpgrade.pauseDowngrade}}</button>
                 {{else}}
-                  {{view App.SpinnerView classNames="clear"}}
+                  <button
+                    class="btn btn-default pull-right" {{action confirmPauseUpgrade target="view"}}>{{t admin.stackUpgrade.pauseUpgrade}}</button>
                 {{/if}}
-              {{else}}
-              <div class="pull-right col-md-6"><a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.open}}</a></div>
-              {{/if}}
-            </div>
-          </div>
+            {{/if}}
         {{/if}}
-        {{#if view.failedItem}}
-          {{#unless view.isSlaveComponentFailuresItem}}
-            <div class="panel panel-default details-box row">
-              <div class="row col-md-12">
-                <div class="pull-left col-md-6">{{t admin.stackUpgrade.dialog.failed}}&nbsp;{{view.failedItem.text}}</div>
-                {{#if view.isDetailsOpened}}
-                <div class="pull-right col-md-6"><a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.hide}}</a></div>
-                  {{#if view.failedItem.isTasksLoaded}}
-                    <div class="clear col-md-12">
-                      {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}}
-                    </div>
-                  {{else}}
-                    {{view App.SpinnerView classNames="clear"}}
-                  {{/if}}
-                {{else}}
-                    <div class="pull-right col-md-6"><a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.open}}</a></div>
-                {{/if}}
-              </div>
-              {{#if view.isHoldingState}}
-                <div class="button-row">
-                  {{#if view.isDowngradeAvailable}}
-                    <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.failedItem target="controller"}}>{{t common.downgrade}}</button>
-                  {{/if}}
-                  {{#if view.failedItem.skippable}}
-                    <button class="btn btn-warning" {{bindAttr disabled="controller.requestInProgress"}} {{action continue view.failedItem target="view"}}>{{t admin.stackUpgrade.dialog.continue}}</button>
-                  {{/if}}
-                    <button class="btn btn-default" {{bindAttr disabled="controller.requestInProgress"}} {{action retry view.failedItem target="view"}}>{{t common.retry}}</button>
+    </div>
+  </div>
+
+  <div class="task-list scrollable-block task-list-main-wrap upgrade-groups">
+      {{#if view.isLoaded}}
+        <div class="panel-group">
+            {{#if view.runningItem}}
+              <div class="panel panel-default details-box row">
+                <div class="panel-heading row">
+                  <div class="pull-left col-md-6">
+                      {{t admin.stackUpgrade.dialog.inProgress}}&nbsp;{{view.runningItem.text}}
+                  </div>
+                    {{#if view.isDetailsOpened}}
+                      <div class="pull-right col-md-6">
+                        <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
+                           data-toggle="collapse">
+                            {{t admin.stackUpgrade.dialog.details.hide}}
+                        </a>
+                      </div>
+                    {{else}}
+                      <div class="pull-right col-md-6">
+                        <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
+                           data-toggle="collapse">
+                            {{t admin.stackUpgrade.dialog.details.open}}
+                        </a>
+                      </div>
+                    {{/if}}
                 </div>
-              {{/if}}
-            </div>
-          {{/unless}}
-        {{/if}}
+                <div id="collapseBox" class="panel-collapse collapse">
+                  <div class="panel-body">
+                      {{#if view.runningItem.isTasksLoaded}}
+                        <div class="clear col-md-12">
+                            {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}}
+                        </div>
+                      {{else}}
+                          {{view App.SpinnerView classNames="clear"}}
+                      {{/if}}
+                  </div>
+                </div>
+              </div>
+            {{/if}}
+            {{#if view.failedItem}}
+                {{#unless view.isSlaveComponentFailuresItem}}
+                  <div class="panel panel-default details-box row">
+                    <div class="panel-heading row">
+                      <div class="pull-left col-md-6">
+                          {{t admin.stackUpgrade.dialog.failed}}&nbsp;{{view.failedItem.text}}
+                      </div>
+                        {{#if view.isDetailsOpened}}
+                          <div class="pull-right col-md-6">
+                            <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
+                               data-toggle="collapse">
+                                {{t admin.stackUpgrade.dialog.details.hide}}
+                            </a>
+                          </div>
+                        {{else}}
+                          <div class="pull-right col-md-6">
+                            <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
+                               data-toggle="collapse">
+                                {{t admin.stackUpgrade.dialog.details.open}}
+                            </a>
+                          </div>
+                        {{/if}}
+                    </div>
+                    <div id="collapseBox" class="panel-collapse collapse">
+                      <div class="panel-body">
+                          {{#if view.failedItem.isTasksLoaded}}
+                            <div class="clear col-md-12">
+                                {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}}
+                            </div>
+                          {{else}}
+                              {{view App.SpinnerView classNames="clear"}}
+                          {{/if}}
+                      </div>
+                    </div>
+                      {{#if view.isHoldingState}}
+                        <div class="button-row">
+                            {{#if view.isDowngradeAvailable}}
+                              <button
+                                class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.failedItem target="controller"}}>{{t common.downgrade}}</button>
+                            {{/if}}
+                            {{#if view.failedItem.skippable}}
+                              <button
+                                class="btn btn-warning" {{bindAttr disabled="controller.requestInProgress"}} {{action continue view.failedItem target="view"}}>{{t admin.stackUpgrade.dialog.continue}}</button>
+                            {{/if}}
+                          <button
+                            class="btn btn-default" {{bindAttr disabled="controller.requestInProgress"}} {{action retry view.failedItem target="view"}}>{{t common.retry}}</button>
+                        </div>
+                      {{/if}}
+                  </div>
+                {{/unless}}
+            {{/if}}
         {{#if view.plainManualItem}}
           <div class="panel panel-default details-box">
             <p class="manual-steps-title"><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs
index 1a829fb..00cde9f 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs
@@ -23,16 +23,16 @@
     <a href="#" {{action toggleExpanded view.content controller.upgradeData.upgradeGroups target="view"}}>{{view.content.title}}</a>
   </div>
   {{#if view.content.isRunning}}
-    <div class="col-md-3">
+    <div class="col-md-4 pull-right">
       {{view view.progressBarView
         progressBinding="view.content.progress"
         statusBinding="view.content.status"
         totalTasksBinding="view.content.total_task_count"
         completedTasksBinding="view.content.completed_task_count"
       }}
-    </div>
-    <div class="col-md-1">
-      <div>{{view.content.progress}}%</div>
+      <div class="percent pull-right">
+        <span>{{view.content.progress}}%</span>
+      </div>
     </div>
   {{/if}}
 </div>
@@ -48,14 +48,14 @@
           <a href="#" {{action toggleExpanded item view.content.upgradeItems target="view"}}>{{item.context}}</a>
         </div>
         {{#if item.isRunning}}
-          <div class="col-md-3">
+          <div class="col-md-4 pull-right">
             {{view App.ProgressBarView
               progressBinding="item.progress"
               statusBinding="item.status"
-            }}
-          </div>
-          <div class="col-md-1">
-            <div>{{item.progress}}%</div>
+              }}
+            <div class="percent pull-right">
+                <span>{{item.progress}}%</span>
+            </div
           </div>
         {{/if}}
       </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/views/common/helpers/status_icon_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/helpers/status_icon_view.js b/ambari-web/app/views/common/helpers/status_icon_view.js
index fbd8e3a..b807976 100644
--- a/ambari-web/app/views/common/helpers/status_icon_view.js
+++ b/ambari-web/app/views/common/helpers/status_icon_view.js
@@ -26,6 +26,7 @@ App.StatusIconView = Em.View.extend({
    * @type {object}
    */
   statusIconMap: {
+    'INIT': 'icon-cogs in_progress',
     'COMPLETED': 'glyphicon glyphicon-ok completed',
     'WARNING': 'glyphicon glyphicon-warning-sign',
     'FAILED': 'glyphicon glyphicon-exclamation-sign failed',

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
index a5e7730..415d87d 100644
--- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
+++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
@@ -250,6 +250,9 @@ App.upgradeWizardView = Em.View.extend({
       case 'HOLDING':
         labelKey = 'admin.stackUpgrade.state.paused';
         break;
+      default:
+        labelKey = 'admin.stackUpgrade.state.init';
+        break;
     }
     if (labelKey) {
       labelKey += (this.get('controller.isDowngrade')) ? '.downgrade' : "";

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
index 2f14e50..d0671f9 100644
--- a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
@@ -107,7 +107,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       this.mock.returns(false);
       controller.set('upgradeData', null);
       controller.propertyDidChange('requestStatus');
-      expect(controller.get('requestStatus')).to.be.empty;
+      expect(controller.get('requestStatus')).to.equal('INIT');
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/eead09be/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
index 8ad711e..a303e60 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
@@ -544,7 +544,7 @@ describe('App.upgradeWizardView', function () {
           status: '',
           isDowngrade: false
         },
-        result: ''
+        result: Em.I18n.t('admin.stackUpgrade.state.init')
       },
       {
         data: {


[19/50] [abbrv] ambari git commit: AMBARI-22012. BP deploys failing intermittently with error (magyari_sandor)

Posted by ao...@apache.org.
AMBARI-22012. BP deploys failing intermittently with error  (magyari_sandor)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/b653ee0a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/b653ee0a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/b653ee0a

Branch: refs/heads/branch-3.0-perf
Commit: b653ee0a5967a8255f087f43a1cb6a878e765833
Parents: 6633a7b
Author: Sandor Magyari <sm...@hortonworks.com>
Authored: Fri Sep 22 17:48:54 2017 +0200
Committer: Sandor Magyari <sm...@hortonworks.com>
Committed: Mon Sep 25 21:19:53 2017 +0200

----------------------------------------------------------------------
 .../events/ClusterConfigFinishedEvent.java      | 15 +++-
 .../ambari/server/topology/TopologyManager.java | 88 +++++++++++++-------
 .../topology/tasks/ConfigureClusterTask.java    | 13 ++-
 .../tasks/ConfigureClusterTaskFactory.java      |  3 +-
 .../server/utils/ManagedThreadPoolExecutor.java | 83 ++++++++++++++++++
 .../ClusterDeployWithStartOnlyTest.java         |  2 +-
 ...InstallWithoutStartOnComponentLevelTest.java |  2 +-
 .../ClusterInstallWithoutStartTest.java         |  2 +-
 .../topology/ConfigureClusterTaskTest.java      | 18 +++-
 .../utils/ManagedThreadPoolExecutorTest.java    | 51 ++++++++++++
 10 files changed, 236 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigFinishedEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigFinishedEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigFinishedEvent.java
index cdb86ac..f0574d0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigFinishedEvent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigFinishedEvent.java
@@ -23,17 +23,27 @@ package org.apache.ambari.server.events;
  * cluster configuration is successfully updated.
  */
 public class ClusterConfigFinishedEvent extends AmbariEvent {
+
+  private final long clusterId;
   private final String clusterName;
 
 
-  public ClusterConfigFinishedEvent(String clusterName) {
+  public ClusterConfigFinishedEvent(long clusterId, String clusterName) {
     super(AmbariEventType.CLUSTER_CONFIG_FINISHED);
+    this.clusterId = clusterId;
     this.clusterName = clusterName;
   }
 
   /**
+   * Get the cluster id
+   * @return
+   */
+  public long getClusterId() {
+    return clusterId;
+  }
+
+  /**
    * Get the cluster name
-   *
    * @return
    */
   public String getClusterName() {
@@ -46,6 +56,7 @@ public class ClusterConfigFinishedEvent extends AmbariEvent {
   @Override
   public String toString() {
     StringBuilder buffer = new StringBuilder("ClusterConfigChangedEvent{");
+    buffer.append("clusterId=").append(getClusterId());
     buffer.append("clusterName=").append(getClusterName());
     buffer.append("}");
     return buffer.toString();

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
index 3af62e8..9769fae 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
@@ -29,9 +29,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
-import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.actionmanager.HostRoleCommand;
@@ -73,6 +74,7 @@ import org.apache.ambari.server.state.quicklinksprofile.QuickLinksProfile;
 import org.apache.ambari.server.topology.tasks.ConfigureClusterTask;
 import org.apache.ambari.server.topology.tasks.ConfigureClusterTaskFactory;
 import org.apache.ambari.server.topology.validators.TopologyValidatorService;
+import org.apache.ambari.server.utils.ManagedThreadPoolExecutor;
 import org.apache.ambari.server.utils.RetryHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -102,9 +104,23 @@ public class TopologyManager {
   private static final String CLUSTER_CONFIG_TASK_MAX_TIME_IN_MILLIS_PROPERTY_NAME = "cluster_configure_task_timeout";
 
   private PersistedState persistedState;
+
+  /**
+   * Single threaded executor to execute async tasks. At the moment it's only used to execute ConfigureClusterTask.
+   */
   private final ExecutorService executor = Executors.newSingleThreadExecutor();
-  private final Executor taskExecutor; // executes TopologyTasks
-  private final boolean parallelTaskCreationEnabled;
+
+  /**
+   * Thread pool size for topology task executors.
+   */
+  private int topologyTaskExecutorThreadPoolSize;
+  /**
+   * There is one ExecutorService for each cluster to execute TopologyTasks.
+   * TopologyTasks are submitted into ExecutorService for each cluster,
+   * however the ExecutorService is started only after cluster configuration is finished.
+   */
+  private final Map<Long, ManagedThreadPoolExecutor> topologyTaskExecutorServiceMap = new HashMap<>();
+
   private Collection<String> hostsToIgnore = new HashSet<>();
   private final List<HostImpl> availableHosts = new LinkedList<>();
   private final Map<String, LogicalRequest> reservedHosts = new HashMap<>();
@@ -158,17 +174,15 @@ public class TopologyManager {
   private Map<Long, Boolean> clusterProvisionWithBlueprintCreationFinished = new HashMap<>();
 
   public TopologyManager() {
-    parallelTaskCreationEnabled = false;
-    taskExecutor = executor;
+    topologyTaskExecutorThreadPoolSize = 1;
   }
 
   @Inject
   public TopologyManager(Configuration configuration) {
-    int threadPoolSize = configuration.getParallelTopologyTaskCreationThreadPoolSize();
-    parallelTaskCreationEnabled = configuration.isParallelTopologyTaskCreationEnabled() && threadPoolSize > 1;
-    taskExecutor = parallelTaskCreationEnabled
-      ? Executors.newFixedThreadPool(threadPoolSize)
-      : executor;
+    topologyTaskExecutorThreadPoolSize = configuration.getParallelTopologyTaskCreationThreadPoolSize();
+    if (!configuration.isParallelTopologyTaskCreationEnabled()) {
+      topologyTaskExecutorThreadPoolSize = 1;
+    }
   }
 
   // executed by the IoC framework after creating the object (guice)
@@ -310,6 +324,10 @@ public class TopologyManager {
     // set provision action requested
     topology.setProvisionAction(request.getProvisionAction());
 
+
+    // create task executor for TopologyTasks
+    getOrCreateTopologyTaskExecutor(clusterId);
+
     // persist request
     LogicalRequest logicalRequest = RetryHelper.executeWithRetry(new Callable<LogicalRequest>() {
         @Override
@@ -325,15 +343,6 @@ public class TopologyManager {
     addClusterConfigRequest(topology, new ClusterConfigurationRequest(ambariContext, topology, true,
       stackAdvisorBlueprintProcessor, securityType == SecurityType.KERBEROS));
 
-    // Notify listeners that cluster configuration finished
-    executor.submit(new Callable<Boolean>() {
-      @Override
-      public Boolean call() throws Exception {
-        ambariEventPublisher.publish(new ClusterConfigFinishedEvent(clusterName));
-        return Boolean.TRUE;
-      }
-    });
-
     // Process the logical request
     processRequest(request, topology, logicalRequest);
 
@@ -345,6 +354,17 @@ public class TopologyManager {
     return getRequestStatus(logicalRequest.getRequestId());
   }
 
+  @Subscribe
+  public void onClusterConfigFinishedEvent(ClusterConfigFinishedEvent event) {
+    ManagedThreadPoolExecutor taskExecutor = topologyTaskExecutorServiceMap.get(event.getClusterId());
+    if (taskExecutor == null) {
+      LOG.error("Can't find executor service taskQueue not found for cluster: {} ", event.getClusterName());
+    } else {
+      LOG.info("Starting topology task ExecutorService for cluster: {}", event.getClusterName());
+      taskExecutor.start();
+    }
+  }
+
 
   /**
    * Saves the quick links profile to the DB as an Ambari setting. Creates a new setting entity or updates the existing
@@ -941,16 +961,8 @@ public class TopologyManager {
     }
 
     LOG.info("TopologyManager.processAcceptedHostOffer: queue tasks for host = {} which responded {}", hostName, response.getAnswer());
-    if (parallelTaskCreationEnabled) {
-      executor.execute(new Runnable() { // do not start until cluster config done
-        @Override
-        public void run() {
-          queueHostTasks(topology, response, hostName);
-        }
-      });
-    } else {
-      queueHostTasks(topology, response, hostName);
-    }
+    queueHostTasks(topology, response, hostName);
+
   }
 
   @Transactional
@@ -959,9 +971,23 @@ public class TopologyManager {
     persistedState.registerInTopologyHostInfo(host);
   }
 
+  private ExecutorService getOrCreateTopologyTaskExecutor(Long clusterId) {
+    ManagedThreadPoolExecutor topologyTaskExecutor = this.topologyTaskExecutorServiceMap.get(clusterId);
+    if (topologyTaskExecutor == null) {
+      LOG.info("Creating TopologyTaskExecutorService for clusterId: {}", clusterId);
+
+      topologyTaskExecutor = new ManagedThreadPoolExecutor(topologyTaskExecutorThreadPoolSize,
+              topologyTaskExecutorThreadPoolSize, 0L, TimeUnit.MILLISECONDS,
+              new LinkedBlockingQueue<Runnable>());
+      topologyTaskExecutorServiceMap.put(clusterId, topologyTaskExecutor);
+    }
+    return topologyTaskExecutor;
+  }
+
   private void queueHostTasks(ClusterTopology topology, HostOfferResponse response, String hostName) {
     LOG.info("TopologyManager.processAcceptedHostOffer: queueing tasks for host = {}", hostName);
-    response.executeTasks(taskExecutor, hostName, topology, ambariContext);
+    ExecutorService executorService = getOrCreateTopologyTaskExecutor(topology.getClusterId());
+    response.executeTasks(executorService, hostName, topology, ambariContext);
   }
 
   private void updateHostWithRackInfo(ClusterTopology topology, HostOfferResponse response, HostImpl host) {
@@ -1108,7 +1134,7 @@ public class TopologyManager {
     }
 
     ConfigureClusterTask configureClusterTask = configureClusterTaskFactory.createConfigureClusterTask(topology,
-      configurationRequest);
+      configurationRequest, ambariEventPublisher);
 
     AsyncCallableService<Boolean> asyncCallableService = new AsyncCallableService<>(configureClusterTask, timeout, delay,
         Executors.newScheduledThreadPool(1));

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTask.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTask.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTask.java
index 0ce5982..60eaa59 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTask.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTask.java
@@ -22,6 +22,8 @@ import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.Callable;
 
+import org.apache.ambari.server.events.ClusterConfigFinishedEvent;
+import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.security.authorization.internal.RunWithInternalSecurityContext;
 import org.apache.ambari.server.topology.ClusterConfigurationRequest;
 import org.apache.ambari.server.topology.ClusterTopology;
@@ -39,11 +41,14 @@ public class ConfigureClusterTask implements Callable<Boolean> {
 
   private ClusterConfigurationRequest configRequest;
   private ClusterTopology topology;
+  private AmbariEventPublisher ambariEventPublisher;
 
   @AssistedInject
-  public ConfigureClusterTask(@Assisted ClusterTopology topology, @Assisted ClusterConfigurationRequest configRequest) {
+  public ConfigureClusterTask(@Assisted ClusterTopology topology, @Assisted ClusterConfigurationRequest configRequest,
+                              @Assisted AmbariEventPublisher ambariEventPublisher) {
     this.configRequest = configRequest;
     this.topology = topology;
+    this.ambariEventPublisher = ambariEventPublisher;
   }
 
   @Override
@@ -72,6 +77,12 @@ public class ConfigureClusterTask implements Callable<Boolean> {
       throw new Exception(e);
     }
 
+    LOG.info("Cluster configuration finished successfully!");
+    // Notify listeners that cluster configuration finished
+    long clusterId = topology.getClusterId();
+    ambariEventPublisher.publish(new ClusterConfigFinishedEvent(clusterId,
+            topology.getAmbariContext().getClusterName(clusterId)));
+
     LOG.info("TopologyManager.ConfigureClusterTask: Exiting");
     return true;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTaskFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTaskFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTaskFactory.java
index 9e3c151..558af30 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTaskFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTaskFactory.java
@@ -18,6 +18,7 @@
 
 package org.apache.ambari.server.topology.tasks;
 
+import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.topology.ClusterConfigurationRequest;
 import org.apache.ambari.server.topology.ClusterTopology;
 
@@ -25,6 +26,6 @@ import org.apache.ambari.server.topology.ClusterTopology;
 public interface ConfigureClusterTaskFactory {
 
    ConfigureClusterTask createConfigureClusterTask(ClusterTopology topology, ClusterConfigurationRequest
-    configRequest);
+    configRequest, AmbariEventPublisher ambariEventPublisher);
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/main/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutor.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutor.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutor.java
new file mode 100644
index 0000000..167c9cb
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutor.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distribut
+ * ed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.utils;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * ThreadPoolExecutor extension which is stopped by default and can be started & stopped.
+ */
+public class ManagedThreadPoolExecutor extends ThreadPoolExecutor {
+
+  private volatile boolean isStopped;
+  private final ReentrantLock pauseLock = new ReentrantLock();
+  private final Condition unpaused = pauseLock.newCondition();
+
+  public ManagedThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
+                            long keepAliveTime, TimeUnit unit,
+                            BlockingQueue<Runnable> workQueue) {
+    super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
+            Executors.defaultThreadFactory());
+    isStopped = true;
+  }
+
+  protected void beforeExecute(Thread t, Runnable r) {
+    super.beforeExecute(t, r);
+    pauseLock.lock();
+    try {
+      while (isStopped) {
+        unpaused.await();
+      }
+    } catch (InterruptedException ie) {
+      t.interrupt();
+    } finally {
+      pauseLock.unlock();
+    }
+  }
+
+  public void start() {
+    pauseLock.lock();
+    try {
+      isStopped = false;
+      unpaused.signalAll();
+    } finally {
+      pauseLock.unlock();
+    }
+  }
+
+  public void stop() {
+    pauseLock.lock();
+    try {
+      isStopped = true;
+    } finally {
+      pauseLock.unlock();
+    }
+  }
+
+  public boolean isRunning() {
+    return !isStopped;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
index c3248a3..0daa20f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
@@ -391,7 +391,7 @@ public class ClusterDeployWithStartOnlyTest extends EasyMockSupport {
     ambariContext.persistInstallStateForUI(CLUSTER_NAME, STACK_NAME, STACK_VERSION);
     expectLastCall().once();
 
-    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(2);
+    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(1);
 
     persistedTopologyRequest = new PersistedTopologyRequest(1, request);
     expect(persistedState.getAllRequests()).andReturn(Collections.emptyMap()).once();

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
index 372d0a1..bbf4fdb 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
@@ -368,7 +368,7 @@ public class ClusterInstallWithoutStartOnComponentLevelTest extends EasyMockSupp
     ambariContext.persistInstallStateForUI(CLUSTER_NAME, STACK_NAME, STACK_VERSION);
     expectLastCall().once();
 
-    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(2);
+    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(1);
 
     persistedTopologyRequest = new PersistedTopologyRequest(1, request);
     expect(persistedState.getAllRequests()).andReturn(Collections.emptyMap()).once();

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
index 9620507..059a8be 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
@@ -363,7 +363,7 @@ public class ClusterInstallWithoutStartTest extends EasyMockSupport {
     ambariContext.persistInstallStateForUI(CLUSTER_NAME, STACK_NAME, STACK_VERSION);
     expectLastCall().once();
 
-    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(2);
+    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(1);
 
     persistedTopologyRequest = new PersistedTopologyRequest(1, request);
     expect(persistedState.getAllRequests()).andReturn(Collections.emptyMap()).once();

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
index feefcab..b2dac8f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.ambari.server.topology;
 
+import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.reset;
@@ -30,6 +31,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.Executors;
 
+import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.topology.tasks.ConfigureClusterTask;
 import org.easymock.EasyMockRule;
 import org.easymock.Mock;
@@ -60,12 +62,18 @@ public class ConfigureClusterTaskTest {
   @Mock(type = MockType.STRICT)
   private ClusterTopology clusterTopology;
 
+  @Mock(type = MockType.STRICT)
+  private AmbariContext ambariContext;
+
+  @Mock(type = MockType.NICE)
+  private AmbariEventPublisher ambariEventPublisher;
+
   private ConfigureClusterTask testSubject;
 
   @Before
   public void before() {
-    reset(clusterConfigurationRequest, clusterTopology);
-    testSubject = new ConfigureClusterTask(clusterTopology, clusterConfigurationRequest);
+    reset(clusterConfigurationRequest, clusterTopology, ambariContext, ambariEventPublisher);
+    testSubject = new ConfigureClusterTask(clusterTopology, clusterConfigurationRequest, ambariEventPublisher);
   }
 
   @Test
@@ -75,11 +83,15 @@ public class ConfigureClusterTaskTest {
     // is it OK to handle the non existence of hostgroups as a success?!
     expect(clusterConfigurationRequest.getRequiredHostGroups()).andReturn(Collections.emptyList());
     expect(clusterTopology.getHostGroupInfo()).andReturn(Collections.emptyMap());
+    expect(clusterTopology.getClusterId()).andReturn(1L).anyTimes();
+    expect(clusterTopology.getAmbariContext()).andReturn(ambariContext);
+    expect(ambariContext.getClusterName(1L)).andReturn("testCluster");
 
     // this is only called if the "prerequisites" are satisfied
     clusterConfigurationRequest.process();
+    ambariEventPublisher.publish(anyObject());
 
-    replay(clusterConfigurationRequest, clusterTopology);
+    replay(clusterConfigurationRequest, clusterTopology, ambariContext, ambariEventPublisher);
 
     // WHEN
     Boolean result = testSubject.call();

http://git-wip-us.apache.org/repos/asf/ambari/blob/b653ee0a/ambari-server/src/test/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutorTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutorTest.java
new file mode 100644
index 0000000..e94b25c
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/utils/ManagedThreadPoolExecutorTest.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.utils;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+
+import junit.framework.Assert;
+
+public class ManagedThreadPoolExecutorTest {
+
+  @Test
+  public void testGetHostAndPortFromProperty() {
+
+    ManagedThreadPoolExecutor  topologyTaskExecutor = new ManagedThreadPoolExecutor(1,
+            1, 0L, TimeUnit.MILLISECONDS,
+            new LinkedBlockingQueue<Runnable>());
+    Future<Boolean> feature = topologyTaskExecutor.submit(new Callable<Boolean>() {
+      @Override
+      public Boolean call() {
+        return Boolean.TRUE;
+      }
+    });
+
+    Assert.assertTrue(!topologyTaskExecutor.isRunning());
+    topologyTaskExecutor.start();
+    Assert.assertTrue(topologyTaskExecutor.isRunning());
+    topologyTaskExecutor.stop();
+    Assert.assertTrue(!topologyTaskExecutor.isRunning());
+
+  }
+}


[33/50] [abbrv] ambari git commit: AMBARI-22041 - Intermittent bug in AMBARI-21933 patch causing wizard progress reporting to sometimes hang (Jason Golieb via jonathanhurley)

Posted by ao...@apache.org.
AMBARI-22041 - Intermittent bug in AMBARI-21933 patch causing wizard progress reporting to sometimes hang (Jason Golieb via jonathanhurley)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/cb27cee5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/cb27cee5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/cb27cee5

Branch: refs/heads/branch-3.0-perf
Commit: cb27cee531f9321e87e2a32fcfa9879a1439340a
Parents: 1a90a52
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Tue Sep 26 14:52:41 2017 -0400
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Tue Sep 26 14:52:41 2017 -0400

----------------------------------------------------------------------
 .../main/admin/highAvailability/progress_popup_controller.js     | 2 +-
 .../admin/highAvailability/progress_popup_controller_test.js     | 4 +---
 2 files changed, 2 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/cb27cee5/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js
index 6e0ee5e..9d8f33e 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js
@@ -180,7 +180,7 @@ App.HighAvailabilityProgressPopupController = Ember.Controller.extend({
     var hosts = [];
     var hostsMap = {};
     var popupTitle = this.get('popupTitle');
-    var id = data[0].Requests.id;
+    var id = this.get('requestIds')[0];
 
     data.forEach(function (request) {
       request.tasks.forEach(function (task) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb27cee5/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
index 2742c44..b14bf86 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
@@ -343,9 +343,6 @@ describe('App.HighAvailabilityProgressPopupController', function () {
     it("calculate data", function() {
       var data = [
         {
-          Requests: {
-            id: 1
-          },
           tasks: [
             {
               Tasks: {
@@ -363,6 +360,7 @@ describe('App.HighAvailabilityProgressPopupController', function () {
         }
       ];
       controller.setProperties({
+        requestIds: [1],
         popupTitle: 'popupTitle'
       });
       controller.calculateHostsData(data);


[24/50] [abbrv] ambari git commit: AMBARI-20437 HDFS Bytes Written and HDFS Bytes Read maybe not correct (zhangxiaolu via dsen)

Posted by ao...@apache.org.
AMBARI-20437 HDFS Bytes Written and HDFS Bytes Read maybe not correct (zhangxiaolu via dsen)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/398690ac
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/398690ac
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/398690ac

Branch: refs/heads/branch-3.0-perf
Commit: 398690ac1c3cf283035e6a804d99536596c3bf6a
Parents: ced70f7
Author: Dmytro Sen <ds...@apache.org>
Authored: Tue Sep 26 11:48:22 2017 +0300
Committer: Dmytro Sen <ds...@apache.org>
Committed: Tue Sep 26 11:48:22 2017 +0300

----------------------------------------------------------------------
 .../main/resources/common-services/HDFS/2.1.0.2.0/widgets.json   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/398690ac/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
index 39c6c0e..57d11b8 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/widgets.json
@@ -346,7 +346,7 @@
           "values": [
             {
               "name": "HDFS Bytes Read",
-              "value": "${dfs.datanode.BytesRead}"
+              "value": "${dfs.datanode.BytesRead}/1024"
             }
           ],
           "properties": {
@@ -370,7 +370,7 @@
           "values": [
             {
               "name": "HDFS Bytes Written",
-              "value": "${dfs.datanode.BytesWritten}"
+              "value": "${dfs.datanode.BytesWritten}/1024"
             }
           ],
           "properties": {


[25/50] [abbrv] ambari git commit: AMBARI-22050. Infra Manager jobs should handle their own configuration (mgergely)

Posted by ao...@apache.org.
AMBARI-22050. Infra Manager jobs should handle their own configuration (mgergely)

Change-Id: I035c439bbe72e27efba87943bea5651ca8da4806


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/af0db350
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/af0db350
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/af0db350

Branch: refs/heads/branch-3.0-perf
Commit: af0db3509add0c4df4d6d2f70a4b70af9fcfa484
Parents: 398690a
Author: Miklos Gergely <mg...@hortonworks.com>
Authored: Tue Sep 26 11:15:47 2017 +0200
Committer: Miklos Gergely <mg...@hortonworks.com>
Committed: Tue Sep 26 11:16:00 2017 +0200

----------------------------------------------------------------------
 .../conf/batch/InfraManagerBatchConfig.java     |  86 ---------------
 .../infra/job/dummy/DummyJobConfiguration.java  | 108 +++++++++++++++++++
 2 files changed, 108 insertions(+), 86 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/af0db350/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/batch/InfraManagerBatchConfig.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/batch/InfraManagerBatchConfig.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/batch/InfraManagerBatchConfig.java
index 98a4901..b1169b4 100644
--- a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/batch/InfraManagerBatchConfig.java
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/batch/InfraManagerBatchConfig.java
@@ -18,11 +18,6 @@
  */
 package org.apache.ambari.infra.conf.batch;
 
-import org.apache.ambari.infra.job.dummy.DummyItemProcessor;
-import org.apache.ambari.infra.job.dummy.DummyItemWriter;
-import org.apache.ambari.infra.job.dummy.DummyJobListener;
-import org.apache.ambari.infra.job.dummy.DummyObject;
-import org.apache.ambari.infra.job.dummy.DummyStepListener;
 import org.springframework.batch.admin.service.JdbcSearchableJobExecutionDao;
 import org.springframework.batch.admin.service.JdbcSearchableJobInstanceDao;
 import org.springframework.batch.admin.service.JdbcSearchableStepExecutionDao;
@@ -31,12 +26,8 @@ import org.springframework.batch.admin.service.SearchableJobExecutionDao;
 import org.springframework.batch.admin.service.SearchableJobInstanceDao;
 import org.springframework.batch.admin.service.SearchableStepExecutionDao;
 import org.springframework.batch.admin.service.SimpleJobService;
-import org.springframework.batch.core.Job;
-import org.springframework.batch.core.Step;
 import org.springframework.batch.core.configuration.JobRegistry;
 import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
-import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
-import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
 import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor;
 import org.springframework.batch.core.explore.JobExplorer;
 import org.springframework.batch.core.launch.JobLauncher;
@@ -49,22 +40,10 @@ import org.springframework.batch.core.repository.dao.ExecutionContextDao;
 import org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer;
 import org.springframework.batch.core.repository.dao.JdbcExecutionContextDao;
 import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
-import org.springframework.batch.item.ItemProcessor;
-import org.springframework.batch.item.ItemReader;
-import org.springframework.batch.item.ItemWriter;
-import org.springframework.batch.item.file.FlatFileItemReader;
-import org.springframework.batch.item.file.LineMapper;
-import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
-import org.springframework.batch.item.file.mapping.DefaultLineMapper;
-import org.springframework.batch.item.file.mapping.FieldSetMapper;
-import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
-import org.springframework.batch.item.file.transform.LineTokenizer;
 import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 import org.springframework.core.task.SimpleAsyncTaskExecutor;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -104,12 +83,6 @@ public class InfraManagerBatchConfig {
   private String databasePassword;
 
   @Inject
-  private StepBuilderFactory steps;
-
-  @Inject
-  private JobBuilderFactory jobs;
-
-  @Inject
   private JobRegistry jobRegistry;
 
   @Inject
@@ -231,63 +204,4 @@ public class InfraManagerBatchConfig {
       SimpleJobService(searchableJobInstanceDao(), searchableJobExecutionDao(), searchableStepExecutionDao(),
       jobRepository(), jobLauncher(), jobRegistry, executionContextDao());
   }
-
-  @Bean(name = "dummyStep")
-  protected Step dummyStep(ItemReader<DummyObject> reader,
-                       ItemProcessor<DummyObject, String> processor,
-                       ItemWriter<String> writer) {
-    return steps.get("dummyStep").listener(new DummyStepListener()).<DummyObject, String> chunk(2)
-      .reader(reader).processor(processor).writer(writer).build();
-  }
-
-  @Bean(name = "dummyJob")
-  public Job job(@Qualifier("dummyStep") Step dummyStep) {
-    return jobs.get("dummyJob").listener(new DummyJobListener()).start(dummyStep).build();
-  }
-
-  @Bean
-  public ItemReader<DummyObject> dummyItemReader() {
-    FlatFileItemReader<DummyObject> csvFileReader = new FlatFileItemReader<>();
-    csvFileReader.setResource(new ClassPathResource("dummy/dummy.txt"));
-    csvFileReader.setLinesToSkip(1);
-    LineMapper<DummyObject> lineMapper = dummyLineMapper();
-    csvFileReader.setLineMapper(lineMapper);
-    return csvFileReader;
-  }
-
-  @Bean
-  public ItemProcessor<DummyObject, String> dummyItemProcessor() {
-    return new DummyItemProcessor();
-  }
-
-  @Bean
-  public ItemWriter<String> dummyItemWriter() {
-    return new DummyItemWriter();
-  }
-
-  private LineMapper<DummyObject> dummyLineMapper() {
-    DefaultLineMapper<DummyObject> lineMapper = new DefaultLineMapper<>();
-
-    LineTokenizer dummyTokenizer = dummyTokenizer();
-    lineMapper.setLineTokenizer(dummyTokenizer);
-
-    FieldSetMapper<DummyObject> dummyFieldSetMapper = dummyFieldSetMapper();
-    lineMapper.setFieldSetMapper(dummyFieldSetMapper);
-
-    return lineMapper;
-  }
-
-  private FieldSetMapper<DummyObject> dummyFieldSetMapper() {
-    BeanWrapperFieldSetMapper<DummyObject> studentInformationMapper = new BeanWrapperFieldSetMapper<>();
-    studentInformationMapper.setTargetType(DummyObject.class);
-    return studentInformationMapper;
-  }
-
-  private LineTokenizer dummyTokenizer() {
-    DelimitedLineTokenizer studentLineTokenizer = new DelimitedLineTokenizer();
-    studentLineTokenizer.setDelimiter(",");
-    studentLineTokenizer.setNames(new String[]{"f1", "f2"});
-    return studentLineTokenizer;
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/af0db350/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyJobConfiguration.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyJobConfiguration.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyJobConfiguration.java
new file mode 100644
index 0000000..a4f5369
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyJobConfiguration.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ambari.infra.job.dummy;
+
+import javax.inject.Inject;
+
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.Step;
+import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
+import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
+import org.springframework.batch.item.ItemProcessor;
+import org.springframework.batch.item.ItemReader;
+import org.springframework.batch.item.ItemWriter;
+import org.springframework.batch.item.file.FlatFileItemReader;
+import org.springframework.batch.item.file.LineMapper;
+import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
+import org.springframework.batch.item.file.mapping.DefaultLineMapper;
+import org.springframework.batch.item.file.mapping.FieldSetMapper;
+import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
+import org.springframework.batch.item.file.transform.LineTokenizer;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+
+@Configuration
+public class DummyJobConfiguration {
+  @Inject
+  private StepBuilderFactory steps;
+
+  @Inject
+  private JobBuilderFactory jobs;
+  
+  @Bean(name = "dummyStep")
+  protected Step dummyStep(ItemReader<DummyObject> reader,
+                       ItemProcessor<DummyObject, String> processor,
+                       @Qualifier("dummyItemWriter") ItemWriter<String> writer) {
+    return steps.get("dummyStep").listener(new DummyStepListener()).<DummyObject, String> chunk(2)
+      .reader(reader).processor(processor).writer(writer).build();
+  }
+
+  @Bean(name = "dummyJob")
+  public Job job(@Qualifier("dummyStep") Step dummyStep) {
+    return jobs.get("dummyJob").listener(new DummyJobListener()).start(dummyStep).build();
+  }
+
+  @Bean
+  public ItemReader<DummyObject> dummyItemReader() {
+    FlatFileItemReader<DummyObject> csvFileReader = new FlatFileItemReader<>();
+    csvFileReader.setResource(new ClassPathResource("dummy/dummy.txt"));
+    csvFileReader.setLinesToSkip(1);
+    LineMapper<DummyObject> lineMapper = dummyLineMapper();
+    csvFileReader.setLineMapper(lineMapper);
+    return csvFileReader;
+  }
+
+  @Bean
+  public ItemProcessor<DummyObject, String> dummyItemProcessor() {
+    return new DummyItemProcessor();
+  }
+
+  @Bean(name = "dummyItemWriter")
+  public ItemWriter<String> dummyItemWriter() {
+    return new DummyItemWriter();
+  }
+
+  private LineMapper<DummyObject> dummyLineMapper() {
+    DefaultLineMapper<DummyObject> lineMapper = new DefaultLineMapper<>();
+
+    LineTokenizer dummyTokenizer = dummyTokenizer();
+    lineMapper.setLineTokenizer(dummyTokenizer);
+
+    FieldSetMapper<DummyObject> dummyFieldSetMapper = dummyFieldSetMapper();
+    lineMapper.setFieldSetMapper(dummyFieldSetMapper);
+
+    return lineMapper;
+  }
+
+  private FieldSetMapper<DummyObject> dummyFieldSetMapper() {
+    BeanWrapperFieldSetMapper<DummyObject> studentInformationMapper = new BeanWrapperFieldSetMapper<>();
+    studentInformationMapper.setTargetType(DummyObject.class);
+    return studentInformationMapper;
+  }
+
+  private LineTokenizer dummyTokenizer() {
+    DelimitedLineTokenizer studentLineTokenizer = new DelimitedLineTokenizer();
+    studentLineTokenizer.setDelimiter(",");
+    studentLineTokenizer.setNames(new String[]{"f1", "f2"});
+    return studentLineTokenizer;
+  }
+}


[39/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
index f890e17,a1415703..654067b
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
@@@ -19,112 -19,116 +19,114 @@@
  package org.apache.ambari.server.controller.internal;
  
   import static org.easymock.EasyMock.anyLong;
-  import static org.easymock.EasyMock.anyObject;
-  import static org.easymock.EasyMock.capture;
-  import static org.easymock.EasyMock.createMock;
-  import static org.easymock.EasyMock.createNiceMock;
-  import static org.easymock.EasyMock.eq;
-  import static org.easymock.EasyMock.expect;
-  import static org.easymock.EasyMock.expectLastCall;
-  import static org.easymock.EasyMock.replay;
-  import static org.easymock.EasyMock.verify;
- 
-  import java.io.File;
-  import java.io.FileInputStream;
-  import java.lang.reflect.Field;
-  import java.sql.SQLException;
-  import java.util.ArrayList;
-  import java.util.Arrays;
-  import java.util.Collections;
-  import java.util.HashMap;
-  import java.util.LinkedHashMap;
-  import java.util.LinkedHashSet;
-  import java.util.List;
-  import java.util.Map;
-  import java.util.Properties;
-  import java.util.Set;
- 
-  import org.apache.ambari.annotations.Experimental;
-  import org.apache.ambari.annotations.ExperimentalFeature;
-  import org.apache.ambari.server.AmbariException;
-  import org.apache.ambari.server.H2DatabaseCleaner;
-  import org.apache.ambari.server.Role;
-  import org.apache.ambari.server.actionmanager.ActionManager;
-  import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper;
-  import org.apache.ambari.server.actionmanager.HostRoleCommand;
-  import org.apache.ambari.server.actionmanager.Stage;
-  import org.apache.ambari.server.actionmanager.StageFactory;
-  import org.apache.ambari.server.agent.CommandReport;
-  import org.apache.ambari.server.agent.ExecutionCommand;
-  import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
-  import org.apache.ambari.server.api.services.AmbariMetaInfo;
-  import org.apache.ambari.server.configuration.Configuration;
-  import org.apache.ambari.server.controller.AmbariManagementController;
-  import org.apache.ambari.server.controller.ExecuteActionRequest;
-  import org.apache.ambari.server.controller.RequestStatusResponse;
-  import org.apache.ambari.server.controller.ResourceProviderFactory;
-  import org.apache.ambari.server.controller.spi.Request;
-  import org.apache.ambari.server.controller.spi.RequestStatus;
-  import org.apache.ambari.server.controller.spi.Resource;
-  import org.apache.ambari.server.controller.spi.ResourceProvider;
-  import org.apache.ambari.server.controller.utilities.PropertyHelper;
-  import org.apache.ambari.server.orm.GuiceJpaInitializer;
-  import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
-  import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
-  import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
-  import org.apache.ambari.server.orm.dao.HostVersionDAO;
-  import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
-  import org.apache.ambari.server.orm.dao.ResourceTypeDAO;
-  import org.apache.ambari.server.orm.dao.StackDAO;
-  import org.apache.ambari.server.orm.entities.ClusterEntity;
-  import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
-  import org.apache.ambari.server.orm.entities.HostVersionEntity;
-  import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
-  import org.apache.ambari.server.orm.entities.ResourceEntity;
-  import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
-  import org.apache.ambari.server.orm.entities.StackEntity;
-  import org.apache.ambari.server.orm.entities.UpgradeEntity;
-  import org.apache.ambari.server.security.TestAuthenticationFactory;
-  import org.apache.ambari.server.security.authorization.AuthorizationException;
-  import org.apache.ambari.server.security.authorization.ResourceType;
-  import org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction;
-  import org.apache.ambari.server.state.Cluster;
-  import org.apache.ambari.server.state.Clusters;
-  import org.apache.ambari.server.state.ConfigHelper;
-  import org.apache.ambari.server.state.Host;
-  import org.apache.ambari.server.state.MaintenanceState;
-  import org.apache.ambari.server.state.RepositoryType;
-  import org.apache.ambari.server.state.RepositoryVersionState;
-  import org.apache.ambari.server.state.Service;
-  import org.apache.ambari.server.state.ServiceComponent;
-  import org.apache.ambari.server.state.ServiceComponentHost;
-  import org.apache.ambari.server.state.ServiceInfo;
-  import org.apache.ambari.server.state.ServiceOsSpecific;
-  import org.apache.ambari.server.state.StackId;
-  import org.apache.ambari.server.state.cluster.ClusterImpl;
-  import org.apache.ambari.server.state.stack.upgrade.Direction;
-  import org.apache.ambari.server.topology.TopologyManager;
-  import org.apache.ambari.server.utils.StageUtils;
-  import org.apache.commons.io.IOUtils;
-  import org.easymock.Capture;
-  import org.easymock.EasyMock;
-  import org.easymock.IAnswer;
-  import org.junit.After;
-  import org.junit.Assert;
-  import org.junit.Before;
-  import org.junit.Ignore;
-  import org.junit.Test;
-  import org.springframework.security.core.Authentication;
-  import org.springframework.security.core.context.SecurityContextHolder;
- 
-  import com.google.gson.JsonArray;
-  import com.google.gson.JsonObject;
-  import com.google.gson.JsonParser;
-  import com.google.inject.AbstractModule;
-  import com.google.inject.Guice;
-  import com.google.inject.Injector;
-  import com.google.inject.util.Modules;
+ import static org.easymock.EasyMock.anyObject;
+ import static org.easymock.EasyMock.capture;
+ import static org.easymock.EasyMock.createMock;
+ import static org.easymock.EasyMock.createNiceMock;
+ import static org.easymock.EasyMock.eq;
+ import static org.easymock.EasyMock.expect;
+ import static org.easymock.EasyMock.expectLastCall;
+ import static org.easymock.EasyMock.replay;
+ import static org.easymock.EasyMock.verify;
+ 
+ import java.io.File;
+ import java.io.FileInputStream;
++import java.lang.reflect.Field;
+ import java.sql.SQLException;
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Collection;
+ import java.util.Collections;
+ import java.util.HashMap;
+ import java.util.LinkedHashMap;
+ import java.util.LinkedHashSet;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Properties;
+ import java.util.Set;
+ 
+ import org.apache.ambari.annotations.Experimental;
+ import org.apache.ambari.annotations.ExperimentalFeature;
+ import org.apache.ambari.server.AmbariException;
+ import org.apache.ambari.server.H2DatabaseCleaner;
+ import org.apache.ambari.server.Role;
+ import org.apache.ambari.server.actionmanager.ActionManager;
+ import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper;
+ import org.apache.ambari.server.actionmanager.HostRoleCommand;
+ import org.apache.ambari.server.actionmanager.Stage;
+ import org.apache.ambari.server.actionmanager.StageFactory;
+ import org.apache.ambari.server.agent.CommandRepository;
+ import org.apache.ambari.server.agent.ExecutionCommand;
+ import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
+ import org.apache.ambari.server.api.services.AmbariMetaInfo;
+ import org.apache.ambari.server.configuration.Configuration;
+ import org.apache.ambari.server.controller.AmbariManagementController;
+ import org.apache.ambari.server.controller.ExecuteActionRequest;
+ import org.apache.ambari.server.controller.RequestStatusResponse;
+ import org.apache.ambari.server.controller.ResourceProviderFactory;
+ import org.apache.ambari.server.controller.spi.Predicate;
+ import org.apache.ambari.server.controller.spi.Request;
+ import org.apache.ambari.server.controller.spi.RequestStatus;
+ import org.apache.ambari.server.controller.spi.Resource;
 -import org.apache.ambari.server.controller.spi.Resource.Type;
+ import org.apache.ambari.server.controller.spi.ResourceProvider;
+ import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+ import org.apache.ambari.server.controller.utilities.PropertyHelper;
+ import org.apache.ambari.server.orm.GuiceJpaInitializer;
+ import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+ import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
+ import org.apache.ambari.server.orm.dao.HostVersionDAO;
+ import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+ import org.apache.ambari.server.orm.entities.ClusterEntity;
+ import org.apache.ambari.server.orm.entities.HostVersionEntity;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+ import org.apache.ambari.server.orm.entities.StackEntity;
+ import org.apache.ambari.server.orm.entities.UpgradeEntity;
+ import org.apache.ambari.server.security.TestAuthenticationFactory;
+ import org.apache.ambari.server.security.authorization.AuthorizationException;
+ import org.apache.ambari.server.state.Cluster;
+ import org.apache.ambari.server.state.Clusters;
+ import org.apache.ambari.server.state.ConfigHelper;
+ import org.apache.ambari.server.state.Host;
+ import org.apache.ambari.server.state.MaintenanceState;
+ import org.apache.ambari.server.state.RepositoryType;
+ import org.apache.ambari.server.state.RepositoryVersionState;
+ import org.apache.ambari.server.state.Service;
+ import org.apache.ambari.server.state.ServiceComponent;
+ import org.apache.ambari.server.state.ServiceComponentHost;
+ import org.apache.ambari.server.state.ServiceInfo;
+ import org.apache.ambari.server.state.ServiceOsSpecific;
+ import org.apache.ambari.server.state.StackId;
+ import org.apache.ambari.server.state.StackInfo;
+ import org.apache.ambari.server.state.cluster.ClusterImpl;
+ import org.apache.ambari.server.state.repository.AvailableService;
+ import org.apache.ambari.server.state.repository.VersionDefinitionXml;
+ import org.apache.ambari.server.state.stack.upgrade.Direction;
+ import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
+ import org.apache.ambari.server.topology.TopologyManager;
+ import org.apache.ambari.server.utils.StageUtils;
+ import org.apache.commons.io.IOUtils;
+ import org.apache.commons.lang.StringUtils;
+ import org.easymock.Capture;
+ import org.easymock.EasyMock;
+ import org.easymock.IAnswer;
+ import org.junit.After;
+ import org.junit.Assert;
+ import org.junit.Before;
+ import org.junit.Test;
+ import org.springframework.security.core.Authentication;
+ import org.springframework.security.core.context.SecurityContextHolder;
+ 
+ import com.google.common.collect.ImmutableMap;
 -import com.google.common.collect.Lists;
+ import com.google.common.collect.Sets;
+ import com.google.gson.JsonArray;
+ import com.google.gson.JsonObject;
+ import com.google.gson.JsonParser;
+ import com.google.inject.AbstractModule;
+ import com.google.inject.Guice;
+ import com.google.inject.Injector;
++import com.google.inject.Provider;
+ import com.google.inject.util.Modules;
  
 -import junit.framework.AssertionFailedError;
 -
  
   /**
   * ClusterStackVersionResourceProvider tests.
@@@ -177,8 -182,11 +176,7 @@@ public class ClusterStackVersionResourc
              String.valueOf(MAX_TASKS_PER_STAGE));
      configuration = new Configuration(properties);
      stageFactory = createNiceMock(StageFactory.class);
-     clusterVersionDAO = createNiceMock(ClusterVersionDAO.class);
  
 -    clusters = createNiceMock(Clusters.class);
 -    actionManager = createNiceMock(ActionManager.class);
 -    managementController = createMock(AmbariManagementController.class);
 -
      // Initialize injector
      injector = Guice.createInjector(Modules.override(inMemoryModule).with(new MockModule()));
      injector.getInstance(GuiceJpaInitializer.class);
@@@ -280,12 -281,10 +288,12 @@@
      expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
      expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
      expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
--            EasyMock.<Map<String, String>>anyObject(), anyObject(String.class))).
 -            andReturn(packages).anyTimes();
 -    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
 -      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
++            EasyMock.anyObject(), anyObject(String.class))).
 +            andReturn(packages).times((hostCount - 1) * 2); // 1 host has no versionable components, other hosts have 2 services
 +//            // that's why we don't send commands to it
 +
-     expect(resourceProviderFactory.getHostResourceProvider(EasyMock.<Set<String>>anyObject(), EasyMock.<Map<Resource.Type, String>>anyObject(),
++    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
 +            eq(managementController))).andReturn(csvResourceProvider).anyTimes();
  
      expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
      expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
@@@ -347,20 -346,14 +355,18 @@@
      StageUtils.setTopologyManager(injector.getInstance(TopologyManager.class));
      StageUtils.setConfiguration(injector.getInstance(Configuration.class));
  
-     expect(clusterVersionDAO.findByCluster(anyObject(String.class))).andReturn(Collections.<ClusterVersionEntity>emptyList()).once();
 -    ResourceProvider provider = createProvider(managementController);
 -    injector.injectMembers(provider);
--
      // replay
 -    replay(managementController, response, clusters,
 +    replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider,
              cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager,
-             executionCommand, executionCommandWrapper,stage, stageFactory, clusterVersionDAO);
+             executionCommand, executionCommandWrapper,stage, stageFactory);
  
 +    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
 +        type,
 +        PropertyHelper.getPropertyIds(type),
 +        PropertyHelper.getKeyPropertyIds(type),
 +        managementController);
 +
 +    injector.injectMembers(provider);
  
      // add the property map to a set for the request.  add more maps for multiple creates
      Set<Map<String, Object>> propertySet = new LinkedHashSet<>();
@@@ -717,12 -700,16 +717,12 @@@
      expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
      expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
      expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
-             EasyMock.<Map<String, String>>anyObject(), anyObject(String.class))).
+             EasyMock.anyObject(), anyObject(String.class))).
              andReturn(packages).anyTimes(); // only one host has the versionable component
  
-     expect(resourceProviderFactory.getHostResourceProvider(EasyMock.<Set<String>>anyObject(), EasyMock.<Map<Resource.Type, String>>anyObject(),
+     expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
              eq(managementController))).andReturn(csvResourceProvider).anyTimes();
  
 -    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
 -      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
 -
 -
      expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
      expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
          hostsForCluster).anyTimes();
@@@ -796,14 -779,9 +792,14 @@@
      // replay
      replay(managementController, response, clusters, hdfsService, hbaseService, resourceProviderFactory, csvResourceProvider,
              cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schHBM, actionManager,
-             executionCommandWrapper,stage, stageFactory, clusterVersionDAO);
+             executionCommandWrapper,stage, stageFactory);
  
 -    ResourceProvider provider = createProvider(managementController);
 +    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
 +        type,
 +        PropertyHelper.getPropertyIds(type),
 +        PropertyHelper.getKeyPropertyIds(type),
 +        managementController);
 +
      injector.injectMembers(provider);
  
      // add the property map to a set for the request.  add more maps for multiple creates
@@@ -949,11 -933,11 +958,11 @@@
      expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
      expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
      expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
-             EasyMock.<Map<String, String>>anyObject(), anyObject(String.class))).
+             EasyMock.anyObject(), anyObject(String.class))).
              andReturn(packages).anyTimes(); // only one host has the versionable component
  
-     expect(resourceProviderFactory.getHostResourceProvider(EasyMock.<Set<String>>anyObject(), EasyMock.<Map<Resource.Type, String>>anyObject(),
 -    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
 -    .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
++    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
 +            eq(managementController))).andReturn(csvResourceProvider).anyTimes();
  
      expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
      expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
@@@ -978,7 -962,9 +987,10 @@@
        }
      }).anyTimes();
  
+     expect(cluster.transitionHostsToInstalling(anyObject(RepositoryVersionEntity.class),
+         anyObject(VersionDefinitionXml.class), eq(false))).andReturn(hostsNeedingInstallCommands).atLeastOnce();
+ 
 +//    ExecutionCommand executionCommand = createNiceMock(ExecutionCommand.class);
      ExecutionCommand executionCommand = new ExecutionCommand();
      ExecutionCommandWrapper executionCommandWrapper = createNiceMock(ExecutionCommandWrapper.class);
  
@@@ -1022,19 -1001,12 +1028,17 @@@
      StageUtils.setTopologyManager(injector.getInstance(TopologyManager.class));
      StageUtils.setConfiguration(injector.getInstance(Configuration.class));
  
-     expect(clusterVersionDAO.findByCluster(anyObject(String.class))).andReturn(Collections.<ClusterVersionEntity>emptyList()).once();
- 
      // replay
 -    replay(managementController, response, clusters, hdfsService, hbaseService, csvResourceProvider,
 +    replay(managementController, response, clusters, hdfsService, hbaseService, resourceProviderFactory, csvResourceProvider,
              cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schHBM, actionManager,
-             executionCommandWrapper,stage, stageFactory, clusterVersionDAO);
+             executionCommandWrapper,stage, stageFactory);
  
 -    ResourceProvider provider = createProvider(managementController);
 +    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
 +        type,
 +        PropertyHelper.getPropertyIds(type),
 +        PropertyHelper.getKeyPropertyIds(type),
 +        managementController);
 +
      injector.injectMembers(provider);
  
      // add the property map to a set for the request.  add more maps for multiple creates
@@@ -1482,12 -1147,11 +1194,12 @@@
      expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
      expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
      expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
--            EasyMock.<Map<String, String>>anyObject(), anyObject(String.class))).
 -            andReturn(packages).anyTimes();
++            EasyMock.anyObject(), anyObject(String.class))).
 +            andReturn(packages).times((hostCount - 1) * 2); // 1 host has no versionable components, other hosts have 2 services
 +//            // that's why we don't send commands to it
  
-     expect(resourceProviderFactory.getHostResourceProvider(EasyMock.<Set<String>>anyObject(), EasyMock.<Map<Resource.Type, String>>anyObject(),
 -    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
 -      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
++    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
 +            eq(managementController))).andReturn(csvResourceProvider).anyTimes();
  
      expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
      expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
@@@ -1549,26 -1215,13 +1263,18 @@@
      StageUtils.setConfiguration(injector.getInstance(Configuration.class));
  
  
-     // !!! make it look like there is already a versioned installed that is less than the one being installed
-     ClusterVersionEntity bad = new ClusterVersionEntity();
-     RepositoryVersionEntity badRve = new RepositoryVersionEntity();
-     badRve.setStack(stack);
-     badRve.setVersion("2.2.1.0-1000");
-     bad.setRepositoryVersion(badRve);
- 
-     expect(clusterVersionDAO.findByCluster(anyObject(String.class))).andReturn(Collections.singletonList(bad)).once();
  
      // replay
 -    replay(managementController, response, clusters,
 +    replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider,
              cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager,
-             executionCommand, executionCommandWrapper,stage, stageFactory, clusterVersionDAO);
+             executionCommand, executionCommandWrapper,stage, stageFactory);
  
 -    ResourceProvider provider = createProvider(managementController);
 +    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
 +        type,
 +        PropertyHelper.getPropertyIds(type),
 +        PropertyHelper.getKeyPropertyIds(type),
 +        managementController);
 +
      injector.injectMembers(provider);
  
      // add the property map to a set for the request.  add more maps for multiple creates
@@@ -1749,12 -1392,9 +1450,12 @@@
      // replay
      replay(managementController, response, clusters, hdfsService, resourceProviderFactory,
          csvResourceProvider, cluster, repositoryVersionDAOMock, configHelper, schDatanode,
-         stageFactory, clusterVersionDAO, hostVersionDAO);
+         stageFactory, hostVersionDAO);
  
 -    ResourceProvider provider = createProvider(managementController);
 +    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type,
 +        PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
 +        managementController);
 +
      injector.injectMembers(provider);
  
      // add the property map to a set for the request. add more maps for multiple
@@@ -1796,12 -1436,401 +1497,419 @@@
      verify(managementController, response, clusters, cluster, hostVersionDAO);
     }
  
+   @Test
+   public void testCreateResourcesPPC() throws Exception {
++    Resource.Type type = Resource.Type.ClusterStackVersion;
++
++    AmbariManagementController managementController = createMock(AmbariManagementController.class);
++    Clusters clusters = createNiceMock(Clusters.class);
+     Cluster cluster = createNiceMock(Cluster.class);
+     Map<String, String> hostLevelParams = new HashMap<>();
+     StackId stackId = new StackId("HDP", "2.0.1");
+ 
+     RepositoryVersionHelper rvh = new RepositoryVersionHelper();
+ 
+     RepositoryVersionEntity repoVersion = createNiceMock(RepositoryVersionEntity.class);
+     expect(repoVersion.getId()).andReturn(1L).anyTimes();
+     expect(repoVersion.getStackId()).andReturn(new StackId("HDP-2.1.1")).anyTimes();
+ 
+ 
+     String os_json = "[\n" +
+         "   {\n" +
+         "      \"repositories\":[\n" +
+         "         {\n" +
+         "            \"Repositories/base_url\":\"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos-ppc7/2.x/updates/2.2.0.0\",\n" +
+         "            \"Repositories/repo_name\":\"HDP-UTILS\",\n" +
+         "            \"Repositories/repo_id\":\"HDP-UTILS-1.1.0.20\"\n" +
+         "         },\n" +
+         "         {\n" +
+         "            \"Repositories/base_url\":\"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos-ppc7/2.x/updates/2.2.0.0\",\n" +
+         "            \"Repositories/repo_name\":\"HDP\",\n" +
+         "            \"Repositories/repo_id\":\"HDP-2.2\"\n" +
+         "         }\n" +
+         "      ],\n" +
+         "      \"OperatingSystems/os_type\":\"redhat-ppc7\"\n" +
+         "   }\n" +
+         "]";
+     expect(repoVersion.getOperatingSystems()).andReturn(rvh.parseOperatingSystems(os_json)).anyTimes();
+     expect(repoVersion.getType()).andReturn(RepositoryType.STANDARD).anyTimes();
+ 
+     Map<String, Host> hostsForCluster = new HashMap<>();
+     int hostCount = 2;
+     for (int i = 0; i < hostCount; i++) {
+       String hostname = "host" + i;
+       Host host = createNiceMock(hostname, Host.class);
+       expect(host.getHostName()).andReturn(hostname).anyTimes();
+       expect(host.getOsFamily()).andReturn("redhat-ppc7").anyTimes();
+       expect(host.getMaintenanceState(EasyMock.anyLong())).andReturn(
+           MaintenanceState.OFF).anyTimes();
+       expect(host.getAllHostVersions()).andReturn(
+           Collections.<HostVersionEntity>emptyList()).anyTimes();
+       expect(host.getHostAttributes()).andReturn(
+           ImmutableMap.<String, String>builder()
+             .put("os_family", "redhat-ppc")
+             .put("os_release_version", "7.2")
+             .build()
+           ).anyTimes();
+       replay(host);
+       hostsForCluster.put(hostname, host);
+     }
+ 
+     final ServiceComponentHost schDatanode = createMock(ServiceComponentHost.class);
+     expect(schDatanode.getServiceName()).andReturn("HDFS").anyTimes();
+     expect(schDatanode.getServiceComponentName()).andReturn("DATANODE").anyTimes();
+     final ServiceComponentHost schNamenode = createMock(ServiceComponentHost.class);
+     expect(schNamenode.getServiceName()).andReturn("HDFS").anyTimes();
+     expect(schNamenode.getServiceComponentName()).andReturn("NAMENODE").anyTimes();
+     final ServiceComponentHost schAMS = createMock(ServiceComponentHost.class);
+     expect(schAMS.getServiceName()).andReturn("AMBARI_METRICS").anyTimes();
+     expect(schAMS.getServiceComponentName()).andReturn("METRICS_COLLECTOR").anyTimes();
+     // First host contains versionable components
 -    final List<ServiceComponentHost> schsH1 = Lists.newArrayList(schDatanode, schNamenode, schAMS);
++    final List<ServiceComponentHost> schsH1 = new ArrayList<ServiceComponentHost>(){{
++      add(schDatanode);
++      add(schNamenode);
++      add(schAMS);
++    }};
+     // Second host does not contain versionable components
 -    final List<ServiceComponentHost> schsH2 = Lists.newArrayList(schAMS);
++    final List<ServiceComponentHost> schsH2 = new ArrayList<ServiceComponentHost>(){{
++      add(schAMS);
++    }};
++
+ 
+     ServiceOsSpecific.Package hdfsPackage = new ServiceOsSpecific.Package();
+     hdfsPackage.setName("hdfs");
+     List<ServiceOsSpecific.Package> packages = Collections.singletonList(hdfsPackage);
+ 
+     ActionManager actionManager = createNiceMock(ActionManager.class);
+ 
+     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
+     ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
+     ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class);
+ 
+     AbstractControllerResourceProvider.init(resourceProviderFactory);
+ 
+     Map<String, Map<String, String>> hostConfigTags = new HashMap<>();
+     expect(configHelper.getEffectiveDesiredTags(anyObject(ClusterImpl.class), anyObject(String.class))).andReturn(hostConfigTags);
+ 
+     expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+     expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+     expect(managementController.getAuthName()).andReturn("admin").anyTimes();
+     expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
+     expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
+     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
+             (Map<String, String>) anyObject(List.class), anyObject(String.class))).
 -            andReturn(packages).anyTimes();
 -
 -    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
 -      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
 -
++            andReturn(packages).anyTimes(); // 1 host has no versionable components, other hosts have 2 services
++  //            // that's why we don't send commands to it
+ 
+     expect(resourceProviderFactory.getHostResourceProvider(anyObject(Set.class), anyObject(Map.class),
+             eq(managementController))).andReturn(csvResourceProvider).anyTimes();
+ 
+     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
+     expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
+         hostsForCluster).anyTimes();
+ 
+     String clusterName = "Cluster100";
+     expect(cluster.getClusterId()).andReturn(1L).anyTimes();
+     expect(cluster.getHosts()).andReturn(hostsForCluster.values()).atLeastOnce();
+     expect(cluster.getServices()).andReturn(new HashMap<String, Service>()).anyTimes();
+     expect(cluster.getCurrentStackVersion()).andReturn(stackId);
+     expect(cluster.getServiceComponentHosts(anyObject(String.class))).andAnswer(new IAnswer<List<ServiceComponentHost>>() {
+       @Override
+       public List<ServiceComponentHost> answer() throws Throwable {
+         String hostname = (String) EasyMock.getCurrentArguments()[0];
+         if (hostname.equals("host2")) {
+           return schsH2;
+         } else {
+           return schsH1;
+         }
+       }
+     }).anyTimes();
+     expect(cluster.transitionHostsToInstalling(
+         anyObject(RepositoryVersionEntity.class),
+         anyObject(VersionDefinitionXml.class),
+         EasyMock.anyBoolean())).andReturn(new ArrayList<>(hostsForCluster.values())).anyTimes();
+ 
+ 
+     ExecutionCommand executionCommand = createNiceMock(ExecutionCommand.class);
+     ExecutionCommandWrapper executionCommandWrapper = createNiceMock(ExecutionCommandWrapper.class);
+ 
+     expect(executionCommandWrapper.getExecutionCommand()).andReturn(executionCommand).anyTimes();
+ 
+     Stage stage = createNiceMock(Stage.class);
+     expect(stage.getExecutionCommandWrapper(anyObject(String.class), anyObject(String.class))).
+             andReturn(executionCommandWrapper).anyTimes();
+ 
+     expect(executionCommand.getHostLevelParams()).andReturn(hostLevelParams).anyTimes();
+ 
+     Map<Role, Float> successFactors = new HashMap<>();
+     expect(stage.getSuccessFactors()).andReturn(successFactors).atLeastOnce();
+ 
+     // Check that we create proper stage count
+     expect(stageFactory.createNew(anyLong(), anyObject(String.class),
+             anyObject(String.class), anyLong(),
+             anyObject(String.class), anyObject(String.class),
+             anyObject(String.class))).andReturn(stage).
+             times((int) Math.ceil(hostCount / MAX_TASKS_PER_STAGE));
+ 
+     expect(
+             repositoryVersionDAOMock.findByStackAndVersion(
+                     anyObject(StackId.class),
+                     anyObject(String.class))).andReturn(repoVersion);
+ 
+     expect(actionManager.getRequestTasks(anyLong())).andReturn(Collections.<HostRoleCommand>emptyList()).anyTimes();
+ 
+     ClusterEntity clusterEntity = new ClusterEntity();
+     clusterEntity.setClusterId(1l);
+     clusterEntity.setClusterName(clusterName);
+ 
+     StageUtils.setTopologyManager(injector.getInstance(TopologyManager.class));
+     StageUtils.setConfiguration(injector.getInstance(Configuration.class));
+ 
+     // replay
+     replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider,
+             cluster, repoVersion, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager,
+             executionCommand, executionCommandWrapper,stage, stageFactory);
+ 
 -    ResourceProvider provider = createProvider(managementController);
++    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
++        type,
++        PropertyHelper.getPropertyIds(type),
++        PropertyHelper.getKeyPropertyIds(type),
++        managementController);
++
+     injector.injectMembers(provider);
+ 
+     // add the property map to a set for the request.  add more maps for multiple creates
+     Set<Map<String, Object>> propertySet = new LinkedHashSet<>();
+ 
+     Map<String, Object> properties = new LinkedHashMap<>();
+ 
+     // add properties to the request map
+     properties.put(ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID, "Cluster100");
+     properties.put(ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID, "2.2.0.1-885");
+     properties.put(ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_STACK_PROPERTY_ID, "HDP");
+     properties.put(ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID, "2.1.1");
+ 
+     propertySet.add(properties);
+ 
+     // create the request
+     Request request = PropertyHelper.getCreateRequest(propertySet, null);
+ 
+     SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
+ 
+     RequestStatus status = provider.createResources(request);
+     Assert.assertNotNull(status);
+ 
+     // verify
+     verify(managementController, response, clusters, stageFactory, stage);
+ 
+     // check that the success factor was populated in the stage
+     Float successFactor = successFactors.get(Role.INSTALL_PACKAGES);
+     Assert.assertEquals(Float.valueOf(0.85f), successFactor);
+   }
+ 
+   @Test
+   public void testGetSorted() throws Exception {
++
++    Resource.Type type = Resource.Type.ClusterStackVersion;
++
++    final Clusters clusters = createNiceMock(Clusters.class);
+     Cluster cluster = createNiceMock(Cluster.class);
+     StackId stackId = new StackId("HDP", "2.2.0");
+ 
+     StackEntity stackEntity = new StackEntity();
+     stackEntity.setStackName(stackId.getStackName());
+     stackEntity.setStackVersion(stackId.getStackVersion());
+ 
+     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
+     ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
+     ResourceProvider csvResourceProvider = createNiceMock(
+         ClusterStackVersionResourceProvider.class);
+ 
+     AbstractControllerResourceProvider.init(resourceProviderFactory);
+ 
+     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
+ 
+     expect(cluster.getClusterId()).andReturn(1L).anyTimes();
+ 
+     String[] versionStrings = new String[] {
+       "2.1.0.0-15",  // idx 0, sorted to 0
+       "2.1.0.5-17",  // idx 1, sorted to 2
+       "2.1.1.5-19",  // idx 2, sorted to 3
+       "2.1.0.3-14",  // idx 3, sorted to 1
+       "2.1.1.5-74"   // idx 4, sorted to 4
+     };
+ 
+     List<RepositoryVersionEntity> repoVersionList = new ArrayList<>();
+     for (int i = 0; i < versionStrings.length; i++) {
+       Long id = new Long(i);
+ 
+       RepositoryVersionEntity repoVersion = createNiceMock(RepositoryVersionEntity.class);
+       expect(repoVersion.getVersion()).andReturn(versionStrings[i]).anyTimes();
+       expect(repoVersion.getStack()).andReturn(stackEntity).anyTimes();
+       expect(repoVersion.getId()).andReturn(id).anyTimes();
+       expect(repositoryVersionDAOMock.findByPK(id)).andReturn(repoVersion).anyTimes();
+ 
+       repoVersionList.add(repoVersion);
+ 
+       replay(repoVersion);
+     }
+ 
+     expect(repositoryVersionDAOMock.findAll()).andReturn(repoVersionList).atLeastOnce();
+ 
+     expect(hostVersionDAO.findHostVersionByClusterAndRepository(
+         anyLong(), anyObject(RepositoryVersionEntity.class))).andReturn(Collections.<HostVersionEntity>emptyList()).anyTimes();
+ 
+     // replay
+     replay(response, clusters, resourceProviderFactory,
+         csvResourceProvider, cluster, repositoryVersionDAOMock, configHelper,
+         stageFactory, hostVersionDAO);
+ 
 -    ResourceProvider provider = createProvider(managementController);
++    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type,
++        PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
++        /*managementController*/null);
+     injector.injectMembers(provider);
+ 
 -//    Field field = ClusterStackVersionResourceProvider.class.getDeclaredField("clusters");
 -//    field.setAccessible(true);
 -//    field.set(null, new Provider<Clusters>() {
 -//      @Override
 -//      public Clusters get() {
 -//        return clusters;
 -//      }
 -//    });
++    Field field = ClusterStackVersionResourceProvider.class.getDeclaredField("clusters");
++    field.setAccessible(true);
++    field.set(null, new Provider<Clusters>() {
++      @Override
++      public Clusters get() {
++        return clusters;
++      }
++    });
+ 
+     // set the security auth
+     SecurityContextHolder.getContext().setAuthentication(
+         TestAuthenticationFactory.createAdministrator());
+ 
+     Set<String> ids = Sets.newHashSet(
+         ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_STATE_PROPERTY_ID,
+         ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID,
+         ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID);
+ 
+     // get cluster named Cluster100
+     Predicate predicate = new PredicateBuilder()
+         .property(ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100")
+         .toPredicate();
+ 
+     // create the request
+     Request request = PropertyHelper.getReadRequest(ids);
+ 
+     Set<Resource> responses = provider.getResources(request, predicate);
+     Assert.assertNotNull(responses);
+ 
+     // verify
+     verify(response, clusters, cluster, hostVersionDAO);
+ 
+     Assert.assertEquals(5, responses.size());
+ 
+     int i = 0;
+     // see the string array above.  this is the order matching the sorted strings
+     long[] orders = new long[] { 0, 3, 1, 2, 4 };
+     for (Resource res : responses) {
+       Assert.assertEquals(orders[i], res.getPropertyValue(
+           ClusterStackVersionResourceProvider.CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID));
+ 
+       i++;
+     }
+ 
+ 
+   }
+ 
+   @Test
+   public void testCheckPatchVDFAvailableServices() throws Exception {
+     Cluster cluster = createNiceMock(Cluster.class);
+     RepositoryVersionEntity repoVersionEnt = createNiceMock(RepositoryVersionEntity.class);
+     VersionDefinitionXml desiredVersionDefinition = createNiceMock(VersionDefinitionXml.class);
+ 
+     expect(repoVersionEnt.getType()).andReturn(RepositoryType.PATCH).once();
+ 
+     Service service1 = createNiceMock(Service.class);
+     expect(service1.getName()).andReturn("SERVICE1").anyTimes();
+     expect(service1.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>());
+ 
+     Service service2 = createNiceMock(Service.class);
+     expect(service2.getName()).andReturn("SERVICE2").anyTimes();
+     expect(service2.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>());
+ 
+     Map<String, Service> clusterServices = new HashMap<>();
+     clusterServices.put("SERVICE1",service1);
+     clusterServices.put("SERVICE2",service2);
+ 
+     expect(cluster.getServices()).andReturn(clusterServices).once();
+     expect(repoVersionEnt.getStackName()).andReturn("HDP").once();
+     expect(repoVersionEnt.getStackVersion()).andReturn("2.5.0").once();
+ 
+     AvailableService availableService1 = createNiceMock(AvailableService.class);
+     expect(availableService1.getName()).andReturn("SERVICE1").anyTimes();
+ 
+     AvailableService availableService2 = createNiceMock(AvailableService.class);
+     expect(availableService2.getName()).andReturn("SERVICE2").anyTimes();
+ 
+     Collection<AvailableService> availableServices = new ArrayList<>();
+     availableServices.add(availableService1);
+     availableServices.add(availableService2);
+ 
+     expect(desiredVersionDefinition.getAvailableServices((StackInfo)EasyMock.anyObject())).andReturn(availableServices).once();
+ 
 -    expect(cluster.transitionHostsToInstalling(
 -        anyObject(RepositoryVersionEntity.class), anyObject(VersionDefinitionXml.class),
 -        EasyMock.anyBoolean())).andReturn(Collections.<Host>emptyList()).atLeastOnce();
+ 
+     replay(cluster, repoVersionEnt, desiredVersionDefinition, service1, service2, availableService1, availableService2);
+ 
+     ClusterStackVersionResourceProvider provider = new ClusterStackVersionResourceProvider(null);
+     injector.injectMembers(provider);
+     provider.checkPatchVDFAvailableServices(cluster, repoVersionEnt, desiredVersionDefinition);
+   }
+ 
+    @Test
+    public void testCheckPatchVDFAvailableServicesFail() throws Exception {
+      Cluster cluster = createNiceMock(Cluster.class);
+      RepositoryVersionEntity repoVersionEnt = createNiceMock(RepositoryVersionEntity.class);
+      VersionDefinitionXml desiredVersionDefinition = createNiceMock(VersionDefinitionXml.class);
+ 
+      expect(repoVersionEnt.getType()).andReturn(RepositoryType.PATCH).once();
+ 
+      Service service1 = createNiceMock(Service.class);
+      expect(service1.getName()).andReturn("SERVICE1").anyTimes();
+      expect(service1.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>());
+ 
+      Map<String, Service> clusterServices = new HashMap<>();
+      clusterServices.put("SERVICE1",service1);
+ 
+      expect(cluster.getServices()).andReturn(clusterServices).once();
+      expect(repoVersionEnt.getStackName()).andReturn("HDP").once();
+      expect(repoVersionEnt.getStackVersion()).andReturn("2.5.0").once();
+ 
+      AvailableService availableService1 = createNiceMock(AvailableService.class);
+      expect(availableService1.getName()).andReturn("SERVICE1").anyTimes();
+ 
+      AvailableService availableService2 = createNiceMock(AvailableService.class);
+      expect(availableService2.getName()).andReturn("SERVICE2").anyTimes();
+ 
+      Collection<AvailableService> availableServices = new ArrayList<>();
+      availableServices.add(availableService1);
+      availableServices.add(availableService2);
+ 
+      expect(desiredVersionDefinition.getAvailableServices((StackInfo)EasyMock.anyObject())).andReturn(availableServices).once();
 -     expect(cluster.transitionHostsToInstalling(
 -         anyObject(RepositoryVersionEntity.class), anyObject(VersionDefinitionXml.class),
 -         EasyMock.anyBoolean())).andThrow(new AssertionFailedError()).anyTimes();
++
+ 
+      replay(cluster, repoVersionEnt, desiredVersionDefinition, service1, availableService1, availableService2);
+ 
+      ClusterStackVersionResourceProvider provider = new ClusterStackVersionResourceProvider(null);
+      injector.injectMembers(provider);
+      try {
+        provider.checkPatchVDFAvailableServices(cluster, repoVersionEnt, desiredVersionDefinition);
+        Assert.fail("Expected an exception when PATCH VDF includes services that are not installed");
+      } catch (IllegalArgumentException expected) {
+        // !!! expected
+        Assert.assertEquals(expected.getMessage(),"PATCH VDF includes services that are not installed: SERVICE2");
+      }
+    }
  
     private void testCreateResourcesExistingUpgrade(Authentication authentication) throws Exception {
 +    Resource.Type type = Resource.Type.ClusterStackVersion;
 +
 +    AmbariManagementController managementController = createMock(AmbariManagementController.class);
 +    Clusters clusters = createNiceMock(Clusters.class);
      Cluster cluster = createNiceMock(Cluster.class);
  
      expect(managementController.getClusters()).andReturn(clusters).anyTimes();
@@@ -1863,9 -1898,11 +1971,8 @@@
        bind(ConfigHelper.class).toInstance(configHelper);
        bind(Configuration.class).toInstance(configuration);
        bind(StageFactory.class).toInstance(stageFactory);
-       bind(ClusterVersionDAO.class).toInstance(clusterVersionDAO);
        bind(HostVersionDAO.class).toInstance(hostVersionDAO);
        bind(HostComponentStateDAO.class).toInstance(hostComponentStateDAO);
 -      bind(Clusters.class).toInstance(clusters);
 -      bind(ActionManager.class).toInstance(actionManager);
 -      bind(AmbariManagementController.class).toInstance(managementController);
      }
    }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
index 94e1a1e,ca5cde0..6a0ab89
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
@@@ -55,7 -56,7 +54,7 @@@ public class RepositoryResourceProvider
      AmbariManagementController managementController = EasyMock.createMock(AmbariManagementController.class);
  
      RepositoryResponse rr = new RepositoryResponse(VAL_BASE_URL, VAL_OS,
-         VAL_REPO_ID, VAL_REPO_NAME, null, null, null);
 -        VAL_REPO_ID, VAL_REPO_NAME, VAL_DISTRIBUTION, VAL_COMPONENT_NAME, null, null);
++        VAL_REPO_ID, VAL_REPO_NAME, null, null);
      rr.setStackName(VAL_STACK_NAME);
      rr.setStackVersion(VAL_STACK_VERSION);
      Set<RepositoryResponse> allResponse = new HashSet<>();
@@@ -153,7 -168,7 +152,7 @@@
      AmbariManagementController managementController = EasyMock.createMock(AmbariManagementController.class);
  
      RepositoryResponse rr = new RepositoryResponse(VAL_BASE_URL, VAL_OS,
-         VAL_REPO_ID, VAL_REPO_NAME, null, null ,null);
 -        VAL_REPO_ID, VAL_REPO_NAME, null, null, null, null);
++        VAL_REPO_ID, VAL_REPO_NAME, null, null);
      Set<RepositoryResponse> allResponse = new HashSet<>();
      allResponse.add(rr);
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
index bad5854,20730d1..3fa04ba
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
@@@ -856,9 -868,9 +868,9 @@@ public class ServiceResourceProviderTes
      expect(cluster.getService(serviceName)).andReturn(service).anyTimes();
      expect(service.getDesiredState()).andReturn(State.INSTALLED).anyTimes();
      expect(service.getName()).andReturn(serviceName).anyTimes();
-     expect(service.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>());
+     expect(service.getServiceComponents()).andReturn(new HashMap<>());
      expect(service.getCluster()).andReturn(cluster);
 -    cluster.deleteService(serviceName);
 +    cluster.deleteService(serviceName, new DeleteHostComponentStatusMetaData());
  
      // replay
      replay(managementController, clusters, cluster, service);
@@@ -904,9 -916,9 +916,9 @@@
      expect(cluster.getService(serviceName)).andReturn(service).anyTimes();
      expect(service.getDesiredState()).andReturn(State.STARTED).anyTimes();
      expect(service.getName()).andReturn(serviceName).anyTimes();
-     expect(service.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>());
+     expect(service.getServiceComponents()).andReturn(new HashMap<>());
      expect(service.getCluster()).andReturn(cluster);
 -    cluster.deleteService(serviceName);
 +    cluster.deleteService(serviceName, new DeleteHostComponentStatusMetaData());
  
      // replay
      replay(managementController, clusters, cluster, service);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java
index f359fc1,39ab1d7..bb3fa8f
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackUpgradeConfigurationMergeTest.java
@@@ -28,7 -33,7 +33,6 @@@ import org.apache.ambari.server.actionm
  import org.apache.ambari.server.actionmanager.HostRoleCommandFactoryImpl;
  import org.apache.ambari.server.actionmanager.RequestFactory;
  import org.apache.ambari.server.actionmanager.StageFactory;
--import org.apache.ambari.server.api.services.AmbariMetaInfo;
  import org.apache.ambari.server.controller.AbstractRootServiceResponseFactory;
  import org.apache.ambari.server.controller.AmbariManagementController;
  import org.apache.ambari.server.controller.KerberosHelper;
@@@ -50,12 -57,18 +56,15 @@@ import org.apache.ambari.server.state.C
  import org.apache.ambari.server.state.ConfigFactory;
  import org.apache.ambari.server.state.ConfigHelper;
  import org.apache.ambari.server.state.DesiredConfig;
 -import org.apache.ambari.server.state.PropertyInfo;
+ import org.apache.ambari.server.state.RepositoryType;
+ import org.apache.ambari.server.state.Service;
 -import org.apache.ambari.server.state.ServiceComponent;
  import org.apache.ambari.server.state.ServiceComponentFactory;
  import org.apache.ambari.server.state.ServiceComponentHostFactory;
  import org.apache.ambari.server.state.ServiceFactory;
- import org.apache.ambari.server.state.ServiceInfo;
  import org.apache.ambari.server.state.StackId;
+ import org.apache.ambari.server.state.UpgradeContext;
  import org.apache.ambari.server.state.UpgradeContextFactory;
+ import org.apache.ambari.server.state.UpgradeHelper;
 -import org.apache.ambari.server.state.ValueAttributesInfo;
  import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
  import org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
  import org.apache.ambari.server.state.stack.OsFamily;
@@@ -86,21 -98,16 +94,13 @@@ import com.google.inject.assistedinject
   */
  public class StackUpgradeConfigurationMergeTest extends EasyMockSupport {
  
-   private static final StackId s_currentStackId = new StackId("HDP-2.4");
-   private static final StackId s_targetStackId = new StackId("HDP-2.5");
- 
    private Injector m_injector;
-   private Clusters m_clustersMock;
-   private AmbariMetaInfo m_ambariMetaInfoMock;
 -  private AmbariMetaInfo m_metainfo;
  
    /**
     * @throws Exception
     */
    @Before
    public void before() throws Exception {
-     m_clustersMock = createNiceMock(Clusters.class);
-     m_ambariMetaInfoMock = createNiceMock(AmbariMetaInfo.class);
 -    m_metainfo = createNiceMock(AmbariMetaInfo.class);
--
      MockModule mockModule = new MockModule();
  
      // create an injector which will inject the mocks
@@@ -238,29 -276,151 +269,23 @@@
  
      replayAll();
  
-     UpgradeResourceProvider upgradeResourceProvider = new UpgradeResourceProvider(amc);
-     m_injector.injectMembers(upgradeResourceProvider);
- 
-     upgradeResourceProvider.applyStackAndProcessConfigurations("HDP", cluster, "2.5.0.0-1234",
-         Direction.UPGRADE, upgradePack, "admin");
+     UpgradeHelper upgradeHelper = m_injector.getInstance(UpgradeHelper.class);
+     upgradeHelper.updateDesiredRepositoriesAndConfigs(context);
  
-     // assertion time!
-     Map<String, Map<String, String>> mergedConfigurations = capturedArgument.getValue();
-     Map<String, String> mergedFooSite = mergedConfigurations.get("foo-type");
-     Map<String, String> mergedBarSite = mergedConfigurations.get("bar-type");
+     Map<String, Map<String, String>> expectedConfigurations = expectedConfigurationsCapture.getValue();
+     Map<String, String> expectedFooType = expectedConfigurations.get("foo-site");
+     Map<String, String> expectedBarType = expectedConfigurations.get("bar-site");
  
-     // foo-site validation
-     Assert.assertEquals("foo-value-1", mergedFooSite.get("foo-property-1"));
-     Assert.assertEquals("foo-value-99", mergedFooSite.get("foo-property-99"));
-     Assert.assertFalse(mergedFooSite.containsKey("foo-property-2"));
+     // As the upgrade pack did not have any Flume updates, its configs should
+     // not be updated.
+     assertEquals(2, expectedConfigurations.size());
  
-     // bar-site validation
-     Assert.assertEquals("bar-value-1", mergedBarSite.get("bar-property-1"));
-     Assert.assertEquals("bar-value-20", mergedBarSite.get("bar-property-20"));
-     Assert.assertEquals("bar-value-99", mergedBarSite.get("bar-property-99"));
-     Assert.assertEquals(3, mergedBarSite.size());
+     assertEquals("my-foo-property-1", expectedFooType.get("foo-property-1"));
+     assertEquals(null, expectedFooType.get("foo-property-2"));
+     assertEquals("stack-220-original", expectedBarType.get("bar-property-1"));
+     assertEquals("stack-220-original", expectedBarType.get("bar-property-2"));
    }
  
 -  /**
 -   * Tests that any read-only properties are not taken from the existing
 -   * configs, but from the new stack value.
 -   *
 -   * @throws Exception
 -   */
 -  @Test
 -  public void testReadOnlyPropertyIsTakenFromTargetStack() throws Exception {
 -    RepositoryVersionEntity repoVersion211 = createNiceMock(RepositoryVersionEntity.class);
 -    RepositoryVersionEntity repoVersion220 = createNiceMock(RepositoryVersionEntity.class);
 -
 -    StackId stack211 = new StackId("HDP-2.1.1");
 -    StackId stack220 = new StackId("HDP-2.2.0");
 -
 -    String version211 = "2.1.1.0-1234";
 -    String version220 = "2.2.0.0-1234";
 -
 -    expect(repoVersion211.getStackId()).andReturn(stack211).atLeastOnce();
 -    expect(repoVersion211.getVersion()).andReturn(version211).atLeastOnce();
 -
 -    expect(repoVersion220.getStackId()).andReturn(stack220).atLeastOnce();
 -    expect(repoVersion220.getVersion()).andReturn(version220).atLeastOnce();
 -
 -    String fooSite = "foo-site";
 -    String fooPropertyName = "foo-property-1";
 -    String serviceName = "ZOOKEEPER";
 -
 -    Map<String, Map<String, String>> stack211Configs = new HashMap<>();
 -    Map<String, String> stack211FooType = new HashMap<>();
 -    stack211Configs.put(fooSite, stack211FooType);
 -    stack211FooType.put(fooPropertyName, "stack-211-original");
 -
 -    Map<String, Map<String, String>> stack220Configs = new HashMap<>();
 -    Map<String, String> stack220FooType = new HashMap<>();
 -    stack220Configs.put(fooSite, stack220FooType);
 -    stack220FooType.put(fooPropertyName, "stack-220-original");
 -
 -    PropertyInfo readOnlyProperty = new PropertyInfo();
 -    ValueAttributesInfo valueAttributesInfo = new ValueAttributesInfo();
 -    valueAttributesInfo.setReadOnly(true);
 -    readOnlyProperty.setName(fooPropertyName);
 -    readOnlyProperty.setFilename(fooSite + ".xml");
 -    readOnlyProperty.setPropertyValueAttributes(null);
 -    readOnlyProperty.setPropertyValueAttributes(valueAttributesInfo);
 -
 -    expect(m_metainfo.getServiceProperties(stack211.getStackName(), stack211.getStackVersion(),
 -        serviceName)).andReturn(Sets.newHashSet(readOnlyProperty)).atLeastOnce();
 -
 -    Map<String, String> existingFooType = new HashMap<>();
 -
 -    ClusterConfigEntity fooConfigEntity = createNiceMock(ClusterConfigEntity.class);
 -
 -    expect(fooConfigEntity.getType()).andReturn(fooSite);
 -
 -    Config fooConfig = createNiceMock(Config.class);
 -
 -    existingFooType.put(fooPropertyName, "my-foo-property-1");
 -
 -    expect(fooConfig.getType()).andReturn(fooSite).atLeastOnce();
 -    expect(fooConfig.getProperties()).andReturn(existingFooType);
 -
 -    Map<String, DesiredConfig> desiredConfigurations = new HashMap<>();
 -    desiredConfigurations.put(fooSite, null);
 -
 -    Service zookeeper = createNiceMock(Service.class);
 -    expect(zookeeper.getName()).andReturn(serviceName).atLeastOnce();
 -    expect(zookeeper.getServiceComponents()).andReturn(new HashMap<String, ServiceComponent>()).once();
 -    zookeeper.setDesiredRepositoryVersion(repoVersion220);
 -    expectLastCall().once();
 -
 -    Cluster cluster = createNiceMock(Cluster.class);
 -    expect(cluster.getCurrentStackVersion()).andReturn(stack211).atLeastOnce();
 -    expect(cluster.getDesiredStackVersion()).andReturn(stack220);
 -    expect(cluster.getDesiredConfigs()).andReturn(desiredConfigurations);
 -    expect(cluster.getDesiredConfigByType(fooSite)).andReturn(fooConfig);
 -    expect(cluster.getService(serviceName)).andReturn(zookeeper);
 -
 -    ConfigHelper configHelper = m_injector.getInstance(ConfigHelper.class);
 -
 -    expect(configHelper.getDefaultProperties(stack211, serviceName)).andReturn(stack211Configs).anyTimes();
 -    expect(configHelper.getDefaultProperties(stack220, serviceName)).andReturn(stack220Configs).anyTimes();
 -
 -    Capture<Map<String, Map<String, String>>> expectedConfigurationsCapture = EasyMock.newCapture();
 -
 -    configHelper.createConfigTypes(EasyMock.anyObject(Cluster.class),
 -        EasyMock.anyObject(StackId.class), EasyMock.anyObject(AmbariManagementController.class),
 -        EasyMock.capture(expectedConfigurationsCapture), EasyMock.anyObject(String.class),
 -        EasyMock.anyObject(String.class));
 -
 -    expectLastCall().once();
 -
 -    // mock the service config DAO and replay it
 -    ServiceConfigEntity zookeeperServiceConfig = createNiceMock(ServiceConfigEntity.class);
 -    expect(zookeeperServiceConfig.getClusterConfigEntities()).andReturn(
 -        Lists.newArrayList(fooConfigEntity));
 -
 -    ServiceConfigDAO serviceConfigDAOMock = m_injector.getInstance(ServiceConfigDAO.class);
 -    List<ServiceConfigEntity> latestServiceConfigs = Lists.newArrayList(zookeeperServiceConfig);
 -    expect(serviceConfigDAOMock.getLastServiceConfigsForService(EasyMock.anyLong(),
 -        eq(serviceName))).andReturn(latestServiceConfigs).once();
 -
 -    UpgradeContext context = createNiceMock(UpgradeContext.class);
 -    expect(context.getCluster()).andReturn(cluster).atLeastOnce();
 -    expect(context.getType()).andReturn(UpgradeType.ROLLING).atLeastOnce();
 -    expect(context.getDirection()).andReturn(Direction.UPGRADE).atLeastOnce();
 -    expect(context.getRepositoryVersion()).andReturn(repoVersion220).anyTimes();
 -    expect(context.getSupportedServices()).andReturn(Sets.newHashSet(serviceName)).atLeastOnce();
 -    expect(context.getSourceRepositoryVersion(EasyMock.anyString())).andReturn(repoVersion211).atLeastOnce();
 -    expect(context.getTargetRepositoryVersion(EasyMock.anyString())).andReturn(repoVersion220).atLeastOnce();
 -    expect(context.getOrchestrationType()).andReturn(RepositoryType.STANDARD).anyTimes();
 -    expect(context.getHostRoleCommandFactory()).andStubReturn(m_injector.getInstance(HostRoleCommandFactory.class));
 -    expect(context.getRoleGraphFactory()).andStubReturn(m_injector.getInstance(RoleGraphFactory.class));
 -
 -    replayAll();
 -
 -    UpgradeHelper upgradeHelper = m_injector.getInstance(UpgradeHelper.class);
 -    upgradeHelper.updateDesiredRepositoriesAndConfigs(context);
 -
 -    Map<String, Map<String, String>> expectedConfigurations = expectedConfigurationsCapture.getValue();
 -    Map<String, String> expectedFooType = expectedConfigurations.get(fooSite);
 -
 -    // As the upgrade pack did not have any Flume updates, its configs should
 -    // not be updated.
 -    assertEquals(1, expectedConfigurations.size());
 -    assertEquals(1, expectedFooType.size());
 -
 -    assertEquals("stack-220-original", expectedFooType.get(fooPropertyName));
 -  }
  
    private class MockModule implements Module {
  
@@@ -298,8 -457,10 +322,9 @@@
        binder.bind(RepositoryVersionDAO.class).toInstance(createNiceMock(RepositoryVersionDAO.class));
        binder.bind(HookContextFactory.class).toInstance(createMock(HookContextFactory.class));
        binder.bind(HookService.class).toInstance(createMock(HookService.class));
+       binder.bind(ServiceConfigDAO.class).toInstance(createNiceMock(ServiceConfigDAO.class));
        binder.install(new FactoryModuleBuilder().build(UpgradeContextFactory.class));
        binder.bind(HostRoleCommandFactory.class).to(HostRoleCommandFactoryImpl.class);
 -      binder.bind(AmbariMetaInfo.class).toInstance(m_metainfo);
  
        binder.requestStaticInjection(UpgradeResourceProvider.class);
      }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
index e587f28,fea56d9..37a7b44
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
@@@ -1623,6 -1528,319 +1527,212 @@@ public class UpgradeResourceProviderTes
      }
    }
  
+   /**
+    * Tests that from/to repository version history is created correctly on the
+    * upgrade.
+    *
+    * @throws Exception
+    */
+   @Test
+   public void testUpgradeHistory() throws Exception {
+     Cluster cluster = clusters.getCluster("c1");
+ 
+     Map<String, Object> requestProps = new HashMap<>();
+     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, String.valueOf(repoVersionEntity2200.getId()));
+     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_TYPE, UpgradeType.ROLLING.toString());
+     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_MANUAL_VERIFICATION, Boolean.TRUE.toString());
+     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, Boolean.TRUE.toString());
+     requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name());
+ 
+     ResourceProvider upgradeResourceProvider = createProvider(amc);
+     Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+     upgradeResourceProvider.createResources(request);
+ 
+     List<UpgradeEntity> upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+     assertEquals(1, upgrades.size());
+ 
+     UpgradeEntity upgrade = cluster.getUpgradeInProgress();
+     List<UpgradeHistoryEntity> histories = upgrade.getHistory();
+     assertEquals(2, histories.size());
+ 
+     for( UpgradeHistoryEntity history : histories){
+       assertEquals( "ZOOKEEPER", history.getServiceName() );
+       assertEquals(repoVersionEntity2110, history.getFromReposistoryVersion());
+       assertEquals(repoVersionEntity2200, history.getTargetRepositoryVersion());
+     }
+ 
+     // abort the upgrade and create the downgrade
+     abortUpgrade(upgrade.getRequestId());
+ 
+     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_nonrolling_new_stack");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.DOWNGRADE.name());
+ 
+     Map<String, String> requestInfoProperties = new HashMap<>();
+ 
+     request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps),
+         requestInfoProperties);
+     RequestStatus status = upgradeResourceProvider.createResources(request);
+     UpgradeEntity downgrade = upgradeDao.findUpgradeByRequestId(getRequestId(status));
+     assertEquals(Direction.DOWNGRADE, downgrade.getDirection());
+ 
+     // check from/to history
+     histories = downgrade.getHistory();
+     assertEquals(2, histories.size());
+ 
+     for (UpgradeHistoryEntity history : histories) {
+       assertEquals("ZOOKEEPER", history.getServiceName());
+       assertEquals(repoVersionEntity2200, history.getFromReposistoryVersion());
+       assertEquals(repoVersionEntity2110, history.getTargetRepositoryVersion());
+     }
+   }
+ 
+ 
+   /**
+    * Tests that from/to repository version history is created correctly on the
+    * upgrade.
+    *
+    * @throws Exception
+    */
+   @Test
+   public void testCreatePatchRevertUpgrade() throws Exception {
+     Cluster cluster = clusters.getCluster("c1");
+ 
+     // add a single ZK server and client on 2.1.1.0
+     Service service = cluster.addService("HBASE", repoVersionEntity2110);
+     ServiceComponent component = service.addServiceComponent("HBASE_MASTER");
+     ServiceComponentHost sch = component.addServiceComponentHost("h1");
+     sch.setVersion("2.1.1.0");
+ 
+     File f = new File("src/test/resources/hbase_version_test.xml");
+     repoVersionEntity2112.setType(RepositoryType.PATCH);
+     repoVersionEntity2112.setVersionXml(IOUtils.toString(new FileInputStream(f)));
+     repoVersionEntity2112.setVersionXsd("version_definition.xsd");
+     repoVersionDao.merge(repoVersionEntity2112);
+ 
+     List<UpgradeEntity> upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+     assertEquals(0, upgrades.size());
+ 
+     Map<String, Object> requestProps = new HashMap<>();
+     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, String.valueOf(repoVersionEntity2112.getId()));
+     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name());
+ 
+     ResourceProvider upgradeResourceProvider = createProvider(amc);
+ 
+     Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+     upgradeResourceProvider.createResources(request);
+ 
+     upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+     assertEquals(1, upgrades.size());
+ 
+     UpgradeEntity upgradeEntity = upgrades.get(0);
+     assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration());
+ 
+     // should be false since only finalization actually sets this bit
+     assertEquals(false, upgradeEntity.isRevertAllowed());
+ 
+     // fake it now so the rest of the test passes
+     upgradeEntity.setRevertAllowed(true);
+     upgradeEntity = upgradeDao.merge(upgradeEntity);
+ 
+     // !!! make it look like the cluster is done
+     cluster.setUpgradeEntity(null);
+ 
+     requestProps = new HashMap<>();
+     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_REVERT_UPGRADE_ID, upgradeEntity.getId());
+     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, Boolean.TRUE.toString());
+ 
+     request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+     upgradeResourceProvider.createResources(request);
+ 
+     upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+     assertEquals(2, upgrades.size());
+ 
+     boolean found = false;
+ 
+     Function<UpgradeHistoryEntity, String> function = new Function<UpgradeHistoryEntity, String>() {
+       @Override
+       public String apply(UpgradeHistoryEntity input) {
+         return input.getServiceName() + "/" + input.getComponentName();
+       };
+     };
+ 
+     for (UpgradeEntity upgrade : upgrades) {
+       if (upgrade.getId() != upgradeEntity.getId()) {
+         found = true;
+         assertEquals(upgradeEntity.getOrchestration(), upgrade.getOrchestration());
+ 
+         Collection<String> upgradeEntityStrings = Collections2.transform(upgradeEntity.getHistory(), function);
+         Collection<String> upgradeStrings = Collections2.transform(upgrade.getHistory(), function);
+ 
+         Collection<?> diff = CollectionUtils.disjunction(upgradeEntityStrings, upgradeStrings);
+         assertEquals("Verify the same set of components was orchestrated", 0, diff.size());
+       }
+     }
+ 
+     assertTrue(found);
+   }
+ 
+   /**
+    * Tests that when there is no revertable upgrade, a reversion of a specific
+    * ugprade ID is not allowed.
+    */
+   @Test(expected = SystemException.class)
+   public void testRevertFailsWhenNoRevertableUpgradeIsFound() throws Exception {
+     Cluster cluster = clusters.getCluster("c1");
+ 
+     // add a single ZK server and client on 2.1.1.0
+     Service service = cluster.addService("HBASE", repoVersionEntity2110);
+     ServiceComponent component = service.addServiceComponent("HBASE_MASTER");
+     ServiceComponentHost sch = component.addServiceComponentHost("h1");
+     sch.setVersion("2.1.1.0");
+ 
+     File f = new File("src/test/resources/hbase_version_test.xml");
+     repoVersionEntity2112.setType(RepositoryType.PATCH);
+     repoVersionEntity2112.setVersionXml(IOUtils.toString(new FileInputStream(f)));
+     repoVersionEntity2112.setVersionXsd("version_definition.xsd");
+     repoVersionDao.merge(repoVersionEntity2112);
+ 
+     List<UpgradeEntity> upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+     assertEquals(0, upgrades.size());
+ 
+     Map<String, Object> requestProps = new HashMap<>();
+     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID,String.valueOf(repoVersionEntity2112.getId()));
+     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name());
+ 
+     ResourceProvider upgradeResourceProvider = createProvider(amc);
+ 
+     Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+     upgradeResourceProvider.createResources(request);
+ 
+     upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+     assertEquals(1, upgrades.size());
+ 
+     UpgradeEntity upgradeEntity = upgrades.get(0);
+     assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration());
+ 
+     // !!! make it look like the cluster is done
+     cluster.setUpgradeEntity(null);
+ 
+     requestProps = new HashMap<>();
+     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+     requestProps.put(UpgradeResourceProvider.UPGRADE_REVERT_UPGRADE_ID, upgradeEntity.getId());
+     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, Boolean.TRUE.toString());
+ 
+     request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+     upgradeResourceProvider.createResources(request);
+   }
+ 
 -  @Test
 -  public void testCreatePatchWithConfigChanges() throws Exception {
 -    Cluster cluster = clusters.getCluster("c1");
 -
 -    File f = new File("src/test/resources/version_definition_test_patch_config.xml");
 -    repoVersionEntity2112.setType(RepositoryType.PATCH);
 -    repoVersionEntity2112.setVersionXml(IOUtils.toString(new FileInputStream(f)));
 -    repoVersionEntity2112.setVersionXsd("version_definition.xsd");
 -    repoVersionDao.merge(repoVersionEntity2112);
 -
 -    List<UpgradeEntity> upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
 -    assertEquals(0, upgrades.size());
 -
 -    Map<String, Object> requestProps = new HashMap<>();
 -    requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
 -    requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, String.valueOf(repoVersionEntity2112.getId()));
 -    requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
 -    requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
 -    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name());
 -
 -    // !!! test that a PATCH upgrade skips config changes
 -    ResourceProvider upgradeResourceProvider = createProvider(amc);
 -
 -    Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
 -    RequestStatus status = upgradeResourceProvider.createResources(request);
 -    Set<Resource> resources = status.getAssociatedResources();
 -    assertEquals(1, resources.size());
 -    Long requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id");
 -    assertNotNull(requestId);
 -
 -    UpgradeEntity upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId);
 -    assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration());
 -
 -    HostRoleCommandDAO hrcDAO = injector.getInstance(HostRoleCommandDAO.class);
 -    List<HostRoleCommandEntity> commands = hrcDAO.findByRequest(upgradeEntity.getRequestId());
 -
 -    boolean foundConfigTask = false;
 -    for (HostRoleCommandEntity command : commands) {
 -      if (StringUtils.isNotBlank(command.getCustomCommandName()) &&
 -          command.getCustomCommandName().equals(ConfigureAction.class.getName())) {
 -        foundConfigTask = true;
 -        break;
 -      }
 -    }
 -    assertFalse(foundConfigTask);
 -
 -    // !!! test that a patch with a supported patch change gets picked up
 -    cluster.setUpgradeEntity(null);
 -    requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test_force_config_change");
 -    request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
 -
 -    status = upgradeResourceProvider.createResources(request);
 -    resources = status.getAssociatedResources();
 -    assertEquals(1, resources.size());
 -    requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id");
 -    assertNotNull(requestId);
 -
 -    upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId);
 -    assertEquals(RepositoryType.PATCH, upgradeEntity.getOrchestration());
 -
 -    commands = hrcDAO.findByRequest(upgradeEntity.getRequestId());
 -
 -    foundConfigTask = false;
 -    for (HostRoleCommandEntity command : commands) {
 -      if (StringUtils.isNotBlank(command.getCustomCommandName()) &&
 -          command.getCustomCommandName().equals(ConfigureAction.class.getName())) {
 -        foundConfigTask = true;
 -        break;
 -      }
 -    }
 -    assertTrue(foundConfigTask);
 -
 -
 -
 -    // !!! test that a regular upgrade will pick up the config change
 -    cluster.setUpgradeEntity(null);
 -    repoVersionEntity2112.setType(RepositoryType.STANDARD);
 -    repoVersionDao.merge(repoVersionEntity2112);
 -
 -    requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
 -    request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
 -
 -    status = upgradeResourceProvider.createResources(request);
 -    resources = status.getAssociatedResources();
 -    assertEquals(1, resources.size());
 -    requestId = (Long) resources.iterator().next().getPropertyValue("Upgrade/request_id");
 -    assertNotNull(requestId);
 -
 -    upgradeEntity = upgradeDao.findUpgradeByRequestId(requestId);
 -    assertEquals(RepositoryType.STANDARD, upgradeEntity.getOrchestration());
 -
 -    commands = hrcDAO.findByRequest(upgradeEntity.getRequestId());
 -
 -    foundConfigTask = false;
 -    for (HostRoleCommandEntity command : commands) {
 -      if (StringUtils.isNotBlank(command.getCustomCommandName()) &&
 -          command.getCustomCommandName().equals(ConfigureAction.class.getName())) {
 -        foundConfigTask = true;
 -        break;
 -      }
 -    }
 -    assertTrue(foundConfigTask);
 -
 -  }
 -
 -
 -
    private String parseSingleMessage(String msgStr){
      JsonParser parser = new JsonParser();
      JsonArray msgArray = (JsonArray) parser.parse(msgStr);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/events/EventsTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListenerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/HostVersionOutOfSyncListenerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAOTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
index 1341e47,9cc582f..8f587be
--- a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
@@@ -31,6 -31,7 +31,8 @@@ import static org.hamcrest.CoreMatchers
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertThat;
  
+ import java.lang.reflect.InvocationTargetException;
++import java.lang.reflect.Method;
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.HashMap;
@@@ -636,4 -639,37 +638,17 @@@ public class ExecutionScheduleManagerTe
  
      verify(scheduleManagerMock, executionJob, context, jobDataMap, jobDetail);
    }
+ 
+   @Test
 -  public void testExtendApiResource() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
 -    WebResource webResource = Client.create().resource("http://localhost:8080/");
 -
 -    String clustersEndpoint = "http://localhost:8080/api/v1/clusters";
 -
 -    Clusters clustersMock = createMock(Clusters.class);
 -
 -    Configuration configurationMock = createNiceMock(Configuration.class);
 -    ExecutionScheduler executionSchedulerMock = createMock(ExecutionScheduler.class);
 -    InternalTokenStorage tokenStorageMock = createMock(InternalTokenStorage.class);
 -    ActionDBAccessor actionDBAccessorMock = createMock(ActionDBAccessor.class);
 -    Gson gson = new Gson();
 -
 -    replay(clustersMock, configurationMock, executionSchedulerMock, tokenStorageMock,
 -      actionDBAccessorMock);
 -
 -    ExecutionScheduleManager scheduleManager =
 -      new ExecutionScheduleManager(configurationMock, executionSchedulerMock,
 -        tokenStorageMock, clustersMock, actionDBAccessorMock, gson);
 -    
 -    assertEquals(clustersEndpoint,
 -      scheduleManager.extendApiResource(webResource, "clusters").getURI().toString());
 -    assertEquals(clustersEndpoint,
 -      scheduleManager.extendApiResource(webResource, "/clusters").getURI().toString());
 -    assertEquals(clustersEndpoint,
 -      scheduleManager.extendApiResource(webResource, "/api/v1/clusters").getURI().toString());
 -    assertEquals(clustersEndpoint,
 -      scheduleManager.extendApiResource(webResource, "api/v1/clusters").getURI().toString());
 -    assertEquals("http://localhost:8080/",
 -      scheduleManager.extendApiResource(webResource, "").getURI().toString());
++  public void testCompleteRelativePath() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
++    ExecutionScheduleManager scheduleManagerMock = createMock(ExecutionScheduleManager.class);
++    Method completeRelativeUri = ExecutionScheduleManager.class.getDeclaredMethod("completeRelativeUri", String.class);
++    completeRelativeUri.setAccessible(true);
++
++    assertEquals("api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "clusters"));
++    assertEquals("api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "/clusters"));
++    assertEquals("/api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "/api/v1/clusters"));
++    assertEquals("api/v1/clusters", completeRelativeUri.invoke(scheduleManagerMock, "api/v1/clusters"));
++    assertEquals("", completeRelativeUri.invoke(scheduleManagerMock, ""));
+   }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
index e02a1be,9f87312..d07ac15
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
@@@ -266,17 -306,8 +308,14 @@@ public class ComponentVersionCheckActio
  
      makeUpgradeCluster(sourceStack, sourceRepo, targetStack, targetRepo);
  
 +    // Verify the repo before calling Finalize
 +    AmbariMetaInfo metaInfo = m_injector.getInstance(AmbariMetaInfo.class);
 +
 +    RepositoryInfo repo = metaInfo.getRepository(sourceStack.getStackName(), sourceStack.getStackVersion(), "redhat6", sourceStack.getStackId());
 +    assertEquals(HDP_211_CENTOS6_REPO_URL, repo.getBaseUrl());
 +
      // Finalize the upgrade
      Map<String, String> commandParams = new HashMap<>();
-     commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
-     commandParams.put(FinalizeUpgradeAction.VERSION_KEY, targetRepo);
- 
      ExecutionCommand executionCommand = new ExecutionCommand();
      executionCommand.setCommandParams(commandParams);
      executionCommand.setClusterName("c1");
@@@ -370,6 -413,73 +421,79 @@@
      assertNotNull(report);
      assertEquals(HostRoleStatus.FAILED.name(), report.getStatus());
      assertEquals(-1, report.getExitCode());
+ 
+     // OK, now set the datanode so it completes
+     cluster.getServiceComponentHosts("HDFS", "DATANODE").get(0).setVersion(targetVersion);
+ 
+     report = action.execute(null);
+     assertNotNull(report);
+     assertEquals(HostRoleStatus.COMPLETED.name(), report.getStatus());
+     assertEquals(0, report.getExitCode());
+   }
+ 
+   @Test
+   public void testMatchingPartialVersions() throws Exception {
+     StackId sourceStack = HDP_21_STACK;
+     StackId targetStack = HDP_21_STACK;
+     String sourceRepo = HDP_2_1_1_0;
+     String targetRepo = HDP_2_1_1_1;
+ 
+     makeUpgradeCluster(sourceStack, sourceRepo, targetStack, targetRepo);
+ 
+     Clusters clusters = m_injector.getInstance(Clusters.class);
+ 
+     Host host = clusters.getHost("h1");
+     Assert.assertNotNull(host);
+     host.setOsInfo("redhat6");
+ 
+     Cluster cluster = clusters.getCluster("c1");
+     clusters.mapHostToCluster("h1", "c1");
+ 
+     RepositoryVersionEntity repositoryVersion2110 = m_helper.getOrCreateRepositoryVersion(
+         HDP_21_STACK, HDP_2_1_1_0);
+ 
+     RepositoryVersionEntity repositoryVersion2111 = m_helper.getOrCreateRepositoryVersion(
+         HDP_21_STACK, HDP_2_1_1_1);
+ 
+     Service service = installService(cluster, "HDFS", repositoryVersion2110);
+     addServiceComponent(cluster, service, "NAMENODE");
+     addServiceComponent(cluster, service, "DATANODE");
+ 
+     ServiceComponentHost sch = createNewServiceComponentHost(cluster, "HDFS", "NAMENODE", "h1");
+     sch.setVersion(HDP_2_1_1_0);
+     sch = createNewServiceComponentHost(cluster, "HDFS", "DATANODE", "h1");
+     sch.setVersion(HDP_2_1_1_0);
+ 
+     service = installService(cluster, "ZOOKEEPER", repositoryVersion2111);
+     addServiceComponent(cluster, service, "ZOOKEEPER_SERVER");
+ 
+     sch = createNewServiceComponentHost(cluster, "ZOOKEEPER", "ZOOKEEPER_SERVER", "h1");
+     sch.setVersion(HDP_2_1_1_1);
+ 
++    // Verify the repo before calling Finalize
++    AmbariMetaInfo metaInfo = m_injector.getInstance(AmbariMetaInfo.class);
++
++    RepositoryInfo repo = metaInfo.getRepository(sourceStack.getStackName(), sourceStack.getStackVersion(), "redhat6", sourceStack.getStackId());
++    assertEquals(HDP_211_CENTOS6_REPO_URL, repo.getBaseUrl());
++
+     // Finalize the upgrade
+     Map<String, String> commandParams = new HashMap<>();
+     ExecutionCommand executionCommand = new ExecutionCommand();
+     executionCommand.setCommandParams(commandParams);
+     executionCommand.setClusterName("c1");
+ 
+     HostRoleCommand hostRoleCommand = hostRoleCommandFactory.create(null, null, null, null);
+     hostRoleCommand.setExecutionCommandWrapper(new ExecutionCommandWrapper(executionCommand));
+ 
+     ComponentVersionCheckAction action = m_injector.getInstance(ComponentVersionCheckAction.class);
+     action.setExecutionCommand(executionCommand);
+     action.setHostRoleCommand(hostRoleCommand);
+ 
+     CommandReport report = action.execute(null);
+     assertNotNull(report);
+     assertEquals(HostRoleStatus.COMPLETED.name(), report.getStatus());
+     assertEquals(0, report.getExitCode());
+ 
    }
  
    private ServiceComponentHost createNewServiceComponentHost(Cluster cluster, String svc,

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
index 711a3c6,c753f49..d341a09
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
@@@ -30,10 -29,7 +29,8 @@@ import java.util.Map
  
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.H2DatabaseCleaner;
- import org.apache.ambari.server.actionmanager.HostRoleStatus;
- import org.apache.ambari.server.api.services.AmbariMetaInfo;
  import org.apache.ambari.server.controller.ServiceComponentResponse;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
  import org.apache.ambari.server.orm.GuiceJpaInitializer;
  import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
  import org.apache.ambari.server.orm.OrmTestHelper;


[50/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/be73d167
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/be73d167
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/be73d167

Branch: refs/heads/branch-3.0-perf
Commit: be73d167a1c3da3053059727e1f6f88d8d624744
Parents: a670750 9d802b7
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Thu Sep 28 16:23:29 2017 +0300
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Thu Sep 28 16:23:29 2017 +0300

----------------------------------------------------------------------
 LICENSE.txt                                     |    17 +
 .../main/resources/ui/admin-web/app/index.html  |     2 +-
 .../controllers/ambariViews/ViewsListCtrl.js    |    20 +
 .../authentication/AuthenticationMainCtrl.js    |     4 +-
 .../clusters/ClustersManageAccessCtrl.js        |     2 +-
 .../controllers/groups/GroupsEditCtrl.js        |    22 +-
 .../stackVersions/StackVersionsCreateCtrl.js    |    19 +-
 .../stackVersions/StackVersionsEditCtrl.js      |     9 +-
 .../stackVersions/StackVersionsListCtrl.js      |    20 +
 .../scripts/controllers/users/UsersShowCtrl.js  |    13 +
 .../ui/admin-web/app/scripts/i18n.config.js     |    14 +-
 .../ui/admin-web/app/scripts/services/Stack.js  |    55 +-
 .../resources/ui/admin-web/app/styles/main.css  |     7 +-
 .../admin-web/app/views/ambariViews/edit.html   |     2 +-
 .../app/views/ambariViews/listTable.html        |     3 +
 .../ui/admin-web/app/views/groups/edit.html     |     3 +
 .../resources/ui/admin-web/app/views/main.html  |    50 +-
 .../admin-web/app/views/stackVersions/list.html |    14 +-
 .../views/stackVersions/stackVersionPage.html   |    12 +-
 .../ui/admin-web/app/views/users/create.html    |     2 +-
 .../ui/admin-web/app/views/users/show.html      |     5 +-
 .../StackVersionsCreateCtrl_test.js             |     6 +-
 ambari-agent/conf/unix/ambari-agent             |    20 +
 ambari-agent/conf/unix/install-helper.sh        |    11 +-
 ambari-agent/etc/init.d/ambari-agent            |    22 +-
 ambari-agent/pom.xml                            |    18 +-
 .../org/apache/ambari/tools/zk/ZkMigrator.java  |    44 +-
 .../src/main/package/rpm/posttrans_agent.sh     |     7 +
 .../ambari_agent/AlertSchedulerHandler.py       |    16 +-
 .../main/python/ambari_agent/AmbariConfig.py    |    83 +-
 .../src/main/python/ambari_agent/Controller.py  |    24 +-
 .../ambari_agent/CustomServiceOrchestrator.py   |     5 +-
 .../src/main/python/ambari_agent/HostInfo.py    |    42 +-
 .../src/main/python/ambari_agent/NetUtil.py     |     5 +-
 .../python/ambari_agent/alerts/base_alert.py    |    23 +-
 .../python/ambari_agent/alerts/port_alert.py    |   107 +-
 .../python/ambari_agent/alerts/web_alert.py     |     9 +-
 ambari-agent/src/packages/tarball/all.xml       |    15 +-
 .../apache/ambari/tools/zk/ZkMigratorTest.java  |    60 +-
 .../ambari_agent/TestAlertSchedulerHandler.py   |    17 +-
 .../src/test/python/ambari_agent/TestAlerts.py  |    19 +-
 .../test/python/ambari_agent/TestController.py  |    14 +
 .../test/python/ambari_agent/TestHardware.py    |     4 +-
 .../test/python/ambari_agent/TestHostInfo.py    |   169 +-
 .../src/test/python/ambari_agent/TestShell.py   |     2 +-
 .../resource_management/TestPackagesAnalyzer.py |   187 -
 .../python/resource_management/TestScript.py    |    77 +-
 .../resource_management/TestUserResource.py     |     2 +-
 ambari-client/groovy-client/pom.xml             |     2 +
 .../python/ambari_commons/get_ambari_version.py |    44 +
 .../main/python/ambari_commons/inet_utils.py    |    87 +-
 .../src/main/python/ambari_commons/network.py   |    20 +-
 .../src/main/python/ambari_commons/os_check.py  |     6 +
 .../ambari_commons/resources/os_family.json     |    11 +
 .../src/main/python/ambari_commons/shell.py     |   139 +-
 .../python/resource_management/core/base.py     |    11 +
 .../resource_management/core/files/killtree.sh  |     2 +-
 .../core/providers/__init__.py                  |    59 +-
 .../core/providers/accounts.py                  |     6 +-
 .../core/providers/package/__init__.py          |   250 +-
 .../core/providers/package/apt.py               |   289 +-
 .../core/providers/package/yumrpm.py            |   266 +-
 .../core/providers/package/zypper.py            |   147 +-
 .../core/resources/accounts.py                  |     4 +-
 .../resource_management/core/resources/klist.py |    45 +
 .../core/resources/zkmigrator.py                |    17 +-
 .../libraries/functions/check_process_status.py |    20 +
 .../libraries/functions/component_version.py    |    63 +
 .../libraries/functions/conf_select.py          |   283 +-
 .../libraries/functions/constants.py            |     3 +-
 .../libraries/functions/copy_tarball.py         |   173 +-
 .../libraries/functions/curl_krb_request.py     |    19 +-
 .../libraries/functions/decorator.py            |    22 +-
 .../libraries/functions/get_stack_version.py    |     4 +-
 .../libraries/functions/hive_check.py           |     5 +-
 .../libraries/functions/mounted_dirs_helper.py  |     1 +
 .../libraries/functions/packages_analyzer.py    |   320 -
 .../libraries/functions/repository_util.py      |   141 +
 .../functions/setup_ranger_plugin_xml.py        |    27 +-
 .../libraries/functions/solr_cloud_util.py      |    10 +
 .../libraries/functions/stack_features.py       |    63 +-
 .../libraries/functions/stack_select.py         |   253 +-
 .../libraries/functions/stack_tools.py          |    58 +-
 .../libraries/functions/tar_archive.py          |    24 +-
 .../libraries/functions/upgrade_summary.py      |   146 +
 .../libraries/functions/version.py              |    48 +-
 .../libraries/functions/version_select_util.py  |    64 +-
 .../libraries/providers/__init__.py             |     3 -
 .../libraries/providers/hdfs_resource.py        |    57 +-
 .../providers/modify_properties_file.py         |     9 +-
 .../libraries/script/script.py                  |   236 +-
 ambari-funtest/pom.xml                          |     7 +-
 .../HDP/2.0.8/services/HDFS/kerberos.json       |    12 +-
 .../upgrades/upgrade_nonrolling_new_stack.xml   |     8 +-
 .../2.1.1/upgrades/upgrade_test_nonrolling.xml  |     4 +-
 ambari-infra/.gitignore                         |     6 +
 ambari-infra/ambari-infra-assembly/pom.xml      |    91 +
 .../src/main/package/deb/manager/control        |    22 +
 .../src/main/package/deb/manager/postinst       |    15 +
 .../src/main/package/deb/manager/postrm         |    15 +
 .../src/main/package/deb/manager/preinst        |    15 +
 .../src/main/package/deb/manager/prerm          |    15 +
 .../src/main/resources/solr                     |   826 +-
 ambari-infra/ambari-infra-manager/.gitignore    |     2 +
 ambari-infra/ambari-infra-manager/README.md     |   117 +
 ambari-infra/ambari-infra-manager/build.xml     |    54 +
 .../ambari-infra-manager/docker/Dockerfile      |    52 +
 .../ambari-infra-manager/docker/bin/start.sh    |    21 +
 .../docker/infra-manager-docker.sh              |    85 +
 .../ambari-infra-manager/docs/api/swagger.yaml  |   784 +
 .../docs/images/batch-1.png                     |   Bin 0 -> 20521 bytes
 .../docs/images/batch-2.png                     |   Bin 0 -> 29388 bytes
 .../docs/images/batch-3.png                     |   Bin 0 -> 14105 bytes
 .../docs/images/batch-4.png                     |   Bin 0 -> 23277 bytes
 ambari-infra/ambari-infra-manager/pom.xml       |   422 +
 .../org/apache/ambari/infra/InfraManager.java   |    49 +
 .../infra/conf/InfraManagerApiDocConfig.java    |    75 +
 .../ambari/infra/conf/InfraManagerConfig.java   |    36 +
 .../infra/conf/InfraManagerDataConfig.java      |    37 +
 .../conf/InfraManagerJerseyResourceConfig.java  |    37 +
 .../infra/conf/InfraManagerServletConfig.java   |    83 +
 .../infra/conf/StaticResourceConfiguration.java |    49 +
 .../conf/batch/InfraManagerBatchConfig.java     |   207 +
 .../infra/doc/InfraManagerApiDocStorage.java    |    90 +
 .../infra/job/dummy/DummyItemProcessor.java     |    36 +
 .../ambari/infra/job/dummy/DummyItemWriter.java |    65 +
 .../infra/job/dummy/DummyJobConfiguration.java  |   108 +
 .../infra/job/dummy/DummyJobListener.java       |    46 +
 .../ambari/infra/job/dummy/DummyObject.java     |    40 +
 .../infra/job/dummy/DummyStepListener.java      |    41 +
 .../apache/ambari/infra/manager/JobManager.java |   274 +
 .../infra/model/ExecutionContextResponse.java   |    40 +
 .../ambari/infra/model/JobDetailsResponse.java  |    53 +
 .../model/JobExecutionDetailsResponse.java      |    49 +
 .../infra/model/JobExecutionInfoResponse.java   |   141 +
 .../ambari/infra/model/JobExecutionRequest.java |    46 +
 .../infra/model/JobExecutionRestartRequest.java |    52 +
 .../infra/model/JobExecutionStopRequest.java    |    50 +
 .../infra/model/JobInstanceDetailsResponse.java |    54 +
 .../infra/model/JobInstanceStartRequest.java    |    49 +
 .../ambari/infra/model/JobOperationParams.java  |    31 +
 .../apache/ambari/infra/model/JobRequest.java   |    37 +
 .../apache/ambari/infra/model/PageRequest.java  |    49 +
 .../model/StepExecutionContextResponse.java     |    58 +
 .../infra/model/StepExecutionInfoResponse.java  |   115 +
 .../model/StepExecutionProgressResponse.java    |    53 +
 .../infra/model/StepExecutionRequest.java       |    49 +
 .../infra/model/wrapper/JobExecutionData.java   |   118 +
 .../infra/model/wrapper/StepExecutionData.java  |   133 +
 .../ambari/infra/rest/ApiDocResource.java       |    56 +
 .../ambari/infra/rest/JobExceptionMapper.java   |   110 +
 .../apache/ambari/infra/rest/JobResource.java   |   191 +
 .../src/main/resources/dummy/dummy.txt          |     3 +
 .../src/main/resources/infra-manager-env.sh     |    18 +
 .../src/main/resources/infra-manager.properties |    20 +
 .../src/main/resources/infraManager.sh          |    20 +
 .../src/main/resources/log4j2.xml               |    41 +
 .../src/main/resources/static/index.html        |    24 +
 .../src/main/resources/swagger/swagger.html     |   115 +
 ambari-infra/ambari-infra-solr-client/build.xml |     2 +
 ambari-infra/ambari-infra-solr-client/pom.xml   |    17 +
 .../ambari/infra/solr/AmbariSolrCloudCLI.java   |    24 +-
 .../infra/solr/AmbariSolrCloudClient.java       |     8 +
 .../apache/ambari/infra/solr/S3Uploader.java    |    64 +
 .../commands/RemoveAdminHandlersCommand.java    |    46 +
 .../commands/SetClusterPropertyZkCommand.java   |     6 +-
 .../src/main/python/solrDataManager.py          |   725 +
 .../src/main/resources/log4j.properties         |     6 +-
 .../src/main/resources/solrCloudCli.sh          |     8 +-
 .../src/main/resources/solrIndexHelper.sh       |   162 +
 ambari-infra/ambari-infra-solr-plugin/pom.xml   |     4 +-
 .../InfraKerberosHostValidator.java             |    54 -
 .../InfraRuleBasedAuthorizationPlugin.java      |   542 -
 .../InfraUserRolesLookupStrategy.java           |    49 -
 .../security/InfraKerberosHostValidator.java    |    54 +
 .../InfraRuleBasedAuthorizationPlugin.java      |   542 +
 .../security/InfraUserRolesLookupStrategy.java  |    49 +
 .../InfraRuleBasedAuthorizationPluginTest.java  |     5 +
 ambari-infra/pom.xml                            |     9 +-
 ambari-logsearch/README.md                      |     9 +-
 .../ambari-logsearch-appender/pom.xml           |     3 +-
 .../ambari-logsearch-assembly/pom.xml           |     3 +-
 .../ambari-logsearch-config-api/pom.xml         |    16 +-
 .../config/api/InputConfigMonitor.java          |    13 +-
 .../config/api/LogLevelFilterMonitor.java       |    44 +
 .../logsearch/config/api/LogSearchConfig.java   |    61 +-
 .../config/api/LogSearchConfigFactory.java      |    71 +-
 .../config/api/LogSearchConfigLogFeeder.java    |    77 +
 .../config/api/LogSearchConfigServer.java       |   111 +
 .../api/LogSearchPropertyDescription.java       |    59 +
 .../config/api/OutputConfigMonitor.java         |    44 +
 .../api/ShipperConfigElementDescription.java    |    59 +
 .../api/ShipperConfigTypeDescription.java       |    44 +
 .../api/model/inputconfig/Conditions.java       |    24 +
 .../config/api/model/inputconfig/Fields.java    |    26 +
 .../api/model/inputconfig/FilterDescriptor.java |    39 +
 .../model/inputconfig/FilterGrokDescriptor.java |    30 +
 .../model/inputconfig/FilterJsonDescriptor.java |    23 +
 .../inputconfig/FilterKeyValueDescriptor.java   |    28 +
 .../api/model/inputconfig/InputConfig.java      |    28 +
 .../api/model/inputconfig/InputDescriptor.java  |    52 +
 .../inputconfig/InputFileBaseDescriptor.java    |    28 +
 .../model/inputconfig/InputFileDescriptor.java  |    23 +
 .../inputconfig/InputS3FileDescriptor.java      |    26 +
 .../inputconfig/MapAnonymizeDescriptor.java     |    26 +
 .../model/inputconfig/MapDateDescriptor.java    |    26 +
 .../inputconfig/MapFieldCopyDescriptor.java     |    24 +
 .../model/inputconfig/MapFieldDescriptor.java   |    24 +
 .../inputconfig/MapFieldNameDescriptor.java     |    24 +
 .../inputconfig/MapFieldValueDescriptor.java    |    26 +
 .../api/model/inputconfig/PostMapValues.java    |    26 +
 .../model/loglevelfilter/LogLevelFilter.java    |    79 +
 .../model/loglevelfilter/LogLevelFilterMap.java |    33 +
 .../model/outputconfig/OutputProperties.java    |    23 +
 .../outputconfig/OutputSolrProperties.java      |    26 +
 .../config/api/LogSearchConfigClass1.java       |    55 -
 .../config/api/LogSearchConfigClass2.java       |    55 -
 .../config/api/LogSearchConfigFactoryTest.java  |    59 +-
 .../api/LogSearchConfigLogFeederClass1.java     |    58 +
 .../api/LogSearchConfigLogFeederClass2.java     |    58 +
 .../config/api/LogSearchConfigServerClass1.java |    76 +
 .../config/api/LogSearchConfigServerClass2.java |    76 +
 .../ambari-logsearch-config-zookeeper/pom.xml   |    10 +
 .../zookeeper/LogSearchConfigLogFeederZK.java   |   228 +
 .../zookeeper/LogSearchConfigServerZK.java      |   138 +
 .../config/zookeeper/LogSearchConfigZK.java     |   159 +-
 .../model/inputconfig/impl/ConditionsImpl.java  |    50 +
 .../model/inputconfig/impl/FieldsImpl.java      |    53 +
 .../model/inputconfig/impl/FilterAdapter.java   |    42 +
 .../inputconfig/impl/FilterDescriptorImpl.java  |   164 +
 .../impl/FilterGrokDescriptorImpl.java          |    91 +
 .../impl/FilterJsonDescriptorImpl.java          |    25 +
 .../impl/FilterKeyValueDescriptorImpl.java      |    91 +
 .../model/inputconfig/impl/InputAdapter.java    |    58 +
 .../model/inputconfig/impl/InputConfigGson.java |    46 +
 .../model/inputconfig/impl/InputConfigImpl.java |    72 +
 .../inputconfig/impl/InputDescriptorImpl.java   |   293 +
 .../impl/InputFileBaseDescriptorImpl.java       |    93 +
 .../impl/InputFileDescriptorImpl.java           |    25 +
 .../impl/InputS3FileDescriptorImpl.java         |    69 +
 .../impl/MapAnonymizeDescriptorImpl.java        |    76 +
 .../inputconfig/impl/MapDateDescriptorImpl.java |    76 +
 .../impl/MapFieldCopyDescriptorImpl.java        |    57 +
 .../impl/MapFieldDescriptorImpl.java            |    33 +
 .../impl/MapFieldNameDescriptorImpl.java        |    57 +
 .../impl/MapFieldValueDescriptorImpl.java       |    76 +
 .../inputconfig/impl/PostMapValuesAdapter.java  |   102 +
 .../inputconfig/impl/PostMapValuesImpl.java     |    40 +
 .../impl/OutputSolrPropertiesImpl.java          |    46 +
 ambari-logsearch/ambari-logsearch-it/pom.xml    |   208 +-
 .../logsearch/domain/StoryDataRegistry.java     |    43 +-
 .../logsearch/steps/AbstractLogSearchSteps.java |   161 +
 .../logsearch/steps/LogSearchApiSteps.java      |     6 +-
 .../logsearch/steps/LogSearchDockerSteps.java   |   199 +-
 .../logsearch/steps/LogSearchUISteps.java       |   210 +
 .../ambari/logsearch/steps/SolrSteps.java       |     4 +-
 .../logsearch/story/LogSearchApiQueryStory.java |    22 -
 .../story/LogSearchBackendStories.java          |    75 +
 .../ambari/logsearch/story/LogSearchStory.java  |    60 -
 .../logsearch/story/LogSearchStoryLocator.java  |    97 +
 .../logsearch/story/LogSearchUIStories.java     |    92 +
 .../logsearch/story/LogfeederParsingStory.java  |    22 -
 .../ambari/logsearch/web/AbstractPage.java      |    63 +
 .../org/apache/ambari/logsearch/web/Home.java   |    39 +
 .../story/log_search_api_query_story.story      |    17 -
 .../story/logfeeder_parsing_story.story         |    20 -
 .../stories/backend/log_search_api_tests.story  |    17 +
 .../backend/logfeeder_parsing_tests.story       |    20 +
 .../resources/stories/selenium/login.ui.story   |    20 +
 .../ambari-logsearch-logfeeder/README.md        |    28 +-
 .../ambari-logsearch-logfeeder/build.properties |     2 +-
 .../ambari-logsearch-logfeeder/docs/filter.md   |    61 +
 .../ambari-logsearch-logfeeder/docs/input.md    |    61 +
 .../docs/inputConfig.md                         |    29 +
 .../docs/postMapValues.md                       |    70 +
 .../ambari-logsearch-logfeeder/pom.xml          |    15 +-
 .../org/apache/ambari/logfeeder/LogFeeder.java  |   101 +-
 .../ambari/logfeeder/LogFeederCommandLine.java  |   168 +
 .../ambari/logfeeder/common/ConfigBlock.java    |   107 +-
 .../ambari/logfeeder/common/ConfigHandler.java  |   194 +-
 .../ambari/logfeeder/common/ConfigItem.java     |    97 +
 .../logfeeder/common/LogEntryParseTester.java   |   127 +
 .../logfeeder/common/LogFeederConstants.java    |     2 +-
 .../logfeeder/common/LogFeederException.java    |    31 +
 .../logfeeder/common/LogfeederException.java    |    31 -
 .../apache/ambari/logfeeder/filter/Filter.java  |    59 +-
 .../ambari/logfeeder/filter/FilterGrok.java     |    26 +-
 .../ambari/logfeeder/filter/FilterJSON.java     |     9 +-
 .../ambari/logfeeder/filter/FilterKeyValue.java |    18 +-
 .../logfeeder/input/AbstractInputFile.java      |   167 +-
 .../apache/ambari/logfeeder/input/Input.java    |   145 +-
 .../logfeeder/input/InputConfigUploader.java    |    17 +-
 .../ambari/logfeeder/input/InputFile.java       |    29 +-
 .../ambari/logfeeder/input/InputManager.java    |   143 +-
 .../ambari/logfeeder/input/InputS3File.java     |    22 +-
 .../ambari/logfeeder/input/InputSimulate.java   |    39 +-
 .../logfeeder/logconfig/FilterLogData.java      |    87 -
 .../logfeeder/logconfig/LogConfigFetcher.java   |   168 -
 .../logfeeder/logconfig/LogConfigHandler.java   |   213 -
 .../logfeeder/logconfig/LogFeederFilter.java    |    90 -
 .../logconfig/LogFeederFilterWrapper.java       |    55 -
 .../logfeeder/loglevelfilter/FilterLogData.java |    73 +
 .../loglevelfilter/LogLevelFilterHandler.java   |   156 +
 .../apache/ambari/logfeeder/mapper/Mapper.java  |     4 +-
 .../logfeeder/mapper/MapperAnonymize.java       |   120 +
 .../ambari/logfeeder/mapper/MapperDate.java     |    59 +-
 .../logfeeder/mapper/MapperFieldCopy.java       |    13 +-
 .../logfeeder/mapper/MapperFieldName.java       |    14 +-
 .../logfeeder/mapper/MapperFieldValue.java      |    14 +-
 .../logfeeder/metrics/LogFeederAMSClient.java   |    22 +-
 .../logfeeder/metrics/MetricsManager.java       |    25 +-
 .../apache/ambari/logfeeder/output/Output.java  |    39 +-
 .../ambari/logfeeder/output/OutputHDFSFile.java |    11 +-
 .../logfeeder/output/OutputLineFilter.java      |     2 +-
 .../ambari/logfeeder/output/OutputManager.java  |    21 +-
 .../ambari/logfeeder/output/OutputS3File.java   |    99 +-
 .../ambari/logfeeder/output/OutputSolr.java     |   203 +-
 .../apache/ambari/logfeeder/util/AliasUtil.java |     6 +-
 .../apache/ambari/logfeeder/util/FileUtil.java  |    45 +-
 .../logfeeder/util/LogFeederHDFSUtil.java       |    77 +
 .../logfeeder/util/LogFeederPropertiesUtil.java |   498 +
 .../ambari/logfeeder/util/LogFeederUtil.java    |   230 +-
 .../logfeeder/util/LogfeederHDFSUtil.java       |    77 -
 .../apache/ambari/logfeeder/util/SSLUtil.java   |     5 +-
 .../src/main/resources/alias_config.json        |     3 +
 .../src/main/resources/grok-patterns            |     2 +-
 .../src/main/resources/log4j.xml                |     3 +-
 .../src/main/scripts/run.sh                     |     4 +-
 .../ambari/logfeeder/filter/FilterGrokTest.java |    37 +-
 .../ambari/logfeeder/filter/FilterJSONTest.java |    28 +-
 .../logfeeder/filter/FilterKeyValueTest.java    |    41 +-
 .../ambari/logfeeder/input/InputFileTest.java   |    21 +-
 .../logfeeder/input/InputManagerTest.java       |    27 -
 .../logconfig/LogConfigHandlerTest.java         |   110 +-
 .../logfeeder/mapper/MapperAnonymizeTest.java   |    79 +
 .../ambari/logfeeder/mapper/MapperDateTest.java |    44 +-
 .../logfeeder/mapper/MapperFieldCopyTest.java   |    19 +-
 .../logfeeder/mapper/MapperFieldNameTest.java   |    19 +-
 .../logfeeder/mapper/MapperFieldValueTest.java  |    29 +-
 .../logfeeder/metrics/MetrcisManagerTest.java   |   128 -
 .../logfeeder/metrics/MetricsManagerTest.java   |   126 +
 .../logfeeder/output/OutputLineFilterTest.java  |    22 +-
 .../logfeeder/output/OutputManagerTest.java     |    10 +-
 .../logfeeder/output/OutputS3FileTest.java      |    17 +-
 .../ambari/logfeeder/output/OutputSolrTest.java |    29 +-
 .../src/test/resources/log4j.xml                |     2 +-
 .../src/test/resources/logfeeder.properties     |     2 +-
 .../resources/samples/config/config_audit.json  |   339 +-
 .../samples/config/config_service.json          |    79 +-
 .../ambari-logsearch-server/build.properties    |     2 +-
 .../ambari-logsearch-server/build.xml           |     3 +
 .../ambari-logsearch-server/pom.xml             |   504 +-
 ambari-logsearch/ambari-logsearch-server/run.sh |     6 +-
 .../configsets/audit_logs/conf/solrconfig.xml   |     3 +-
 .../configsets/hadoop_logs/conf/solrconfig.xml  |     3 +-
 .../main/configsets/history/conf/solrconfig.xml |     3 +-
 .../org/apache/ambari/logsearch/LogSearch.java  |   172 +-
 .../auth/filter/AbstractJWTFilter.java          |   193 +
 .../auth/model/JWTAuthenticationToken.java      |    47 +
 .../ambari/logsearch/common/ApiDocStorage.java  |    90 +
 .../logsearch/common/ExternalServerClient.java  |    24 +-
 .../logsearch/common/LogSearchConstants.java    |     2 +
 .../ambari/logsearch/common/MessageEnums.java   |     3 +-
 .../logsearch/common/PropertiesHelper.java      |   141 -
 .../common/PropertyDescriptionStorage.java      |   101 +
 .../common/ShipperConfigDescriptionStorage.java |    67 +
 .../logsearch/common/XMLPropertiesHelper.java   |    79 -
 .../ambari/logsearch/conf/ApiDocConfig.java     |    39 +-
 .../logsearch/conf/ApplicationConfig.java       |    11 +-
 .../ambari/logsearch/conf/AuthPropsConfig.java  |   122 +
 .../conf/LogSearchConfigMapHolder.java          |    61 +
 .../logsearch/conf/LogSearchHttpConfig.java     |    83 +
 .../conf/LogSearchHttpHeaderConfig.java         |    31 +
 .../conf/LogSearchJerseyResourceConfig.java     |    37 +
 .../logsearch/conf/LogSearchServletConfig.java  |    95 +
 .../logsearch/conf/LogSearchSpnegoConfig.java   |   173 +
 .../logsearch/conf/LogSearchSslConfig.java      |    86 +
 .../ambari/logsearch/conf/SecurityConfig.java   |    68 +-
 .../logsearch/conf/SolrAuditLogPropsConfig.java |    81 +
 .../ambari/logsearch/conf/SolrConfig.java       |    12 +-
 .../conf/SolrConnectionPropsConfig.java         |    28 +
 .../conf/SolrEventHistoryPropsConfig.java       |   153 +
 .../logsearch/conf/SolrKerberosConfig.java      |    17 +
 .../ambari/logsearch/conf/SolrPropsConfig.java  |     2 +
 .../conf/SolrServiceLogPropsConfig.java         |    43 +
 .../logsearch/conf/SolrUserPropsConfig.java     |   116 -
 .../conf/StaticResourceConfiguration.java       |    49 +
 .../conf/global/SolrEventHistoryState.java      |    60 +
 .../conf/global/SolrUserConfigState.java        |    60 -
 .../configurer/LogSearchConfigConfigurer.java   |    24 +-
 .../configurer/LogfeederFilterConfigurer.java   |    66 -
 .../configurer/SolrAuditAliasConfigurer.java    |     4 +-
 .../configurer/SolrCollectionConfigurer.java    |    17 +-
 .../logsearch/configurer/SslConfigurer.java     |   363 +
 .../AbstractLogRequestFacetQueryConverter.java  |     2 +
 .../EventHistoryRequestQueryConverter.java      |    67 +
 .../UserConfigRequestQueryConverter.java        |    67 -
 .../ambari/logsearch/dao/AuditSolrDao.java      |     2 +-
 .../logsearch/dao/EventHistorySolrDao.java      |   117 +
 .../logsearch/dao/ServiceLogsSolrDao.java       |     2 +-
 .../ambari/logsearch/dao/SolrDaoBase.java       |    22 +-
 .../logsearch/dao/SolrSchemaFieldDao.java       |    13 +-
 .../ambari/logsearch/dao/UserConfigSolrDao.java |   196 -
 .../ambari/logsearch/doc/DocConstants.java      |    29 +-
 .../handler/AbstractSolrConfigHandler.java      |     8 +
 .../handler/CreateCollectionHandler.java        |    44 +-
 .../handler/ListCollectionHandler.java          |     1 +
 .../handler/ReloadCollectionHandler.java        |     5 +-
 .../handler/UploadConfigurationHandler.java     |    60 +-
 .../health/AbstractSolrHealthIndicator.java     |    59 +
 .../health/SolrAuditLogsHealthIndicator.java    |    38 +
 .../health/SolrEventHistoryHealthIndicator.java |    37 +
 .../health/SolrServiceLogsHealthIndicator.java  |    38 +
 .../logsearch/manager/AuditLogsManager.java     |    11 +-
 .../logsearch/manager/EventHistoryManager.java  |   199 +
 .../ambari/logsearch/manager/InfoManager.java   |    87 +
 .../ambari/logsearch/manager/ManagerBase.java   |     5 +-
 .../ambari/logsearch/manager/PublicManager.java |    48 -
 .../logsearch/manager/ServiceLogsManager.java   |    62 +-
 .../logsearch/manager/ShipperConfigManager.java |   101 +-
 .../logsearch/manager/UserConfigManager.java    |   223 -
 .../model/common/LSServerConditions.java        |    48 +
 .../logsearch/model/common/LSServerFields.java  |    49 +
 .../logsearch/model/common/LSServerFilter.java  |   139 +
 .../common/LSServerFilterDeserializer.java      |    60 +
 .../model/common/LSServerFilterGrok.java        |    79 +
 .../model/common/LSServerFilterJson.java        |    33 +
 .../model/common/LSServerFilterKeyValue.java    |    73 +
 .../logsearch/model/common/LSServerInput.java   |   148 +
 .../model/common/LSServerInputConfig.java       |   100 +
 .../model/common/LSServerInputDeserializer.java |    62 +
 .../model/common/LSServerInputFile.java         |    33 +
 .../model/common/LSServerInputFileBase.java     |    74 +
 .../model/common/LSServerInputS3File.java       |    65 +
 .../model/common/LSServerLogLevelFilter.java    |   114 +
 .../model/common/LSServerLogLevelFilterMap.java |    70 +
 .../logsearch/model/common/LSServerMapDate.java |    63 +
 .../model/common/LSServerMapField.java          |    33 +
 .../model/common/LSServerMapFieldAnonymize.java |    65 +
 .../model/common/LSServerMapFieldCopy.java      |    54 +
 .../model/common/LSServerMapFieldName.java      |    54 +
 .../model/common/LSServerMapFieldValue.java     |    67 +
 .../model/common/LSServerPostMapValues.java     |    73 +
 .../model/common/LSServerPostMapValuesList.java |    59 +
 .../LSServerPostMapValuesListDeserializer.java  |    83 +
 .../LSServerPostMapValuesListSerializer.java    |    44 +
 .../model/common/LogFeederDataMap.java          |    50 -
 .../model/common/LogfeederFilterData.java       |    87 -
 .../request/EventHistoryParamDefinition.java    |    38 +
 .../request/UserConfigParamDefinition.java      |    38 -
 .../model/request/impl/EventHistoryRequest.java |    53 +
 .../model/request/impl/UserConfigRequest.java   |    53 -
 .../model/response/EventHistoryData.java        |    97 +
 .../response/EventHistoryDataListResponse.java  |    55 +
 .../model/response/PropertyDescriptionData.java |    62 +
 .../response/ShipperConfigDescriptionData.java  |    52 +
 .../model/response/UserConfigData.java          |    97 -
 .../response/UserConfigDataListResponse.java    |    55 -
 .../logsearch/rest/AuditLogsResource.java       |     2 +-
 .../logsearch/rest/EventHistoryResource.java    |    82 +
 .../ambari/logsearch/rest/InfoResource.java     |    91 +
 .../ambari/logsearch/rest/PublicResource.java   |    48 -
 .../logsearch/rest/ShipperConfigResource.java   |    74 +-
 .../ambari/logsearch/rest/StatusResource.java   |    16 +-
 .../ambari/logsearch/rest/SwaggerResource.java  |    56 +
 .../logsearch/rest/UserConfigResource.java      |   100 -
 .../logsearch/solr/ResponseDataGenerator.java   |     3 +-
 .../ambari/logsearch/solr/SolrConstants.java    |     4 +-
 .../apache/ambari/logsearch/util/SSLUtil.java   |   363 -
 .../apache/ambari/logsearch/util/WebUtil.java   |    65 -
 .../LogsearchAuthSuccessHandler.java            |     4 -
 .../LogsearchLogoutSuccessHandler.java          |     1 -
 .../web/filters/LogSearchConfigStateFilter.java |   102 +
 .../LogsearchEventHistoryStateFilter.java       |    52 +
 .../web/filters/LogsearchJWTFilter.java         |   150 +-
 .../LogsearchKRBAuthenticationFilter.java       |    42 +-
 .../web/filters/LogsearchKrbFilter.java         |    62 +-
 .../filters/LogsearchUserConfigStateFilter.java |    52 -
 .../web/listener/LogSearchSessionListener.java  |     4 +-
 .../web/model/JWTAuthenticationToken.java       |    53 -
 .../logsearch/web/security/LdapProperties.java  |   365 -
 .../web/security/LdapPropertyName.java          |    58 -
 .../ambari/logsearch/web/security/LdapUtil.java |   115 -
 ...LogsearchAbstractAuthenticationProvider.java |     2 +-
 .../LogsearchAuthenticationProvider.java        |     4 -
 ...rchExternalServerAuthenticationProvider.java |    23 +-
 .../LogsearchLdapAuthenticationProvider.java    |   187 -
 .../LogsearchLdapBindAuthenticator.java         |    46 -
 .../src/main/resources/default.properties       |    26 +-
 .../src/main/resources/info.properties          |    17 +
 .../src/main/resources/log4j.xml                |   170 +-
 .../src/main/resources/logsearch-admin-site.xml |   116 -
 .../src/main/resources/logsearch.properties     |     9 +-
 .../src/main/resources/swagger/swagger.html     |    36 +-
 .../src/main/scripts/run.sh                     |     3 +-
 .../EventHistoryRequestQueryConverterTest.java  |    50 +
 .../UserConfigRequestQueryConverterTest.java    |    50 -
 .../LogsearchAuthenticationProviderTest.java    |    68 +-
 ...xternalServerAuthenticationProviderTest.java |     4 +
 ...LogsearchLdapAuthenticationProviderTest.java |    61 -
 .../ambari-logsearch-web/.angular-cli.json      |    42 +
 ambari-logsearch/ambari-logsearch-web/.bowerrc  |     3 -
 .../ambari-logsearch-web/.editorconfig          |    13 +
 .../ambari-logsearch-web/.gitignore             |    43 +-
 .../ambari-logsearch-web/Gruntfile.js           |   139 -
 .../ambari-logsearch-web/LICENSE.txt            |   339 -
 ambari-logsearch/ambari-logsearch-web/README.md |    28 +
 .../ambari-logsearch-web/bower.json             |    39 -
 .../ambari-logsearch-web/build.properties       |    12 -
 ambari-logsearch/ambari-logsearch-web/build.xml |    37 -
 .../ambari-logsearch-web/e2e/app.e2e-spec.ts    |    32 +
 .../ambari-logsearch-web/e2e/app.po.ts          |    29 +
 .../ambari-logsearch-web/e2e/tsconfig.e2e.json  |    12 +
 .../ambari-logsearch-web/karma.conf.js          |    62 +
 .../ambari-logsearch-web/package.json           |    98 +-
 ambari-logsearch/ambari-logsearch-web/pom.xml   |   143 +-
 .../ambari-logsearch-web/protractor.conf.js     |    48 +
 .../ambari-logsearch-web/src/app/app.module.ts  |   179 +
 .../src/app/classes/list-item.class.ts          |    25 +
 .../queries/audit-logs-query-params.class.ts    |    46 +
 .../app/classes/queries/query-params.class.ts   |    23 +
 ...ce-logs-histogram-query-params.class.spec.ts |   203 +
 ...service-logs-histogram-query-params.class.ts |    70 +
 .../queries/service-logs-query-params.class.ts  |    30 +
 .../accordion-panel.component.html              |    25 +
 .../accordion-panel.component.less              |    42 +
 .../accordion-panel.component.spec.ts           |    42 +
 .../accordion-panel.component.ts                |    33 +
 .../src/app/components/app.component.html       |    34 +
 .../src/app/components/app.component.less       |    51 +
 .../src/app/components/app.component.spec.ts    |    61 +
 .../src/app/components/app.component.ts         |    45 +
 .../date-picker/date-picker.component.html      |    25 +
 .../date-picker/date-picker.component.spec.ts   |    51 +
 .../date-picker/date-picker.component.ts        |    73 +
 .../dropdown-button.component.html              |    30 +
 .../dropdown-button.component.less              |    36 +
 .../dropdown-button.component.spec.ts           |    94 +
 .../dropdown-button.component.ts                |   106 +
 .../dropdown-list/dropdown-list.component.html  |    34 +
 .../dropdown-list/dropdown-list.component.less  |    41 +
 .../dropdown-list.component.spec.ts             |   120 +
 .../dropdown-list/dropdown-list.component.ts    |    64 +
 .../filter-button.component.spec.ts             |    94 +
 .../filter-button/filter-button.component.ts    |    81 +
 .../filter-dropdown.component.spec.ts           |   104 +
 .../filter-dropdown.component.ts                |    63 +
 .../filters-panel/filters-panel.component.html  |    50 +
 .../filters-panel/filters-panel.component.less  |    69 +
 .../filters-panel.component.spec.ts             |   107 +
 .../filters-panel/filters-panel.component.ts    |    96 +
 .../login-form/login-form.component.html        |    33 +
 .../login-form/login-form.component.less        |    22 +
 .../login-form/login-form.component.spec.ts     |   111 +
 .../login-form/login-form.component.ts          |    59 +
 .../logs-container.component.html               |    27 +
 .../logs-container.component.less               |    29 +
 .../logs-container.component.spec.ts            |   104 +
 .../logs-container/logs-container.component.ts  |   115 +
 .../logs-list/logs-list.component.html          |    65 +
 .../logs-list/logs-list.component.less          |   141 +
 .../logs-list/logs-list.component.spec.ts       |    92 +
 .../components/logs-list/logs-list.component.ts |   126 +
 .../main-container.component.html               |    24 +
 .../main-container.component.less               |    24 +
 .../main-container.component.spec.ts            |    65 +
 .../main-container/main-container.component.ts  |    66 +
 .../menu-button/menu-button.component.html      |    28 +
 .../menu-button/menu-button.component.less      |    33 +
 .../menu-button/menu-button.component.spec.ts   |   168 +
 .../menu-button/menu-button.component.ts        |    98 +
 .../app/components/modal/modal.component.html   |    40 +
 .../components/modal/modal.component.spec.ts    |    45 +
 .../src/app/components/modal/modal.component.ts |   122 +
 .../components/node-bar/node-bar.component.html |    19 +
 .../components/node-bar/node-bar.component.less |    39 +
 .../node-bar/node-bar.component.spec.ts         |    43 +
 .../components/node-bar/node-bar.component.ts   |    35 +
 .../pagination-controls.component.html          |    23 +
 .../pagination-controls.component.less          |    23 +
 .../pagination-controls.component.spec.ts       |    43 +
 .../pagination-controls.component.ts            |    73 +
 .../pagination/pagination.component.html        |    24 +
 .../pagination/pagination.component.less        |    28 +
 .../pagination/pagination.component.spec.ts     |    52 +
 .../pagination/pagination.component.ts          |    72 +
 .../search-box/search-box.component.html        |    32 +
 .../search-box/search-box.component.less        |   122 +
 .../search-box/search-box.component.spec.ts     |    51 +
 .../search-box/search-box.component.ts          |   212 +
 .../time-histogram.component.html               |    18 +
 .../time-histogram.component.less               |    29 +
 .../time-histogram.component.spec.ts            |    53 +
 .../time-histogram/time-histogram.component.ts  |   161 +
 .../time-range-picker.component.html            |    41 +
 .../time-range-picker.component.less            |    35 +
 .../time-range-picker.component.spec.ts         |    73 +
 .../time-range-picker.component.ts              |   103 +
 .../timezone-picker.component.html              |    26 +
 .../timezone-picker.component.less              |    45 +
 .../timezone-picker.component.spec.ts           |    96 +
 .../timezone-picker.component.ts                |    77 +
 .../components/top-menu/top-menu.component.html |    21 +
 .../components/top-menu/top-menu.component.less |    22 +
 .../top-menu/top-menu.component.spec.ts         |    47 +
 .../components/top-menu/top-menu.component.ts   |   122 +
 .../src/app/components/variables.less           |   140 +
 .../ambari-logsearch-web/src/app/mock-data.ts   |  1067 +
 .../src/app/models/app-settings.model.ts        |    27 +
 .../src/app/models/app-state.model.ts           |    35 +
 .../src/app/models/audit-log-field.model.ts     |   225 +
 .../src/app/models/audit-log.model.ts           |    46 +
 .../src/app/models/bar-graph.model.ts           |    24 +
 .../src/app/models/common-entry.model.ts        |    22 +
 .../src/app/models/count.model.ts               |    22 +
 .../src/app/models/filter.model.ts              |    25 +
 .../src/app/models/graph.model.ts               |    23 +
 .../src/app/models/log-field.model.ts           |    27 +
 .../src/app/models/log.model.ts                 |    37 +
 .../src/app/models/node.model.ts                |    29 +
 .../src/app/models/service-log-field.model.ts   |   107 +
 .../src/app/models/service-log.model.ts         |    27 +
 .../app/models/solr-collection-state.model.ts   |    23 +
 .../src/app/models/store.model.ts               |   169 +
 .../src/app/models/user-config.model.ts         |    26 +
 .../src/app/pipes/timer-seconds.pipe.spec.ts    |    37 +
 .../src/app/pipes/timer-seconds.pipe.ts         |    41 +
 .../src/app/pipes/timezone-abbr.pipe.spec.ts    |    26 +
 .../src/app/pipes/timezone-abbr.pipe.ts         |    31 +
 .../services/component-actions.service.spec.ts  |    85 +
 .../app/services/component-actions.service.ts   |    70 +
 .../component-generator.service.spec.ts         |    84 +
 .../app/services/component-generator.service.ts |    57 +
 .../src/app/services/filtering.service.spec.ts  |    67 +
 .../src/app/services/filtering.service.ts       |   531 +
 .../app/services/http-client.service.spec.ts    |    67 +
 .../src/app/services/http-client.service.ts     |   138 +
 .../app/services/logs-container.service.spec.ts |    82 +
 .../src/app/services/logs-container.service.ts  |   147 +
 .../app/services/mock-api-data.service.spec.ts  |    81 +
 .../src/app/services/mock-api-data.service.ts   |   178 +
 .../services/storage/app-settings.service.ts    |    33 +
 .../app/services/storage/app-state.service.ts   |    33 +
 .../storage/audit-logs-fields.service.ts        |    32 +
 .../app/services/storage/audit-logs.service.ts  |    32 +
 .../app/services/storage/clusters.service.ts    |    32 +
 .../app/services/storage/components.service.ts  |    32 +
 .../src/app/services/storage/filters.service.ts |    33 +
 .../src/app/services/storage/graphs.service.ts  |    33 +
 .../src/app/services/storage/hosts.service.ts   |    32 +
 .../app/services/storage/reducers.service.ts    |    52 +
 .../storage/service-logs-fields.service.ts      |    32 +
 .../service-logs-histogram-data.service.ts      |    32 +
 .../services/storage/service-logs.service.ts    |    32 +
 .../services/storage/user-configs.service.ts    |    33 +
 .../src/app/services/utils.service.spec.ts      |    86 +
 .../src/app/services/utils.service.ts           |    63 +
 .../src/app/test-config.spec.ts                 |    36 +
 .../src/assets/i18n/en.json                     |   145 +
 .../src/environments/environment.prod.ts        |    21 +
 .../src/environments/environment.ts             |    21 +
 .../ambari-logsearch-web/src/favicon.ico        |   Bin 0 -> 1150 bytes
 .../ambari-logsearch-web/src/index.html         |    31 +
 .../ambari-logsearch-web/src/main.ts            |    29 +
 .../src/main/webapp/404.html                    |   170 -
 .../src/main/webapp/ajax_failure.jsp            |    31 -
 .../src/main/webapp/ajax_success.html           |    26 -
 .../src/main/webapp/favicon.ico                 |   Bin 1150 -> 0 bytes
 .../webapp/fonts/fontawesome/FontAwesome.otf    |   Bin 61896 -> 0 bytes
 .../fonts/fontawesome/fontawesome-webfont.eot   |   Bin 37405 -> 0 bytes
 .../fonts/fontawesome/fontawesome-webfont.svg   |   415 -
 .../fonts/fontawesome/fontawesome-webfont.ttf   |   Bin 79076 -> 0 bytes
 .../fonts/fontawesome/fontawesome-webfont.woff  |   Bin 43572 -> 0 bytes
 .../fonts/fontopensans/open-sans-300.woff       |   Bin 22656 -> 0 bytes
 .../fonts/fontopensans/open-sans-300i.woff      |   Bin 21524 -> 0 bytes
 .../fonts/fontopensans/open-sans-400.woff       |   Bin 21956 -> 0 bytes
 .../fonts/fontopensans/open-sans-400i.woff      |   Bin 21092 -> 0 bytes
 .../fonts/fontopensans/open-sans-600.woff       |   Bin 22604 -> 0 bytes
 .../fonts/fontopensans/open-sans-600i.woff      |   Bin 21252 -> 0 bytes
 .../fonts/fontopensans/open-sans-700.woff       |   Bin 22748 -> 0 bytes
 .../fonts/fontopensans/open-sans-700i.woff      |   Bin 21184 -> 0 bytes
 .../main/webapp/images/System-Settings-icon.png |   Bin 17540 -> 0 bytes
 .../src/main/webapp/images/avatar.png           |   Bin 761 -> 0 bytes
 .../src/main/webapp/images/blank.gif            |   Bin 43 -> 0 bytes
 .../src/main/webapp/images/blockLoading.gif     |   Bin 3209 -> 0 bytes
 .../src/main/webapp/images/body-bg.png          |   Bin 3375 -> 0 bytes
 .../src/main/webapp/images/cancel_search.png    |   Bin 541 -> 0 bytes
 .../src/main/webapp/images/clear.png            |   Bin 509 -> 0 bytes
 .../src/main/webapp/images/comp.png             |   Bin 1603 -> 0 bytes
 .../src/main/webapp/images/data-grey.png        |   Bin 1468 -> 0 bytes
 .../main/webapp/images/database_table_32.png    |   Bin 1329 -> 0 bytes
 .../src/main/webapp/images/error-404-icon.png   |   Bin 2529 -> 0 bytes
 .../src/main/webapp/images/error-500-icon.png   |   Bin 2986 -> 0 bytes
 .../src/main/webapp/images/folder-grey.png      |   Bin 1372 -> 0 bytes
 .../src/main/webapp/images/folder.png           |   Bin 920 -> 0 bytes
 .../src/main/webapp/images/folder2.png          |   Bin 946 -> 0 bytes
 .../src/main/webapp/images/form.png             |   Bin 3329 -> 0 bytes
 .../src/main/webapp/images/hbase.jpg            |   Bin 4575 -> 0 bytes
 .../src/main/webapp/images/hdfs.jpg             |   Bin 5232 -> 0 bytes
 .../src/main/webapp/images/hive.png             |   Bin 20483 -> 0 bytes
 .../src/main/webapp/images/hline.png            |   Bin 99 -> 0 bytes
 .../src/main/webapp/images/icon-collapse.png    |   Bin 18815 -> 0 bytes
 .../src/main/webapp/images/icon-expand.png      |   Bin 20092 -> 0 bytes
 .../src/main/webapp/images/knox.gif             |   Bin 2347 -> 0 bytes
 .../src/main/webapp/images/knox1.png            |   Bin 34126 -> 0 bytes
 .../src/main/webapp/images/loading.gif          |   Bin 1849 -> 0 bytes
 .../src/main/webapp/images/loading_game.gif     |   Bin 16098 -> 0 bytes
 .../src/main/webapp/images/logo-white.png       |   Bin 4538 -> 0 bytes
 .../src/main/webapp/images/logo.png             |   Bin 1168 -> 0 bytes
 .../src/main/webapp/images/router-grey.png      |   Bin 1533 -> 0 bytes
 .../src/main/webapp/images/search_glyph.png     |   Bin 420 -> 0 bytes
 .../src/main/webapp/images/sortingCollapse.png  |   Bin 13320 -> 0 bytes
 .../src/main/webapp/images/sortingExpand.png    |   Bin 13283 -> 0 bytes
 .../src/main/webapp/images/storm.png            |   Bin 6174 -> 0 bytes
 .../src/main/webapp/images/storm1.png           |   Bin 19620 -> 0 bytes
 .../src/main/webapp/images/task-grey.png        |   Bin 1187 -> 0 bytes
 .../src/main/webapp/images/timezone.png         |   Bin 353544 -> 0 bytes
 .../src/main/webapp/index.html                  |   108 -
 .../backbone-pageable/backbone-pageable.min.js  |     8 -
 .../webapp/libs/bower/backbone.fetch-cache.js   |   326 -
 .../src/main/webapp/libs/bower/d3/d3.tip.js     |   293 -
 .../webapp/libs/bower/dashboard/dashboard.js    |   393 -
 .../bower/font-awesome/css/font-awesome.css     |  1801 -
 .../bower/font-awesome/css/font-awesome.min.css |     4 -
 .../bower/font-awesome/fonts/FontAwesome.otf    |   Bin 61896 -> 0 bytes
 .../font-awesome/fonts/fontawesome-webfont.eot  |   Bin 37405 -> 0 bytes
 .../font-awesome/fonts/fontawesome-webfont.svg  |   415 -
 .../font-awesome/fonts/fontawesome-webfont.ttf  |   Bin 79076 -> 0 bytes
 .../font-awesome/fonts/fontawesome-webfont.woff |   Bin 43572 -> 0 bytes
 .../fonts/fontawesome-webfont.woff2             |   Bin 56780 -> 0 bytes
 .../libs/bower/font-awesome/less/animated.less  |    34 -
 .../font-awesome/less/bordered-pulled.less      |    16 -
 .../libs/bower/font-awesome/less/core.less      |    13 -
 .../bower/font-awesome/less/fixed-width.less    |     6 -
 .../bower/font-awesome/less/font-awesome.less   |    17 -
 .../libs/bower/font-awesome/less/icons.less     |   596 -
 .../libs/bower/font-awesome/less/larger.less    |    13 -
 .../libs/bower/font-awesome/less/list.less      |    19 -
 .../libs/bower/font-awesome/less/mixins.less    |    27 -
 .../libs/bower/font-awesome/less/path.less      |    15 -
 .../font-awesome/less/rotated-flipped.less      |    20 -
 .../libs/bower/font-awesome/less/stacked.less   |    20 -
 .../libs/bower/font-awesome/less/variables.less |   606 -
 .../libs/bower/font-awesome/scss/_animated.scss |    34 -
 .../font-awesome/scss/_bordered-pulled.scss     |    16 -
 .../libs/bower/font-awesome/scss/_core.scss     |    13 -
 .../bower/font-awesome/scss/_fixed-width.scss   |     6 -
 .../libs/bower/font-awesome/scss/_icons.scss    |   596 -
 .../libs/bower/font-awesome/scss/_larger.scss   |    13 -
 .../libs/bower/font-awesome/scss/_list.scss     |    19 -
 .../libs/bower/font-awesome/scss/_mixins.scss   |    27 -
 .../libs/bower/font-awesome/scss/_path.scss     |    15 -
 .../font-awesome/scss/_rotated-flipped.scss     |    20 -
 .../libs/bower/font-awesome/scss/_stacked.scss  |    20 -
 .../bower/font-awesome/scss/_variables.scss     |   606 -
 .../bower/font-awesome/scss/font-awesome.scss   |    17 -
 .../jquery-ui/css/images/animated-overlay.gif   |   Bin 1738 -> 0 bytes
 .../ui-bg_diagonals-thick_18_b81900_40x40.png   |   Bin 418 -> 0 bytes
 .../ui-bg_diagonals-thick_20_666666_40x40.png   |   Bin 312 -> 0 bytes
 .../css/images/ui-bg_flat_0_aaaaaa_40x100.png   |   Bin 180 -> 0 bytes
 .../css/images/ui-bg_flat_10_000000_40x100.png  |   Bin 205 -> 0 bytes
 .../css/images/ui-bg_glass_100_f6f6f6_1x400.png |   Bin 262 -> 0 bytes
 .../css/images/ui-bg_glass_100_fdf5ce_1x400.png |   Bin 348 -> 0 bytes
 .../css/images/ui-bg_glass_65_ffffff_1x400.png  |   Bin 207 -> 0 bytes
 .../ui-bg_gloss-wave_35_f6a828_500x100.png      |   Bin 5815 -> 0 bytes
 .../ui-bg_highlight-soft_100_eeeeee_1x100.png   |   Bin 278 -> 0 bytes
 .../ui-bg_highlight-soft_75_ffe45c_1x100.png    |   Bin 328 -> 0 bytes
 .../css/images/ui-icons_222222_256x240.png      |   Bin 6922 -> 0 bytes
 .../css/images/ui-icons_228ef1_256x240.png      |   Bin 4549 -> 0 bytes
 .../css/images/ui-icons_454545_256x240.png      |   Bin 4369 -> 0 bytes
 .../css/images/ui-icons_888888_256x240.png      |   Bin 4369 -> 0 bytes
 .../css/images/ui-icons_ef8c08_256x240.png      |   Bin 4549 -> 0 bytes
 .../css/images/ui-icons_ffd27a_256x240.png      |   Bin 4549 -> 0 bytes
 .../css/images/ui-icons_ffffff_256x240.png      |   Bin 6299 -> 0 bytes
 .../bower/jquery-ui/css/jquery-ui-1.11.4.css    |   850 -
 .../jquery-ui/css/jquery-ui-1.11.4.min.css      |     7 -
 .../bower/jquery-ui/css/jquery-ui-bootstrap.css |  2549 -
 .../libs/bower/jquery-ui/js/jquery-ui-1.11.4.js |  8772 ---
 .../bower/jquery-ui/js/jquery-ui-1.11.4.min.js  |    10 -
 .../src/main/webapp/libs/bower/loadCSS.js       |    73 -
 .../require-handlebars-plugin/Handlebars.js     |  2752 -
 .../webapp/libs/bower/select2/select2x2.png     |   Bin 845 -> 0 bytes
 .../libs/bower/sparkline/jquery.sparkline.js    |  3054 -
 .../Backgrid.ColumnManager.css                  |   114 -
 .../Backgrid.ColumnManager.js                   |  1045 -
 .../daterangepicker/css/daterangepicker.css     |   415 -
 .../daterangepicker/js/daterangepicker.js       |  1560 -
 .../libs/custom/timezone/WorldMapGenerator.js   |  3474 -
 .../libs/custom/timezone/jstz-1.0.4.min.js      |     2 -
 .../webapp/libs/custom/visualsearch/.bower.json |    45 -
 .../custom/visualsearch/models/search_facets.js |    67 -
 .../custom/visualsearch/models/search_query.js  |    70 -
 .../visualsearch/templates/search_box.jst       |     8 -
 .../visualsearch/templates/search_facet.jst     |     9 -
 .../visualsearch/templates/search_input.jst     |     1 -
 .../custom/visualsearch/templates/templates.js  |     7 -
 .../visualsearch/utils/backbone_extensions.js   |    17 -
 .../libs/custom/visualsearch/utils/hotkeys.js   |    99 -
 .../libs/custom/visualsearch/utils/inflector.js |    21 -
 .../visualsearch/utils/jquery_extensions.js     |   197 -
 .../custom/visualsearch/utils/search_parser.js  |    87 -
 .../custom/visualsearch/views/search_box.js     |   458 -
 .../custom/visualsearch/views/search_facet.js   |   442 -
 .../custom/visualsearch/views/search_input.js   |   418 -
 .../libs/custom/visualsearch/visualsearch.js    |  1984 -
 .../src/main/webapp/login.html                  |   155 -
 .../src/main/webapp/robots.txt                  |     3 -
 .../src/main/webapp/scripts/App.js              |    86 -
 .../src/main/webapp/scripts/Init.js             |   196 -
 .../src/main/webapp/scripts/Main.js             |    35 -
 .../src/main/webapp/scripts/RegionManager.js    |    83 -
 .../collection_bases/VAuditLogListBase.js       |    73 -
 .../collection_bases/VEventHistoryListBase.js   |    87 -
 .../scripts/collection_bases/VGroupListBase.js  |    82 -
 .../collection_bases/VLogLevelListBase.js       |    96 -
 .../scripts/collection_bases/VLogListBase.js    |   127 -
 .../collection_bases/VNameValueListBase.js      |    57 -
 .../scripts/collection_bases/VNodeListBase.js   |    74 -
 .../scripts/collections/BaseCollection.js       |   172 -
 .../scripts/collections/SchemaFieldList.js      |    29 -
 .../webapp/scripts/collections/VAuditLogList.js |    36 -
 .../scripts/collections/VEventHistoryList.js    |    33 -
 .../webapp/scripts/collections/VGroupList.js    |    36 -
 .../webapp/scripts/collections/VLogLevelList.js |    36 -
 .../main/webapp/scripts/collections/VLogList.js |    36 -
 .../scripts/collections/VNameValueList.js       |    36 -
 .../webapp/scripts/collections/VNodeList.js     |    36 -
 .../src/main/webapp/scripts/communicator.js     |    61 -
 .../webapp/scripts/controllers/Controller.js    |   240 -
 .../webapp/scripts/model_bases/VAuditLogBase.js |    61 -
 .../scripts/model_bases/VCommonModelBase.js     |    51 -
 .../scripts/model_bases/VEventHistoryBase.js    |    51 -
 .../scripts/model_bases/VGraphInfoBase.js       |    62 -
 .../webapp/scripts/model_bases/VGroupBase.js    |    51 -
 .../main/webapp/scripts/model_bases/VLogBase.js |    51 -
 .../webapp/scripts/model_bases/VLogLevelBase.js |    51 -
 .../scripts/model_bases/VNameValueBase.js       |    51 -
 .../webapp/scripts/model_bases/VNodeBase.js     |    51 -
 .../scripts/model_bases/VUserFilterBase.js      |    51 -
 .../src/main/webapp/scripts/models/BaseModel.js |   110 -
 .../src/main/webapp/scripts/models/VAppState.js |    44 -
 .../src/main/webapp/scripts/models/VAuditLog.js |    47 -
 .../main/webapp/scripts/models/VCommonModel.js  |    48 -
 .../main/webapp/scripts/models/VEventHistory.js |    48 -
 .../main/webapp/scripts/models/VGraphInfo.js    |    53 -
 .../src/main/webapp/scripts/models/VGroup.js    |    53 -
 .../src/main/webapp/scripts/models/VLog.js      |    66 -
 .../src/main/webapp/scripts/models/VLogLevel.js |    47 -
 .../main/webapp/scripts/models/VNameValue.js    |    47 -
 .../src/main/webapp/scripts/models/VNode.js     |    48 -
 .../main/webapp/scripts/models/VUserFilter.js   |    51 -
 .../main/webapp/scripts/modules/Overrides.js    |   234 -
 .../src/main/webapp/scripts/modules/Vent.js     |    26 -
 .../scripts/modules/globalize/message/en.js     |    79 -
 .../main/webapp/scripts/prelogin/Prelogin.js    |   130 -
 .../src/main/webapp/scripts/utils/Enums.js      |    32 -
 .../src/main/webapp/scripts/utils/Globals.js    |    91 -
 .../main/webapp/scripts/utils/LangSupport.js    |   151 -
 .../src/main/webapp/scripts/utils/Tour.js       |   461 -
 .../src/main/webapp/scripts/utils/Utils.js      |  1241 -
 .../src/main/webapp/scripts/utils/ViewUtils.js  |   266 -
 .../webapp/scripts/utils/XATemplateHelpers.js   |   170 -
 .../scripts/views/audit/AuditAggregatedView.js  |   416 -
 .../scripts/views/audit/AuditTabLayoutView.js   |   429 -
 .../scripts/views/common/AdvanceSearchLayout.js |   146 -
 .../webapp/scripts/views/common/BreadCrumbs.js  |    83 -
 .../scripts/views/common/CustomBackgrid.js      |   284 -
 .../scripts/views/common/DatePickerLayout.js    |   228 -
 .../webapp/scripts/views/common/ErrorView.js    |   100 -
 .../scripts/views/common/EventHistoryLayout.js  |   486 -
 .../main/webapp/scripts/views/common/Footer.js  |    80 -
 .../main/webapp/scripts/views/common/Header.js  |   481 -
 .../webapp/scripts/views/common/JBDialog.js     |   211 -
 .../scripts/views/common/LogSnapShotLayout.js   |   141 -
 .../webapp/scripts/views/common/ProfileBar.js   |   105 -
 .../main/webapp/scripts/views/common/Spinner.js |    85 -
 .../webapp/scripts/views/common/TableLayout.js  |   405 -
 .../webapp/scripts/views/common/TimerView.js    |   126 -
 .../main/webapp/scripts/views/common/TopNav.js  |    93 -
 .../dashboard/BubbleGraphTableLayoutView.js     |   716 -
 .../views/dashboard/ComponentListView.js        |   319 -
 .../scripts/views/dashboard/ComponentsView.js   |    98 -
 .../scripts/views/dashboard/DashboardView.js    |   184 -
 .../views/dashboard/GridTableLayoutView.js      |   219 -
 .../scripts/views/dashboard/HostListView.js     |   356 -
 .../webapp/scripts/views/dashboard/HostsView.js |    98 -
 .../scripts/views/dashboard/LogDetailView.js    |   249 -
 .../scripts/views/dashboard/LogLevelBoxView.js  |   155 -
 .../scripts/views/dashboard/LogLevelView.js     |   118 -
 .../scripts/views/dashboard/MainLayoutView.js   |   670 -
 .../views/dialog/ApplySearchFilterView.js       |   214 -
 .../scripts/views/dialog/DetailLogFileView.js   |   167 -
 .../dialog/GlobalExclusionCompositeView.js      |   141 -
 .../views/dialog/GlobalExclusionItemView.js     |    84 -
 .../views/dialog/GridGraphSettingView.js        |   476 -
 .../views/dialog/SaveSearchFilterView.js        |   120 -
 .../scripts/views/dialog/TimeZoneChangeView.js  |   101 -
 .../views/filter/CreateLogfeederFilterView.js   |   383 -
 .../scripts/views/graphs/GraphLayoutView.js     |   559 -
 .../scripts/views/graphs/GridGraphLayoutView.js |   594 -
 .../scripts/views/tabs/ComparisonLayoutView.js  |    93 -
 .../webapp/scripts/views/tabs/ComparisonView.js |   242 -
 .../views/tabs/EventHistoryLayoutView.js        |   506 -
 .../scripts/views/tabs/ExportLogFileView.js     |    50 -
 .../views/tabs/HierarchyTabLayoutView.js        |   429 -
 .../scripts/views/tabs/HostInfoTabLayoutView.js |   178 -
 .../webapp/scripts/views/tabs/LogFileView.js    |   864 -
 .../main/webapp/scripts/views/tabs/TreeView.js  |   365 -
 .../scripts/views/tabs/VisualSearchView.js      |   202 -
 .../troubleshoot/TroubleShootLayoutView.js      |   553 -
 .../src/main/webapp/static/schema_fields.json   |    90 -
 .../src/main/webapp/styles/animate.css          |  3272 -
 .../src/main/webapp/styles/app-font.css         |    64 -
 .../src/main/webapp/styles/bootstrap.css        |  6422 --
 .../src/main/webapp/styles/bootstrap.min.css    |  6422 --
 .../main/webapp/styles/custom/visualsearch.css  |   369 -
 .../src/main/webapp/styles/style.css            |  2964 -
 .../src/main/webapp/styles/style_v2.css         |  2596 -
 .../audit/AuditAggregatedView_tmpl.html         |    54 -
 .../audit/AuditTabLayoutView_tmpl.html          |   100 -
 .../common/AdvanceSearchLayout_tmpl.html        |    30 -
 .../templates/common/DatePickerLayout_tmpl.html |    29 -
 .../webapp/templates/common/ErrorView_tmpl.html |    28 -
 .../common/EventHistoryItemView_tmpl.html       |    32 -
 .../common/EventHistoryLayout_tmpl.html         |    44 -
 .../webapp/templates/common/Footer_tmpl.html    |    42 -
 .../webapp/templates/common/Header_tmpl.html    |    97 -
 .../common/LogSnapShotLayout_tmpl.html          |    23 -
 .../templates/common/TableLayout_tmpl.html      |    37 -
 .../webapp/templates/common/TimerView_tmpl.html |    25 -
 .../webapp/templates/common/TopNav_tmpl.html    |    52 -
 .../webapp/templates/common/breadcrumbs.html    |    46 -
 .../webapp/templates/common/formInputItem.html  |    54 -
 .../templates/common/formInputItemList.html     |    42 -
 .../webapp/templates/common/loading_tmpl.html   |    45 -
 .../BubbleGraphTableLayoutView_tmpl.html        |    79 -
 .../dashboard/ComponentListView_tmpl.html       |    35 -
 .../dashboard/ComponentsView_tmpl.html          |    57 -
 .../templates/dashboard/DashboardView_tmpl.html |   122 -
 .../dashboard/GridTableLayoutView_tmpl.html     |    28 -
 .../templates/dashboard/HostListView_tmpl.html  |    48 -
 .../templates/dashboard/HostsView_tmpl.html     |    56 -
 .../templates/dashboard/LogDetailView_tmpl.html |    75 -
 .../dashboard/LogLevelBoxView_tmpl.html         |    49 -
 .../templates/dashboard/LogLevelView_tmpl.html  |   110 -
 .../dashboard/MainLayoutView_tmpl.html          |   111 -
 .../dialog/ApplySearchFilterView_tmpl.html      |    30 -
 .../dialog/DetailLogFileView_tmpl.html          |    22 -
 .../GlobalExclusionCompositeView_tmpl.html      |    32 -
 .../dialog/GlobalExclusionItemView_tmpl.html    |    26 -
 .../dialog/GridGraphSettingView_tmpl.html       |   284 -
 .../dialog/SaveSearchFilterView_tmpl.html       |    70 -
 .../dialog/TimeZoneChangeView_tmpl.html         |   475 -
 .../filter/CreateLogfeederFilter_tmpl.html      |    53 -
 .../templates/graphs/GraphLayoutView_tmpl.html  |    50 -
 .../graphs/GridGraphLayoutView_tmpl.html        |    28 -
 .../src/main/webapp/templates/graphs/backup.js  |   586 -
 .../main/webapp/templates/helpers/Helpers.js    |   520 -
 .../tabs/ComparisonLayoutView_tmpl.html         |    20 -
 .../templates/tabs/ComparisonView_tmpl.html     |    56 -
 .../tabs/EventHistoryLayoutView_tmpl.html       |    45 -
 .../templates/tabs/ExportLogFileView_tmpl.html  |    46 -
 .../tabs/HierarchyTabLayoutView_tmpl.html       |   124 -
 .../tabs/HostInfoTabLayoutView_tmpl.html        |    46 -
 .../webapp/templates/tabs/LogFileView_tmpl.html |   122 -
 .../webapp/templates/tabs/TreeView_tmpl.html    |    54 -
 .../templates/tabs/VisualSearchView_tmpl.html   |    20 -
 .../TroubleShootLayoutView_tmpl.html            |   150 -
 .../main/webapp/themejs/1.3.0/bootstrap.min.js  |    19 -
 .../ambari-logsearch-web/src/polyfills.ts       |    86 +
 .../ambari-logsearch-web/src/styles.less        |    17 +
 .../ambari-logsearch-web/src/test.ts            |    47 +
 .../ambari-logsearch-web/src/tsconfig.app.json  |    13 +
 .../ambari-logsearch-web/src/tsconfig.spec.json |    20 +
 .../ambari-logsearch-web/src/typings.d.ts       |    23 +
 .../vendor/css/bootstrap-datetimepicker.min.css |     5 +
 .../src/vendor/css/bootstrap-logsearch.min.css  |    18 +
 .../vendor/css/fonts/Roboto-Regular-webfont.eot |   Bin 0 -> 79547 bytes
 .../vendor/css/fonts/Roboto-Regular-webfont.svg |  7606 +++
 .../vendor/css/fonts/Roboto-Regular-webfont.ttf |   Bin 0 -> 234464 bytes
 .../css/fonts/Roboto-Regular-webfont.woff       |   Bin 0 -> 105700 bytes
 .../src/vendor/js/WorldMapGenerator.min.js      |    11 +
 .../vendor/js/bootstrap-datetimepicker.min.js   |     2 +
 .../src/vendor/js/bootstrap-logsearch.min.js    |    19 +
 .../ambari-logsearch-web/tsconfig.json          |    31 +
 .../ambari-logsearch-web/tslint.json            |   116 +
 .../ambari-logsearch-web/webpack.config.js      |   539 +
 ambari-logsearch/ambari-logsearch-web/yarn.lock |  6617 ++
 ambari-logsearch/docker/Dockerfile              |    19 +-
 ambari-logsearch/docker/bin/start.sh            |    13 +-
 ambari-logsearch/docker/logsearch-docker.sh     |    44 +-
 .../test-config/logfeeder/logfeeder.properties  |     1 +
 .../logfeeder/shipper-conf/global.config.json   |     5 +-
 .../shipper-conf/input.config-hst.json          |     4 +-
 .../shipper-conf/input.config-zookeeper.json    |     4 +-
 .../logfeeder/shipper-conf/output.config.json   |    10 +-
 .../docker/test-config/logsearch/log4j.xml      |    35 +-
 .../test-config/logsearch/logsearch-env.sh      |     5 +-
 .../logsearch/logsearch-https.properties        |     5 +-
 .../test-config/logsearch/logsearch.properties  |     4 -
 .../docker/test-config/solr/solr-env-ssl.sh     |     1 +
 .../docker/test-config/solr/solr-env.sh         |     1 +
 ambari-logsearch/pom.xml                        |    18 +-
 ambari-metrics/ambari-metrics-assembly/pom.xml  |    22 +
 .../src/main/assembly/monitor-windows.xml       |     7 +
 .../src/main/assembly/monitor.xml               |     9 +-
 ambari-metrics/ambari-metrics-common/pom.xml    |     9 +
 .../timeline/AbstractTimelineMetricsSink.java   |   133 +-
 .../sink/timeline/AggregationResult.java        |    60 +
 .../sink/timeline/AppCookieManager.java         |   219 +
 .../metrics2/sink/timeline/MetricAggregate.java |   110 +
 .../sink/timeline/MetricClusterAggregate.java   |    73 +
 .../sink/timeline/MetricHostAggregate.java      |    81 +
 .../metrics2/sink/timeline/Precision.java       |     2 +-
 .../metrics2/sink/timeline/TimelineMetric.java  |     6 +-
 .../TimelineMetricWithAggregatedValues.java     |    65 +
 .../sink/timeline/AppCookieManagerTest.java     |    52 +
 .../AbstractTimelineMetricSinkTest.java         |    10 +
 .../availability/MetricCollectorHATest.java     |    10 +
 .../cache/HandleConnectExceptionTest.java       |    96 +-
 .../sink/flume/FlumeTimelineMetricsSink.java    |    26 +-
 .../ambari-metrics/datasource.js                |   182 +-
 .../ambari-metrics/partials/query.editor.html   |    14 +-
 .../ambari-metrics/queryCtrl.js                 |     9 +-
 .../timeline/HadoopTimelineMetricsSink.java     |    29 +-
 .../timeline/HadoopTimelineMetricsSinkTest.java |    14 +-
 .../conf/unix/log4j.properties                  |    31 +
 .../conf/windows/log4j.properties               |    29 +
 .../ambari-metrics-host-aggregator/pom.xml      |   138 +
 .../host/aggregator/AggregatorApplication.java  |   206 +
 .../host/aggregator/AggregatorWebService.java   |    56 +
 .../host/aggregator/TimelineMetricsHolder.java  |   108 +
 .../sink/timeline/AbstractMetricPublisher.java  |   169 +
 .../timeline/AggregatedMetricsPublisher.java    |   103 +
 .../sink/timeline/RawMetricsPublisher.java      |    65 +
 .../aggregator/AggregatorApplicationTest.java   |    55 +
 .../aggregator/AggregatorWebServiceTest.java    |   135 +
 .../aggregator/TimelineMetricsHolderTest.java   |   107 +
 .../timeline/AbstractMetricPublisherTest.java   |    82 +
 .../AggregatedMetricsPublisherTest.java         |   154 +
 .../sink/timeline/RawMetricsPublisherTest.java  |   151 +
 .../conf/unix/ambari-metrics-monitor            |    17 +-
 .../conf/unix/metric_monitor.ini                |     2 +
 .../ambari-metrics-host-monitoring/pom.xml      |     1 +
 .../src/main/python/core/aggregator.py          |   112 +
 .../main/python/core/application_metric_map.py  |     7 +-
 .../src/main/python/core/config_reader.py       |    49 +-
 .../src/main/python/core/controller.py          |    28 +
 .../src/main/python/core/emitter.py             |    70 +-
 .../src/main/python/core/krberr.py              |    42 +
 .../main/python/core/spnego_kerberos_auth.py    |   164 +
 .../src/main/python/core/stop_handler.py        |     3 +-
 .../src/main/python/main.py                     |     6 +-
 .../src/test/python/core/TestEmitter.py         |    24 +
 .../kafka/KafkaTimelineMetricsReporter.java     |    33 +-
 .../kafka/KafkaTimelineMetricsReporterTest.java |     4 +
 .../storm/StormTimelineMetricsReporter.java     |    23 +
 .../sink/storm/StormTimelineMetricsSink.java    |    21 +
 .../ambari-metrics-storm-sink/pom.xml           |     2 +-
 .../storm/StormTimelineMetricsReporter.java     |    22 +
 .../sink/storm/StormTimelineMetricsSink.java    |    22 +
 .../conf/unix/metrics_whitelist                 |   159 +-
 .../conf/windows/metrics_whitelist              |   159 +-
 .../ambari-metrics-timelineservice/pom.xml      |     8 +-
 .../timeline/HBaseTimelineMetricStore.java      |    98 +-
 .../metrics/timeline/PhoenixHBaseAccessor.java  |     8 +-
 .../timeline/TimelineMetricConfiguration.java   |    36 +
 .../metrics/timeline/TimelineMetricStore.java   |     4 +-
 .../timeline/TimelineMetricsAggregatorSink.java |     4 +-
 .../metrics/timeline/TimelineMetricsFilter.java |    24 +-
 .../timeline/aggregators/MetricAggregate.java   |   110 -
 .../aggregators/MetricClusterAggregate.java     |    73 -
 .../aggregators/MetricHostAggregate.java        |    81 -
 .../TimelineMetricAppAggregator.java            |     1 +
 .../TimelineMetricClusterAggregator.java        |    13 +-
 .../TimelineMetricClusterAggregatorSecond.java  |     1 +
 .../TimelineMetricHostAggregator.java           |     1 +
 .../aggregators/TimelineMetricReadHelper.java   |     2 +
 .../MetricCollectorHAController.java            |    42 +-
 .../webapp/TimelineWebServices.java             |    39 +-
 .../timeline/HBaseTimelineMetricStoreTest.java  |    36 +-
 .../timeline/ITPhoenixHBaseAccessor.java        |     4 +-
 .../metrics/timeline/MetricTestHelper.java      |     2 +-
 .../timeline/PhoenixHBaseAccessorTest.java      |     4 +-
 .../timeline/TestMetricHostAggregate.java       |     8 +-
 .../timeline/TestTimelineMetricStore.java       |     9 +-
 .../TimelineMetricsAggregatorMemorySink.java    |     4 +-
 .../timeline/TimelineMetricsFilterTest.java     |     3 +
 .../aggregators/ITClusterAggregator.java        |    12 +-
 .../aggregators/ITMetricAggregator.java         |    13 +-
 ...melineMetricClusterAggregatorSecondTest.java |     1 +
 ambari-metrics/pom.xml                          |   109 +-
 ambari-project/pom.xml                          |    78 +-
 ambari-server/checkstyle.xml                    |     9 +-
 ambari-server/conf/unix/ambari-env.sh           |     2 +-
 ambari-server/conf/unix/ambari.properties       |     4 +
 ambari-server/conf/unix/install-helper.sh       |    19 +-
 ambari-server/docs/api/generated/index.html     | 56183 +++++++++++++++++
 ambari-server/docs/api/generated/swagger.json   |  9285 +++
 ambari-server/docs/configuration/index.md       |    18 +-
 .../security/kerberos/kerberos_descriptor.md    |     5 +-
 ambari-server/pom.xml                           |   314 +-
 ambari-server/sbin/ambari-server                |    10 +-
 ambari-server/src/main/assemblies/server.xml    |    13 +-
 .../persist/jpa/AmbariJpaPersistModule.java     |     4 +-
 .../persist/jpa/AmbariJpaPersistService.java    |     2 +-
 .../apache/ambari/annotations/Experimental.java |     7 +-
 .../ambari/annotations/ExperimentalFeature.java |     9 +-
 .../org/apache/ambari/annotations/Markdown.java |     2 +-
 .../ambari/annotations/TransactionalLock.java   |     2 +-
 .../apache/ambari/server/AmbariException.java   |     2 +-
 .../org/apache/ambari/server/AmbariService.java |     2 +-
 .../ambari/server/ClusterNotFoundException.java |     2 +-
 .../server/ConfigGroupNotFoundException.java    |     2 +-
 .../ambari/server/DBConnectionVerification.java |     2 +-
 .../server/DuplicateResourceException.java      |     2 +-
 .../apache/ambari/server/EagerSingleton.java    |     2 +-
 .../ambari/server/HostNotFoundException.java    |     2 +-
 .../server/KdcServerConnectionVerification.java |     4 +-
 .../ambari/server/ObjectNotFoundException.java  |     2 +-
 .../server/ParentObjectNotFoundException.java   |     2 +-
 .../java/org/apache/ambari/server/Role.java     |     2 +-
 .../org/apache/ambari/server/RoleCommand.java   |     2 +-
 .../ServiceComponentHostNotFoundException.java  |     2 +-
 .../ServiceComponentNotFoundException.java      |     2 +-
 .../ambari/server/ServiceNotFoundException.java |     2 +-
 .../ambari/server/StackAccessException.java     |     2 +-
 .../ambari/server/StateRecoveryManager.java     |    34 +-
 .../apache/ambari/server/StaticallyInject.java  |     2 +-
 .../server/actionmanager/ActionDBAccessor.java  |     2 +-
 .../actionmanager/ActionDBAccessorImpl.java     |    30 +-
 .../server/actionmanager/ActionManager.java     |    16 +-
 .../server/actionmanager/ActionScheduler.java   |    86 +-
 .../ambari/server/actionmanager/ActionType.java |     2 +-
 .../actionmanager/ExecutionCommandWrapper.java  |   101 +-
 .../ExecutionCommandWrapperFactory.java         |     2 +-
 .../server/actionmanager/HostRoleCommand.java   |    12 +-
 .../server/actionmanager/HostRoleStatus.java    |     2 +-
 .../ambari/server/actionmanager/Request.java    |    26 +-
 .../server/actionmanager/RequestFactory.java    |     4 +-
 .../server/actionmanager/RequestStatus.java     |     2 +-
 .../ServiceComponentHostEventWrapper.java       |     6 +-
 .../ambari/server/actionmanager/Stage.java      |    39 +-
 .../server/actionmanager/StageFactory.java      |     1 -
 .../server/actionmanager/StageFactoryImpl.java  |     4 +-
 .../server/actionmanager/TargetHostType.java    |     2 +-
 .../apache/ambari/server/agent/ActionQueue.java |     6 +-
 .../ambari/server/agent/AgentCommand.java       |     2 +-
 .../apache/ambari/server/agent/AgentEnv.java    |     2 +-
 .../ambari/server/agent/AgentRequests.java      |    14 +-
 .../server/agent/AlertDefinitionCommand.java    |     9 +-
 .../server/agent/AlertExecutionCommand.java     |     2 +-
 .../ambari/server/agent/CancelCommand.java      |     2 +-
 .../ambari/server/agent/CommandReport.java      |     2 +-
 .../ambari/server/agent/CommandRepository.java  |   202 +
 .../server/agent/ComponentRecoveryReport.java   |     2 +-
 .../ambari/server/agent/ComponentStatus.java    |    30 +-
 .../ambari/server/agent/ComponentsResponse.java |     2 +-
 .../apache/ambari/server/agent/DiskInfo.java    |     2 +-
 .../ambari/server/agent/ExecutionCommand.java   |   140 +-
 .../apache/ambari/server/agent/HeartBeat.java   |     2 +-
 .../ambari/server/agent/HeartBeatHandler.java   |    82 +-
 .../ambari/server/agent/HeartBeatResponse.java  |     5 +-
 .../ambari/server/agent/HeartbeatMonitor.java   |    17 +-
 .../ambari/server/agent/HeartbeatProcessor.java |    76 +-
 .../apache/ambari/server/agent/HostInfo.java    |     4 +-
 .../apache/ambari/server/agent/HostStatus.java  |     2 +-
 .../ambari/server/agent/RecoveryConfig.java     |     2 +-
 .../server/agent/RecoveryConfigHelper.java      |     4 +-
 .../ambari/server/agent/RecoveryReport.java     |     2 +-
 .../apache/ambari/server/agent/Register.java    |     4 +-
 .../server/agent/RegistrationCommand.java       |     2 +-
 .../server/agent/RegistrationResponse.java      |     2 +-
 .../ambari/server/agent/RegistrationStatus.java |     2 +-
 .../ambari/server/agent/StatusCommand.java      |     2 +-
 .../ambari/server/agent/rest/AgentResource.java |    27 +-
 .../agent/stomp/AgentReportsController.java     |     6 +-
 .../agent/stomp/HostLevelParamsHolder.java      |     3 +-
 .../alerts/AgentHeartbeatAlertRunnable.java     |     2 +-
 .../ambari/server/alerts/AlertRunnable.java     |    29 +-
 .../alerts/AmbariPerformanceRunnable.java       |     2 +-
 .../alerts/ComponentVersionAlertRunnable.java   |   174 +
 .../server/alerts/StaleAlertRunnable.java       |     4 +-
 .../ambari/server/api/GsonJsonProvider.java     |     2 +-
 .../server/api/UserNameOverrideFilter.java      |     2 +-
 .../api/handlers/BaseManagementHandler.java     |     2 +-
 .../server/api/handlers/CreateHandler.java      |     2 +-
 .../server/api/handlers/DeleteHandler.java      |     2 +-
 .../server/api/handlers/QueryCreateHandler.java |     2 +-
 .../ambari/server/api/handlers/ReadHandler.java |     2 +-
 .../server/api/handlers/RequestHandler.java     |     2 +-
 .../server/api/handlers/UpdateHandler.java      |     6 +-
 .../api/predicate/InvalidQueryException.java    |     2 +-
 .../server/api/predicate/PredicateCompiler.java |     2 +-
 .../ambari/server/api/predicate/QueryLexer.java |     8 +-
 .../server/api/predicate/QueryParser.java       |     6 +-
 .../ambari/server/api/predicate/Token.java      |     2 +-
 .../expressions/AbstractExpression.java         |     2 +-
 .../api/predicate/expressions/Expression.java   |     2 +-
 .../expressions/LogicalExpression.java          |     4 +-
 .../expressions/LogicalExpressionFactory.java   |     2 +-
 .../expressions/NotLogicalExpression.java       |     2 +-
 .../expressions/RelationalExpression.java       |     2 +-
 .../predicate/operators/AbstractOperator.java   |     2 +-
 .../api/predicate/operators/AndOperator.java    |     2 +-
 .../api/predicate/operators/EqualsOperator.java |     2 +-
 .../api/predicate/operators/FilterOperator.java |     2 +-
 .../operators/GreaterEqualsOperator.java        |     2 +-
 .../predicate/operators/GreaterOperator.java    |     2 +-
 .../api/predicate/operators/InOperator.java     |     4 +-
 .../predicate/operators/IsEmptyOperator.java    |     2 +-
 .../predicate/operators/LessEqualsOperator.java |     2 +-
 .../api/predicate/operators/LessOperator.java   |     2 +-
 .../predicate/operators/LogicalOperator.java    |     2 +-
 .../operators/LogicalOperatorFactory.java       |     2 +-
 .../predicate/operators/NotEqualsOperator.java  |     2 +-
 .../api/predicate/operators/NotOperator.java    |     2 +-
 .../api/predicate/operators/Operator.java       |     2 +-
 .../api/predicate/operators/OrOperator.java     |     2 +-
 .../predicate/operators/RelationalOperator.java |     2 +-
 .../operators/RelationalOperatorFactory.java    |     2 +-
 .../query/ExtendedResourcePredicateVisitor.java |     2 +-
 .../server/api/query/JpaPredicateVisitor.java   |    12 +-
 .../ambari/server/api/query/JpaSortBuilder.java |     2 +-
 .../api/query/ProcessingPredicateVisitor.java   |     2 +-
 .../apache/ambari/server/api/query/Query.java   |     2 +-
 .../ambari/server/api/query/QueryImpl.java      |    10 +-
 .../ambari/server/api/query/QueryInfo.java      |     2 +-
 .../api/query/SubResourcePredicateVisitor.java  |     2 +-
 .../api/query/render/AlertStateSummary.java     |     2 +-
 .../api/query/render/AlertStateValues.java      |     2 +-
 .../render/AlertSummaryGroupedRenderer.java     |     2 +-
 .../api/query/render/AlertSummaryRenderer.java  |     2 +-
 .../server/api/query/render/BaseRenderer.java   |     2 +-
 .../query/render/ClusterBlueprintRenderer.java  |    23 +-
 .../api/query/render/DefaultRenderer.java       |     2 +-
 .../query/render/MetricsPaddingRenderer.java    |     2 +-
 .../api/query/render/MinimalRenderer.java       |     2 +-
 .../server/api/query/render/Renderer.java       |     2 +-
 .../api/resources/ActionResourceDefinition.java |     2 +-
 .../ActiveWidgetLayoutResourceDefinition.java   |     2 +-
 .../resources/AlertDefResourceDefinition.java   |     2 +-
 .../resources/AlertGroupResourceDefinition.java |     2 +-
 .../AlertHistoryResourceDefinition.java         |     2 +-
 .../AlertNoticeResourceDefinition.java          |     2 +-
 .../api/resources/AlertResourceDefinition.java  |     2 +-
 .../AlertTargetResourceDefinition.java          |     2 +-
 .../api/resources/BaseResourceDefinition.java   |     5 +-
 .../resources/BlueprintResourceDefinition.java  |     2 +-
 .../ClientConfigResourceDefinition.java         |     2 +-
 .../resources/ClusterResourceDefinition.java    |     4 +-
 .../resources/ComponentResourceDefinition.java  |     2 +-
 ...ComponentStackVersionResourceDefinition.java |     2 +-
 .../ConfigGroupResourceDefinition.java          |     2 +-
 .../ConfigurationResourceDefinition.java        |     2 +-
 .../DetachedHostResourceDefinition.java         |     2 +-
 .../ExtensionLinkResourceDefinition.java        |     2 +-
 .../resources/ExtensionResourceDefinition.java  |     2 +-
 .../ExtensionVersionResourceDefinition.java     |     2 +-
 .../api/resources/FeedResourceDefinition.java   |     2 +-
 .../api/resources/GroupResourceDefinition.java  |     2 +-
 .../HostComponentProcessResourceDefinition.java |     2 +-
 .../HostComponentResourceDefinition.java        |     2 +-
 .../api/resources/HostResourceDefinition.java   |     2 +-
 .../resources/InstanceResourceDefinition.java   |     2 +-
 .../api/resources/JobResourceDefinition.java    |     2 +-
 .../LdapSyncEventResourceDefinition.java        |     2 +-
 .../resources/LoggingResourceDefinition.java    |     2 +-
 .../api/resources/MemberResourceDefinition.java |     2 +-
 .../OperatingSystemResourceDefinition.java      |     2 +-
 .../resources/PermissionResourceDefinition.java |     2 +-
 .../resources/PrivilegeResourceDefinition.java  |     2 +-
 .../RecommendationResourceDefinition.java       |     2 +-
 .../RemoteClusterResourceDefinition.java        |     2 +-
 .../resources/RepositoryResourceDefinition.java |     2 +-
 .../RepositoryVersionResourceDefinition.java    |     2 +-
 .../resources/RequestResourceDefinition.java    |     2 +-
 .../RequestScheduleResourceDefinition.java      |     4 +-
 .../api/resources/ResourceDefinition.java       |     2 +-
 .../server/api/resources/ResourceInstance.java  |     2 +-
 .../api/resources/ResourceInstanceFactory.java  |     2 +-
 .../resources/ResourceInstanceFactoryImpl.java  |     8 +-
 .../RootServiceComponentResourceDefinition.java |     2 +-
 ...tServiceHostComponentResourceDefinition.java |     2 +-
 .../RootServiceResourceDefinition.java          |     2 +-
 .../resources/ServiceResourceDefinition.java    |     2 +-
 .../api/resources/SimpleResourceDefinition.java |     4 +-
 ...nfigurationDependencyResourceDefinition.java |     2 +-
 .../StackConfigurationResourceDefinition.java   |     2 +-
 .../StackDependencyResourceDefinition.java      |     2 +-
 ...ackLevelConfigurationResourceDefinition.java |     2 +-
 .../api/resources/StackResourceDefinition.java  |     4 +-
 ...StackServiceComponentResourceDefinition.java |     2 +-
 .../StackServiceResourceDefinition.java         |     2 +-
 .../StackVersionResourceDefinition.java         |     2 +-
 .../api/resources/SubResourceDefinition.java    |     4 +-
 .../TargetClusterResourceDefinition.java        |     2 +-
 .../TaskAttemptResourceDefinition.java          |     2 +-
 .../api/resources/TaskResourceDefinition.java   |     4 +-
 .../resources/UpgradeResourceDefinition.java    |     2 +-
 .../api/resources/UserResourceDefinition.java   |     2 +-
 .../resources/ValidationResourceDefinition.java |     2 +-
 .../VersionDefinitionResourceDefinition.java    |     2 +-
 .../ViewExternalSubResourceDefinition.java      |     2 +-
 .../ViewInstanceResourceDefinition.java         |     4 +-
 .../ViewPermissionResourceDefinition.java       |     2 +-
 .../api/resources/ViewResourceDefinition.java   |     2 +-
 .../resources/ViewUrlResourceDefinition.java    |     2 +-
 .../ViewVersionResourceDefinition.java          |     2 +-
 .../WidgetLayoutResourceDefinition.java         |     2 +-
 .../api/resources/WidgetResourceDefinition.java |     3 +-
 .../resources/WorkflowResourceDefinition.java   |     2 +-
 .../server/api/rest/BootStrapResource.java      |    18 +-
 .../ambari/server/api/rest/HealthCheck.java     |    10 +-
 .../api/rest/KdcServerReachabilityCheck.java    |    12 +-
 .../server/api/services/ActionService.java      |   100 +-
 .../api/services/ActiveWidgetLayoutService.java |    76 -
 .../api/services/AlertDefinitionService.java    |    15 +-
 .../server/api/services/AlertGroupService.java  |    13 +-
 .../api/services/AlertHistoryService.java       |     7 +-
 .../server/api/services/AlertNoticeService.java |     7 +-
 .../server/api/services/AlertService.java       |     9 +-
 .../server/api/services/AlertTargetService.java |    15 +-
 .../server/api/services/AmbariMetaInfo.java     |   542 +-
 .../api/services/AmbariPrivilegeService.java    |     2 +-
 .../ambari/server/api/services/BaseRequest.java |     4 +-
 .../ambari/server/api/services/BaseService.java |    43 +-
 .../server/api/services/BlueprintService.java   |   107 +-
 .../ClusterKerberosDescriptorService.java       |     6 +-
 .../api/services/ClusterPrivilegeService.java   |     2 +-
 .../api/services/ClusterRequestSwagger.java     |    30 +
 .../server/api/services/ClusterService.java     |   307 +-
 .../services/ClusterStackVersionService.java    |    14 +-
 .../CompatibleRepositoryVersionService.java     |     7 +-
 .../server/api/services/ComponentService.java   |    17 +-
 .../server/api/services/ConfigGroupService.java |    14 +-
 .../api/services/ConfigurationService.java      |     7 +-
 .../server/api/services/CredentialService.java  |    11 +-
 .../server/api/services/DeleteRequest.java      |     2 +-
 .../api/services/DeleteResultMetadata.java      |     2 +-
 .../api/services/ExtensionLinksService.java     |    15 +-
 .../server/api/services/ExtensionsService.java  |    13 +-
 .../ambari/server/api/services/FeedService.java |    13 +-
 .../ambari/server/api/services/GetRequest.java  |     2 +-
 .../api/services/GroupPrivilegeService.java     |    77 -
 .../server/api/services/GroupService.java       |   155 -
 .../api/services/HostComponentService.java      |    22 +-
 .../services/HostKerberosIdentityService.java   |     5 +-
 .../ambari/server/api/services/HostService.java |   190 +-
 .../api/services/HostStackVersionService.java   |     9 +-
 .../server/api/services/InstanceService.java    |    13 +-
 .../ambari/server/api/services/JobService.java  |     7 +-
 .../api/services/KerberosDescriptorService.java |     9 +-
 .../ambari/server/api/services/KeyService.java  |     3 +-
 .../api/services/LdapSyncEventService.java      |    14 +-
 .../server/api/services/LocalUriInfo.java       |     2 +-
 .../server/api/services/LoggingService.java     |     8 +-
 .../server/api/services/LogoutService.java      |     3 +-
 .../server/api/services/MemberService.java      |   163 -
 .../server/api/services/NamedPropertySet.java   |     2 +-
 .../api/services/OperatingSystemService.java    |    24 +-
 .../server/api/services/PermissionService.java  |    14 +-
 .../api/services/PersistKeyValueImpl.java       |     2 +-
 .../api/services/PersistKeyValueService.java    |    27 +-
 .../ambari/server/api/services/PostRequest.java |     2 +-
 .../api/services/PreUpgradeCheckService.java    |     5 +-
 .../server/api/services/PrivilegeService.java   |    19 +-
 .../ambari/server/api/services/PutRequest.java  |     2 +-
 .../server/api/services/QueryPostRequest.java   |     2 +-
 .../api/services/RecommendationService.java     |     5 +-
 .../api/services/RemoteClustersService.java     |    20 +-
 .../server/api/services/RepositoryService.java  |    30 +-
 .../api/services/RepositoryVersionService.java  |    13 +-
 .../ambari/server/api/services/Request.java     |     2 +-
 .../ambari/server/api/services/RequestBody.java |     2 +-
 .../server/api/services/RequestFactory.java     |     2 +-
 .../api/services/RequestScheduleService.java    |    13 +-
 .../server/api/services/RequestService.java     |   107 +-
 .../ambari/server/api/services/Result.java      |     2 +-
 .../ambari/server/api/services/ResultImpl.java  |     2 +-
 .../server/api/services/ResultMetadata.java     |     2 +-
 .../api/services/ResultPostProcessor.java       |     2 +-
 .../api/services/ResultPostProcessorImpl.java   |     2 +-
 .../server/api/services/ResultStatus.java       |     2 +-
 .../api/services/RoleAuthorizationService.java  |     5 +-
 .../server/api/services/RootServiceService.java |   363 +-
 .../services/ServiceConfigVersionService.java   |     4 +-
 .../server/api/services/ServiceService.java     |   294 +-
 .../api/services/SettingRequestSwagger.java     |    30 +
 .../server/api/services/SettingService.java     |   126 +-
 .../server/api/services/StacksService.java      |   732 +-
 .../server/api/services/StageService.java       |    15 +-
 .../api/services/TargetClusterService.java      |    13 +-
 .../server/api/services/TaskAttemptService.java |     7 +-
 .../ambari/server/api/services/TaskService.java |     7 +-
 .../api/services/UpgradeGroupService.java       |     7 +-
 .../server/api/services/UpgradeItemService.java |     9 +-
 .../server/api/services/UpgradeService.java     |    13 +-
 .../api/services/UpgradeSummaryService.java     |    10 +-
 .../api/services/UserAuthorizationService.java  |   103 -
 .../api/services/UserPrivilegeService.java      |    79 -
 .../ambari/server/api/services/UserService.java |   175 -
 .../server/api/services/ValidationService.java  |     5 +-
 .../api/services/VersionDefinitionService.java  |    13 +-
 .../api/services/ViewDataMigrationService.java  |   122 -
 .../ViewExternalSubResourceService.java         |   146 -
 .../api/services/ViewInstanceService.java       |   282 -
 .../api/services/ViewPermissionService.java     |   186 -
 .../api/services/ViewPrivilegeService.java      |    55 -
 .../ambari/server/api/services/ViewService.java |   162 -
 .../api/services/ViewSubResourceService.java    |   134 -
 .../server/api/services/ViewUrlsService.java    |    22 +-
 .../server/api/services/ViewVersionService.java |   199 -
 .../api/services/WidgetLayoutService.java       |    18 +-
 .../server/api/services/WidgetService.java      |    17 +-
 .../server/api/services/WorkflowService.java    |     7 +-
 .../services/groups/GroupPrivilegeService.java  |   113 +
 .../api/services/groups/GroupService.java       |   177 +
 .../api/services/groups/MemberService.java      |   201 +
 .../services/parsers/BodyParseException.java    |     2 +-
 .../services/parsers/JsonRequestBodyParser.java |     7 +-
 .../api/services/parsers/RequestBodyParser.java |     2 +-
 .../persistence/PersistenceManager.java         |     2 +-
 .../persistence/PersistenceManagerImpl.java     |     4 +-
 .../services/serializers/JsonSerializer.java    |     7 +-
 .../services/serializers/ResultSerializer.java  |     2 +-
 .../StackAdvisorBlueprintProcessor.java         |    16 +-
 .../stackadvisor/StackAdvisorException.java     |     2 +-
 .../stackadvisor/StackAdvisorHelper.java        |    76 +-
 .../stackadvisor/StackAdvisorRequest.java       |     9 +-
 .../StackAdvisorRequestException.java           |     2 +-
 .../stackadvisor/StackAdvisorResponse.java      |     2 +-
 .../stackadvisor/StackAdvisorRunner.java        |   207 +-
 .../ComponentLayoutRecommendationCommand.java   |     7 +-
 .../ComponentLayoutValidationCommand.java       |    13 +-
 ...rationDependenciesRecommendationCommand.java |    13 +-
 .../ConfigurationRecommendationCommand.java     |    13 +-
 .../ConfigurationValidationCommand.java         |    13 +-
 .../commands/StackAdvisorCommand.java           |    33 +-
 .../commands/StackAdvisorCommandType.java       |     2 +-
 .../recommendations/RecommendationResponse.java |     2 +-
 .../validations/ValidationResponse.java         |     2 +-
 .../users/ActiveWidgetLayoutService.java        |   111 +
 .../users/UserAuthorizationService.java         |   120 +
 .../services/users/UserPrivilegeService.java    |   113 +
 .../server/api/services/users/UserService.java  |   194 +
 .../views/ViewDataMigrationService.java         |   113 +
 .../views/ViewExternalSubResourceService.java   |   147 +
 .../api/services/views/ViewInstanceService.java |   312 +
 .../services/views/ViewPermissionService.java   |   207 +
 .../services/views/ViewPrivilegeService.java    |   268 +
 .../server/api/services/views/ViewService.java  |   179 +
 .../services/views/ViewSubResourceService.java  |   136 +
 .../api/services/views/ViewVersionService.java  |   205 +
 .../apache/ambari/server/api/util/TreeNode.java |     2 +-
 .../ambari/server/api/util/TreeNodeImpl.java    |     2 +-
 .../ambari/server/audit/AsyncAuditLogger.java   |     4 +-
 .../apache/ambari/server/audit/AuditLogger.java |     2 +-
 .../server/audit/AuditLoggerDefaultImpl.java    |     2 +-
 .../ambari/server/audit/AuditLoggerModule.java  |     2 +-
 .../request/AddUpgradeRequestAuditEvent.java    |    10 +-
 .../eventcreator/DefaultEventCreator.java       |     2 +-
 .../request/eventcreator/HostEventCreator.java  |     4 +-
 .../eventcreator/PrivilegeEventCreator.java     |     2 +-
 .../RepositoryVersionEventCreator.java          |     2 +-
 .../eventcreator/UpgradeEventCreator.java       |     2 +-
 .../eventcreator/ViewPrivilegeEventCreator.java |     2 +-
 .../ambari/server/bootstrap/BSHostStatus.java   |     2 +-
 .../server/bootstrap/BSHostStatusCollector.java |    14 +-
 .../ambari/server/bootstrap/BSResponse.java     |     2 +-
 .../ambari/server/bootstrap/BSRunner.java       |    25 +-
 .../ambari/server/bootstrap/BootStrapImpl.java  |    10 +-
 .../server/bootstrap/BootStrapPostStatus.java   |     2 +-
 .../server/bootstrap/BootStrapStatus.java       |     2 +-
 .../DistributeRepositoriesStructuredOutput.java |    82 -
 .../server/bootstrap/FifoLinkedHashMap.java     |     2 +-
 .../ambari/server/bootstrap/SshHostInfo.java    |     2 +-
 .../server/checks/AbstractCheckDescriptor.java  |   222 +-
 .../server/checks/AtlasPresenceCheck.java       |    15 +-
 .../server/checks/AutoStartDisabledCheck.java   |    11 +
 .../ambari/server/checks/CheckDescription.java  |    51 +-
 .../server/checks/ClientRetryPropertyCheck.java |     8 +-
 .../checks/ComponentsExistInRepoCheck.java      |   140 +
 .../checks/ComponentsInstallationCheck.java     |     8 +-
 .../server/checks/ConfigurationMergeCheck.java  |     5 +-
 .../checks/DatabaseConsistencyCheckHelper.java  |   121 +-
 .../HardcodedStackVersionPropertiesCheck.java   |    57 +-
 .../ambari/server/checks/HealthCheck.java       |     3 +-
 .../HiveDynamicServiceDiscoveryCheck.java       |    15 +-
 .../checks/HiveMultipleMetastoreCheck.java      |     7 +-
 .../server/checks/HiveNotRollingWarning.java    |    11 +-
 .../checks/HostsMasterMaintenanceCheck.java     |    19 +-
 .../checks/HostsRepositoryVersionCheck.java     |    55 +-
 .../server/checks/InstallPackagesCheck.java     |    34 +-
 .../server/checks/KafkaKerberosCheck.java       |    10 +-
 ...apReduce2JobHistoryStatePreservingCheck.java |     7 +-
 .../server/checks/PreviousUpgradeCompleted.java |     7 +-
 .../server/checks/RangerAuditDbCheck.java       |    12 +-
 .../server/checks/RangerPasswordCheck.java      |    29 +-
 .../server/checks/RangerSSLConfigCheck.java     |    10 +-
 .../checks/SecondaryNamenodeDeletedCheck.java   |    24 +-
 .../checks/ServiceCheckValidityCheck.java       |    11 +-
 .../server/checks/ServicePresenceCheck.java     |     6 +-
 .../checks/ServicesMaintenanceModeCheck.java    |    11 +-
 .../ServicesMapReduceDistributedCacheCheck.java |    27 +-
 .../ServicesNamenodeHighAvailabilityCheck.java  |    11 +-
 .../checks/ServicesNamenodeTruncateCheck.java   |    26 +-
 .../ServicesTezDistributedCacheCheck.java       |    25 +-
 .../ambari/server/checks/ServicesUpCheck.java   |     8 +-
 .../checks/ServicesYarnWorkPreservingCheck.java |     7 +-
 .../server/checks/StormShutdownWarning.java     |    11 +-
 .../ambari/server/checks/UpgradeCheck.java      |     2 +-
 .../ambari/server/checks/UpgradeCheckGroup.java |     2 +-
 .../server/checks/UpgradeCheckRegistry.java     |     6 +-
 .../server/checks/VersionMismatchCheck.java     |     2 +-
 .../checks/YarnRMHighAvailabilityCheck.java     |     8 +-
 .../YarnTimelineServerStatePreservingCheck.java |    99 +-
 .../server/cleanup/ClasspathScannerUtils.java   |     2 +-
 .../ambari/server/cleanup/CleanupDriver.java    |    15 +-
 .../ambari/server/cleanup/CleanupService.java   |    19 +-
 .../server/cleanup/CleanupServiceImpl.java      |    33 +-
 .../server/cleanup/TimeBasedCleanupPolicy.java  |     5 +-
 .../collections/functors/ContainsPredicate.java |     2 +-
 .../DelegatedMultiplePredicateContainer.java    |     2 +-
 .../DelegatedSinglePredicateContainer.java      |     2 +-
 .../collections/functors/EqualsPredicate.java   |     2 +-
 .../ComponentSSLConfiguration.java              |     2 +-
 .../server/configuration/Configuration.java     |   140 +-
 .../AbstractRootServiceResponseFactory.java     |     2 +-
 .../controller/ActionExecutionContext.java      |    65 +-
 .../ambari/server/controller/ActionRequest.java |    21 +-
 .../server/controller/ActionRequestSwagger.java |    31 +
 .../server/controller/ActionResponse.java       |    22 +-
 .../controller/ActiveWidgetLayoutRequest.java   |    66 +
 .../controller/ActiveWidgetLayoutResponse.java  |   142 +
 .../server/controller/AlertCurrentRequest.java  |     2 +-
 .../controller/AlertDefinitionResponse.java     |     2 +-
 .../server/controller/AlertHistoryRequest.java  |     2 +-
 .../server/controller/AlertNoticeRequest.java   |     2 +-
 .../controller/AmbariActionExecutionHelper.java |   124 +-
 .../AmbariCustomCommandExecutionHelper.java     |   235 +-
 .../server/controller/AmbariHandlerList.java    |     4 +-
 .../controller/AmbariManagementController.java  |    16 +-
 .../AmbariManagementControllerImpl.java         |  1029 +-
 .../controller/AmbariManagementHelper.java      |   175 +
 .../ambari/server/controller/AmbariServer.java  |    16 +-
 .../server/controller/AmbariSessionManager.java |     2 +-
 .../ambari/server/controller/ApiModel.java      |    28 +
 .../server/controller/AuthToLocalBuilder.java   |   338 +-
 .../server/controller/BlueprintSwagger.java     |    91 +
 .../controller/ClusterArtifactRequest.java      |    46 +
 .../controller/ClusterArtifactResponse.java     |    49 +
 .../server/controller/ClusterRequest.java       |   125 +-
 .../server/controller/ClusterResponse.java      |   106 +-
 .../ClusterServiceArtifactRequest.java          |    46 +
 .../ClusterServiceArtifactResponse.java         |    52 +
 .../controller/ComponentDependencyResponse.java |    64 +
 .../server/controller/ConfigGroupRequest.java   |     2 +-
 .../server/controller/ConfigGroupResponse.java  |    12 +-
 .../server/controller/ConfigurationRequest.java |     2 +-
 .../controller/ConfigurationResponse.java       |     2 +-
 .../server/controller/ControllerModule.java     |     5 +-
 .../server/controller/ControllerRequest.java    |     2 +-
 .../server/controller/ControllerResponse.java   |     2 +-
 .../controller/DeleteIdentityHandler.java       |   328 +
 .../server/controller/ExecuteActionRequest.java |     2 +-
 .../server/controller/ExecuteCommandJson.java   |     6 +-
 .../server/controller/ExtensionLinkRequest.java |     2 +-
 .../controller/ExtensionLinkResponse.java       |   139 +-
 .../server/controller/ExtensionRequest.java     |     2 +-
 .../server/controller/ExtensionResponse.java    |     2 +-
 .../controller/ExtensionVersionRequest.java     |     2 +-
 .../controller/ExtensionVersionResponse.java    |     2 +-
 .../controller/GroupPrivilegeResponse.java      |    61 +
 .../ambari/server/controller/GroupRequest.java  |     7 +-
 .../ambari/server/controller/GroupResponse.java |     9 +-
 .../HostComponentProcessResponse.java           |     2 +-
 .../ambari/server/controller/HostRequest.java   |    74 +-
 .../ambari/server/controller/HostResponse.java  |   295 +-
 .../ambari/server/controller/HostsMap.java      |     2 +-
 .../server/controller/KerberosHelper.java       |   190 +-
 .../server/controller/KerberosHelperImpl.java   |  1332 +-
 .../server/controller/LdapSyncRequest.java      |     4 +-
 .../controller/MaintenanceStateHelper.java      |     2 +-
 .../ambari/server/controller/MemberRequest.java |     6 +-
 .../server/controller/MemberResponse.java       |     8 +-
 .../controller/OperatingSystemRequest.java      |     2 +-
 .../controller/OperatingSystemResponse.java     |     2 +-
 .../OrderedRequestStageContainer.java           |    62 +
 .../server/controller/PrereqCheckRequest.java   |    57 +-
 .../server/controller/PrivilegeResponse.java    |   175 +
 .../server/controller/QuickLinksResponse.java   |    56 +
 .../server/controller/RepositoryRequest.java    |     2 +-
 .../server/controller/RepositoryResponse.java   |    14 +-
 .../server/controller/RequestPostRequest.java   |    96 +
 .../server/controller/RequestPostResponse.java  |    43 +
 .../server/controller/RequestPutRequest.java    |    33 +
 .../server/controller/RequestRequest.java       |    19 +-
 .../server/controller/RequestResponse.java      |   100 +
 .../controller/RequestScheduleRequest.java      |     2 +-
 .../controller/RequestScheduleResponse.java     |     2 +-
 .../controller/RequestStatusResponse.java       |     2 +-
 .../controller/ResourceProviderFactory.java     |    10 +-
 .../controller/RootServiceComponentRequest.java |     2 +-
 .../RootServiceComponentResponse.java           |    58 +-
 .../RootServiceHostComponentRequest.java        |     2 +-
 .../RootServiceHostComponentResponse.java       |    72 +-
 .../server/controller/RootServiceRequest.java   |     2 +-
 .../server/controller/RootServiceResponse.java  |    24 +-
 .../controller/RootServiceResponseFactory.java  |    31 +-
 .../controller/ServiceComponentHostRequest.java |    21 +-
 .../ServiceComponentHostResponse.java           |    41 +-
 .../controller/ServiceComponentRequest.java     |     2 +-
 .../controller/ServiceComponentResponse.java    |    74 +-
 .../server/controller/ServiceRequest.java       |    42 +-
 .../controller/ServiceRequestSwagger.java       |    31 +
 .../server/controller/ServiceResponse.java      |    96 +-
 .../server/controller/SettingRequest.java       |    69 +
 .../server/controller/SettingResponse.java      |    90 +
 .../controller/StackArtifactResponse.java       |    52 +
 .../StackConfigurationDependencyRequest.java    |     2 +-
 .../StackConfigurationDependencyResponse.java   |    19 +-
 .../controller/StackConfigurationRequest.java   |     2 +-
 .../controller/StackConfigurationResponse.java  |    28 +-
 .../StackLevelConfigurationRequest.java         |     2 +-
 .../StackLevelConfigurationResponse.java        |     2 +-
 .../ambari/server/controller/StackRequest.java  |     2 +-
 .../ambari/server/controller/StackResponse.java |    14 +-
 .../StackServiceArtifactResponse.java           |    53 +
 .../StackServiceComponentRequest.java           |     2 +-
 .../StackServiceComponentResponse.java          |    45 +-
 .../server/controller/StackServiceRequest.java  |     2 +-
 .../server/controller/StackServiceResponse.java |    33 +-
 .../server/controller/StackVersionRequest.java  |     2 +-
 .../server/controller/StackVersionResponse.java |    61 +-
 .../ambari/server/controller/ThemeResponse.java |    56 +
 .../controller/UserAuthorizationResponse.java   |   153 +
 .../controller/UserPrivilegeResponse.java       |    61 +
 .../ambari/server/controller/UserRequest.java   |    19 +-
 .../ambari/server/controller/UserResponse.java  |    50 +-
 .../server/controller/ViewInstanceRequest.java  |   209 +
 .../server/controller/ViewInstanceResponse.java |   198 +
 .../controller/ViewPermissionResponse.java      |   122 +
 .../server/controller/ViewPrivilegeRequest.java |    79 +
 .../controller/ViewPrivilegeResponse.java       |    55 +
 .../ambari/server/controller/ViewResponse.java  |    82 +
 .../server/controller/ViewVersionResponse.java  |   234 +
 .../server/controller/WidgetResponse.java       |     2 +-
 .../gsinstaller/ClusterDefinition.java          |   434 -
 .../gsinstaller/GSInstallerClusterProvider.java |    71 -
 .../GSInstallerComponentProvider.java           |    88 -
 .../GSInstallerHostComponentProvider.java       |    99 -
 .../gsinstaller/GSInstallerHostProvider.java    |    86 -
 .../gsinstaller/GSInstallerNoOpProvider.java    |    60 -
 .../gsinstaller/GSInstallerProviderModule.java  |    93 -
 .../GSInstallerResourceProvider.java            |   234 -
 .../gsinstaller/GSInstallerServiceProvider.java |    82 -
 .../gsinstaller/GSInstallerStateProvider.java   |    35 -
 .../AbstractAuthorizedResourceProvider.java     |    23 +-
 .../AbstractControllerResourceProvider.java     |    31 +-
 .../internal/AbstractDRResourceProvider.java    |     2 +-
 .../internal/AbstractPropertyProvider.java      |     6 +-
 .../internal/AbstractProviderModule.java        |   166 +-
 .../internal/AbstractResourceProvider.java      |     2 +-
 .../internal/ActionResourceProvider.java        |     5 +-
 .../ActiveWidgetLayoutResourceProvider.java     |    61 +-
 .../internal/AlertHistoryResourceProvider.java  |     2 +-
 .../internal/AlertNoticeResourceProvider.java   |     2 +-
 .../internal/AlertResourceProvider.java         |     2 +-
 .../internal/AlertSummaryPropertyProvider.java  |     2 +-
 .../controller/internal/AppCookieManager.java   |    10 +-
 .../internal/ArtifactResourceProvider.java      |    33 +-
 .../AtlasServerHttpPropertyRequest.java         |     4 +-
 .../controller/internal/BaseClusterRequest.java |     2 +-
 .../controller/internal/BaseProvider.java       |    12 +-
 .../BlueprintConfigurationProcessor.java        |   313 +-
 .../internal/BlueprintResourceProvider.java     |     6 +-
 .../controller/internal/CalculatedStatus.java   |    18 +-
 .../internal/ClientConfigResourceProvider.java  |    69 +-
 .../internal/ClusterControllerImpl.java         |    12 +-
 ...usterKerberosDescriptorResourceProvider.java |     3 +-
 .../internal/ClusterResourceProvider.java       |   104 +-
 .../ClusterStackVersionResourceProvider.java    |   813 +-
 .../internal/CompatibleRepositoryVersion.java   |     2 +-
 ...atibleRepositoryVersionResourceProvider.java |    21 +-
 .../internal/ComponentResourceProvider.java     |   105 +-
 .../internal/ConfigGroupResourceProvider.java   |    93 +-
 .../internal/ConfigurationResourceProvider.java |     2 +-
 .../ConfigurationTopologyException.java         |     2 +-
 .../internal/DefaultProviderModule.java         |     2 +-
 .../DefaultResourcePredicateEvaluator.java      |     2 +-
 .../internal/DefaultTrimmingStrategy.java       |     2 +-
 .../DeleteSpacesAtTheEndTrimmingStrategy.java   |     2 +-
 .../internal/DeleteStatusMetaData.java          |     2 +-
 .../internal/DirectoriesTrimmingStrategy.java   |     2 +-
 .../internal/ExportBlueprintRequest.java        |     6 +-
 .../server/controller/internal/Extension.java   |     4 +-
 .../internal/ExtensionLinkResourceProvider.java |     6 +-
 .../internal/ExtensionResourceProvider.java     |     4 +-
 .../ExtensionVersionResourceProvider.java       |     4 +-
 .../internal/FeedResourceProvider.java          |     2 +-
 .../GroupPrivilegeResourceProvider.java         |    80 +-
 .../internal/GroupResourceProvider.java         |     6 +-
 .../HostComponentProcessResourceProvider.java   |     2 +-
 .../internal/HostComponentResourceProvider.java |    39 +-
 .../internal/HostResourceProvider.java          |   314 +-
 .../HostStackVersionResourceProvider.java       |   107 +-
 .../controller/internal/HostStatusHelper.java   |     9 +-
 .../internal/HttpPropertyProvider.java          |    29 +-
 .../internal/InstanceResourceProvider.java      |     2 +-
 .../internal/JobResourceProvider.java           |    14 +-
 .../internal/JsonHttpPropertyRequest.java       |     4 +-
 .../KerberosDescriptorResourceProvider.java     |     2 +-
 .../internal/LdapSyncEventResourceProvider.java |     2 +-
 .../internal/LoggingResourceProvider.java       |     2 +-
 .../internal/MemberResourceProvider.java        |     6 +-
 .../internal/ObservableResourceProvider.java    |     2 +-
 .../OperatingSystemResourceProvider.java        |     4 +-
 .../controller/internal/PageRequestImpl.java    |     2 +-
 .../controller/internal/PageResponseImpl.java   |     2 +-
 .../internal/PasswordTrimmingStrategy.java      |     2 +-
 .../internal/PermissionResourceProvider.java    |     2 +-
 .../PreUpgradeCheckResourceProvider.java        |    95 +-
 .../internal/PrivilegeResourceProvider.java     |     2 +-
 .../controller/internal/PropertyInfo.java       |     4 +-
 .../internal/PropertyPredicateVisitor.java      |     2 +-
 .../PropertyValueTrimmingStrategyDefiner.java   |     2 +-
 .../controller/internal/ProvisionAction.java    |     2 +-
 .../internal/ProvisionClusterRequest.java       |    29 +-
 .../internal/ReadOnlyResourceProvider.java      |    24 +-
 .../RecommendationResourceProvider.java         |     2 +-
 .../internal/RemoteClusterResourceProvider.java |     4 +-
 .../internal/RepositoryResourceProvider.java    |    17 +-
 .../RepositoryVersionResourceProvider.java      |   103 +-
 .../server/controller/internal/RequestImpl.java |     8 +-
 .../internal/RequestResourceFilter.java         |     5 +-
 .../internal/RequestResourceProvider.java       |   203 +-
 .../RequestScheduleResourceProvider.java        |     2 +-
 .../internal/RequestStageContainer.java         |    17 +-
 .../controller/internal/RequestStatusImpl.java  |     4 +-
 .../controller/internal/ResourceImpl.java       |     4 +-
 .../ResourceManagerHttpPropertyRequest.java     |     2 +-
 .../internal/ResourceProviderEvent.java         |     2 +-
 .../internal/ResourceProviderObserver.java      |     2 +-
 .../RootServiceComponentResourceProvider.java   |    67 +-
 ...ootServiceHostComponentResourceProvider.java |    76 +-
 .../internal/RootServiceResourceProvider.java   |    24 +-
 .../internal/ScaleClusterRequest.java           |    20 +-
 .../server/controller/internal/SchemaImpl.java  |     2 +-
 .../internal/ServiceResourceProvider.java       |   265 +-
 .../internal/SettingResourceProvider.java       |    64 +-
 .../internal/SimplifyingPredicateVisitor.java   |     2 +-
 .../controller/internal/SortRequestImpl.java    |     2 +-
 .../server/controller/internal/Stack.java       |    14 +-
 .../internal/StackAdvisorResourceProvider.java  |    26 +-
 .../internal/StackArtifactResourceProvider.java |     6 +-
 ...ConfigurationDependencyResourceProvider.java |     4 +-
 .../StackConfigurationResourceProvider.java     |     4 +-
 .../internal/StackDefinedPropertyProvider.java  |    20 +-
 .../StackDependencyResourceProvider.java        |     8 +-
 ...StackLevelConfigurationResourceProvider.java |     4 +-
 .../internal/StackResourceProvider.java         |     4 +-
 .../StackServiceComponentResourceProvider.java  |    11 +-
 .../internal/StackServiceResourceProvider.java  |     4 +-
 .../internal/StackVersionResourceProvider.java  |    70 +-
 .../internal/StageResourceProvider.java         |    91 +-
 .../internal/TargetClusterResourceProvider.java |     2 +-
 .../internal/TaskAttemptResourceProvider.java   |     8 +-
 .../internal/TaskResourceProvider.java          |     5 +-
 .../controller/internal/TemporalInfoImpl.java   |     2 +-
 .../controller/internal/TrimmingStrategy.java   |     2 +-
 .../controller/internal/URLStreamProvider.java  |    12 +-
 .../server/controller/internal/UnitUpdater.java |   150 +
 .../internal/UpgradeGroupResourceProvider.java  |     2 +-
 .../internal/UpgradeItemResourceProvider.java   |     2 +-
 .../internal/UpgradeResourceProvider.java       |  1196 +-
 .../controller/internal/UpgradeSummary.java     |     4 +-
 .../UpgradeSummaryResourceProvider.java         |     4 +-
 .../UserAuthorizationResourceProvider.java      |    64 +-
 .../internal/UserPrivilegeResourceProvider.java |    82 +-
 .../internal/UserResourceProvider.java          |     6 +-
 .../internal/ValidationResourceProvider.java    |     4 +-
 .../VersionDefinitionResourceProvider.java      |    71 +-
 .../internal/ViewInstanceResourceProvider.java  |     4 +-
 .../ViewPermissionResourceProvider.java         |    46 +-
 .../internal/ViewPrivilegeResourceProvider.java |     2 +-
 .../internal/ViewResourceProvider.java          |     4 +-
 .../internal/ViewURLResourceProvider.java       |     2 +-
 .../internal/ViewVersionResourceProvider.java   |    65 +-
 .../internal/WidgetLayoutResourceProvider.java  |     8 +-
 .../internal/WidgetResourceProvider.java        |     2 +-
 .../internal/WorkflowResourceProvider.java      |     8 +-
 .../ambari/server/controller/ivory/Cluster.java |     2 +-
 .../ambari/server/controller/ivory/Feed.java    |     2 +-
 .../server/controller/ivory/Instance.java       |     2 +-
 .../server/controller/ivory/IvoryService.java   |     2 +-
 .../controller/jdbc/ConnectionFactory.java      |     2 +-
 .../controller/jdbc/JDBCResourceProvider.java   |     2 +-
 .../JobHistoryPostgresConnectionFactory.java    |     2 +-
 .../controller/jdbc/SQLPredicateVisitor.java    |     2 +-
 .../server/controller/jmx/JMXHostProvider.java  |    13 +-
 .../server/controller/jmx/JMXMetricHolder.java  |     4 +-
 .../controller/jmx/JMXPropertyProvider.java     |    26 +-
 .../logging/HostComponentLoggingInfo.java       |     2 +-
 .../logging/LogFileDefinitionInfo.java          |     2 +-
 .../server/controller/logging/LogFileType.java  |     2 +-
 .../logging/LogLevelQueryResponse.java          |     2 +-
 .../controller/logging/LogLineResult.java       |     2 +-
 .../controller/logging/LogQueryResponse.java    |     2 +-
 .../logging/LogSearchDataRetrievalService.java  |    81 +-
 .../LoggingRequestHelperFactoryImpl.java        |    21 +-
 .../logging/LoggingRequestHelperImpl.java       |    23 +-
 .../logging/LoggingSearchPropertyProvider.java  |    18 +-
 .../controller/logging/NameValuePair.java       |     2 +-
 .../ambari/server/controller/logging/Utils.java |     2 +-
 .../controller/metrics/MetricHostProvider.java  |     2 +-
 .../metrics/MetricPropertyProviderFactory.java  |     2 +-
 .../metrics/MetricReportingAdapter.java         |     2 +-
 .../metrics/MetricsCollectorHAManager.java      |     2 +-
 .../metrics/MetricsDataTransferMethod.java      |     2 +-
 .../MetricsDataTransferMethodFactory.java       |     2 +-
 .../metrics/MetricsDownsamplingMethod.java      |     7 +-
 .../MetricsDownsamplingMethodFactory.java       |     2 +-
 .../metrics/MetricsPaddingMethod.java           |     2 +-
 .../metrics/MetricsPropertyProvider.java        |     2 +-
 .../metrics/MetricsPropertyProviderProxy.java   |     2 +-
 .../metrics/MetricsReportPropertyProvider.java  |     2 +-
 .../MetricsReportPropertyProviderProxy.java     |     2 +-
 .../metrics/MetricsServiceProvider.java         |     2 +-
 .../metrics/RestMetricsPropertyProvider.java    |     2 +-
 .../ThreadPoolEnabledPropertyProvider.java      |     2 +-
 .../GangliaComponentPropertyProvider.java       |     4 +-
 .../GangliaHostComponentPropertyProvider.java   |     4 +-
 .../ganglia/GangliaHostPropertyProvider.java    |     2 +-
 .../metrics/ganglia/GangliaMetric.java          |     5 +-
 .../ganglia/GangliaPropertyProvider.java        |     2 +-
 .../ganglia/GangliaReportPropertyProvider.java  |     2 +-
 .../timeline/AMSComponentPropertyProvider.java  |     2 +-
 .../AMSHostComponentPropertyProvider.java       |     2 +-
 .../timeline/AMSHostPropertyProvider.java       |     2 +-
 .../metrics/timeline/AMSPropertyProvider.java   |    15 +-
 .../timeline/AMSReportPropertyProvider.java     |     2 +-
 .../metrics/timeline/MetricsRequestHelper.java  |    26 +-
 .../cache/TimelineAppMetricCacheKey.java        |     2 +-
 .../timeline/cache/TimelineMetricCache.java     |    30 +-
 .../cache/TimelineMetricCacheEntryFactory.java  |    50 +-
 .../cache/TimelineMetricCacheProvider.java      |     2 +-
 .../cache/TimelineMetricsCacheSizeOfEngine.java |     8 +-
 .../cache/TimelineMetricsCacheValue.java        |     2 +-
 .../controller/predicate/AlwaysPredicate.java   |     5 +-
 .../controller/predicate/AndPredicate.java      |     2 +-
 .../controller/predicate/ArrayPredicate.java    |     2 +-
 .../controller/predicate/BasePredicate.java     |     2 +-
 .../predicate/CategoryIsEmptyPredicate.java     |     2 +-
 .../controller/predicate/CategoryPredicate.java |     2 +-
 .../predicate/ComparisonPredicate.java          |     2 +-
 .../controller/predicate/EqualsPredicate.java   |     2 +-
 .../controller/predicate/FilterPredicate.java   |     2 +-
 .../predicate/GreaterEqualsPredicate.java       |     2 +-
 .../controller/predicate/GreaterPredicate.java  |     2 +-
 .../predicate/LessEqualsPredicate.java          |     2 +-
 .../controller/predicate/LessPredicate.java     |     2 +-
 .../controller/predicate/NotPredicate.java      |     2 +-
 .../controller/predicate/OrPredicate.java       |     2 +-
 .../controller/predicate/PredicateVisitor.java  |     2 +-
 .../predicate/PredicateVisitorAcceptor.java     |     2 +-
 .../controller/predicate/PropertyPredicate.java |     2 +-
 .../controller/predicate/UnaryPredicate.java    |     2 +-
 .../controller/spi/ClusterController.java       |     2 +-
 .../spi/NoSuchParentResourceException.java      |     2 +-
 .../controller/spi/NoSuchResourceException.java |     2 +-
 .../server/controller/spi/PageRequest.java      |     2 +-
 .../server/controller/spi/PageResponse.java     |     2 +-
 .../ambari/server/controller/spi/Predicate.java |     2 +-
 .../server/controller/spi/PropertyProvider.java |     2 +-
 .../server/controller/spi/ProviderModule.java   |     2 +-
 .../ambari/server/controller/spi/Request.java   |     2 +-
 .../server/controller/spi/RequestStatus.java    |     2 +-
 .../controller/spi/RequestStatusMetaData.java   |     2 +-
 .../ambari/server/controller/spi/Resource.java  |     2 +-
 .../spi/ResourceAlreadyExistsException.java     |     2 +-
 .../spi/ResourcePredicateEvaluator.java         |     2 +-
 .../server/controller/spi/ResourceProvider.java |     2 +-
 .../ambari/server/controller/spi/Schema.java    |     2 +-
 .../server/controller/spi/SchemaFactory.java    |     2 +-
 .../server/controller/spi/SortRequest.java      |     2 +-
 .../controller/spi/SortRequestProperty.java     |     2 +-
 .../server/controller/spi/SystemException.java  |     2 +-
 .../server/controller/spi/TemporalInfo.java     |     2 +-
 .../spi/UnsupportedPropertyException.java       |     2 +-
 ...eredThreadPoolExecutorCompletionService.java |     2 +-
 .../utilities/ClusterControllerHelper.java      |     2 +-
 .../controller/utilities/DatabaseChecker.java   |     2 +-
 .../controller/utilities/KerberosChecker.java   |     2 +-
 .../utilities/KerberosIdentityCleaner.java      |    83 +
 .../controller/utilities/PredicateBuilder.java  |     2 +-
 .../controller/utilities/PredicateHelper.java   |     2 +-
 .../controller/utilities/PropertyHelper.java    |    14 +-
 .../utilities/RemovableIdentities.java          |   145 +
 .../utilities/ScalingThreadPoolExecutor.java    |     4 +-
 .../ServiceCalculatedStateFactory.java          |     4 +-
 .../controller/utilities/StreamProvider.java    |     2 +-
 .../controller/utilities/UsedIdentities.java    |   101 +
 .../state/DefaultServiceCalculatedState.java    |     7 +-
 .../state/FlumeServiceCalculatedState.java      |     4 +-
 .../state/HBaseServiceCalculatedState.java      |     6 +-
 .../state/HDFSServiceCalculatedState.java       |     6 +-
 .../state/HiveServiceCalculatedState.java       |     9 +-
 .../state/OozieServiceCalculatedState.java      |     7 +-
 .../utilities/state/ServiceCalculatedState.java |     2 +-
 .../state/YARNServiceCalculatedState.java       |     7 +-
 .../server/credentialapi/CredentialUtil.java    |     2 +-
 .../server/customactions/ActionDefinition.java  |     2 +-
 .../customactions/ActionDefinitionManager.java  |    12 +-
 .../customactions/ActionDefinitionSpec.java     |     2 +-
 .../customactions/ActionDefinitionXml.java      |     2 +-
 .../events/ActionFinalReportReceivedEvent.java  |     2 +-
 .../events/AggregateAlertRecalculateEvent.java  |     2 +-
 .../events/AlertDefinitionChangedEvent.java     |     2 +-
 .../events/AlertDefinitionDeleteEvent.java      |     2 +-
 .../events/AlertDefinitionDisabledEvent.java    |     2 +-
 .../AlertDefinitionRegistrationEvent.java       |     2 +-
 .../apache/ambari/server/events/AlertEvent.java |     2 +-
 .../events/AlertHashInvalidationEvent.java      |     2 +-
 .../server/events/AlertReceivedEvent.java       |     2 +-
 .../server/events/AlertStateChangeEvent.java    |     2 +-
 .../ambari/server/events/AmbariEvent.java       |     2 +-
 .../events/ClusterConfigChangedEvent.java       |     2 +-
 .../events/ClusterConfigFinishedEvent.java      |     2 +-
 .../ambari/server/events/ClusterEvent.java      |     2 +-
 .../HostComponentVersionAdvertisedEvent.java    |     2 +-
 .../apache/ambari/server/events/HostEvent.java  |     2 +-
 .../server/events/HostRegisteredEvent.java      |     2 +-
 .../ambari/server/events/HostsAddedEvent.java   |     2 +-
 .../ambari/server/events/HostsRemovedEvent.java |     2 +-
 .../ambari/server/events/InitialAlertEvent.java |     2 +-
 .../server/events/MaintenanceModeEvent.java     |     2 +-
 .../events/ServiceComponentInstalledEvent.java  |     2 +-
 .../ServiceComponentRecoveryChangedEvent.java   |     2 +-
 .../ServiceComponentUninstalledEvent.java       |     8 +-
 .../ambari/server/events/ServiceEvent.java      |     2 +-
 .../server/events/ServiceInstalledEvent.java    |     2 +-
 .../server/events/ServiceRemovedEvent.java      |    31 +-
 .../server/events/StackUpgradeFinishEvent.java  |     4 +-
 .../ambari/server/events/TaskCreateEvent.java   |     4 +-
 .../apache/ambari/server/events/TaskEvent.java  |     4 +-
 .../ambari/server/events/TaskUpdateEvent.java   |     4 +-
 .../EntityManagerCacheInvalidationEvent.java    |     2 +-
 .../ambari/server/events/jpa/JPAEvent.java      |     2 +-
 .../alerts/AlertAggregateListener.java          |     2 +-
 .../alerts/AlertDefinitionDisabledListener.java |     2 +-
 .../alerts/AlertHashInvalidationListener.java   |     4 +-
 .../listeners/alerts/AlertHostListener.java     |     2 +-
 .../alerts/AlertLifecycleListener.java          |     4 +-
 .../alerts/AlertMaintenanceModeListener.java    |    64 +-
 .../listeners/alerts/AlertReceivedListener.java |     2 +
 .../AlertServiceComponentHostListener.java      |     4 +-
 .../alerts/AlertServiceStateListener.java       |     4 +-
 .../alerts/AlertStateChangedListener.java       |     4 +-
 .../listeners/tasks/TaskStatusListener.java     |     4 +-
 .../DistributeRepositoriesActionListener.java   |   115 +-
 .../upgrade/HostVersionOutOfSyncListener.java   |   101 +-
 .../upgrade/StackUpgradeFinishListener.java     |    15 +-
 .../listeners/upgrade/StackVersionListener.java |   195 +-
 .../events/publishers/AlertEventPublisher.java  |     2 +-
 .../events/publishers/AmbariEventPublisher.java |     2 +-
 .../events/publishers/JPAEventPublisher.java    |     2 +-
 .../events/publishers/TaskEventPublisher.java   |     2 +-
 .../publishers/VersionEventPublisher.java       |     2 +-
 .../ambari/server/hooks/AmbariEventFactory.java |     2 +-
 .../apache/ambari/server/hooks/HookContext.java |     2 +-
 .../ambari/server/hooks/HookContextFactory.java |     2 +-
 .../apache/ambari/server/hooks/HookService.java |     2 +-
 .../users/PostUserCreationHookContext.java      |     4 +-
 .../server/hooks/users/UserCreatedEvent.java    |     2 +-
 .../server/hooks/users/UserHookParams.java      |     2 +-
 .../server/hooks/users/UserHookService.java     |     5 +-
 .../server/logging/EclipseLinkLogger.java       |     2 +-
 .../ambari/server/logging/LockFactory.java      |     2 +-
 .../metadata/AmbariServiceAlertDefinitions.java |     2 +-
 .../CachedRoleCommandOrderProvider.java         |    14 +-
 .../server/metadata/RoleCommandOrder.java       |    45 +-
 .../metadata/RoleCommandOrderProvider.java      |     2 +-
 .../ambari/server/metadata/RoleCommandPair.java |     2 +-
 .../server/metrics/system/MetricsService.java   |     2 +-
 .../server/metrics/system/MetricsSink.java      |     2 +-
 .../server/metrics/system/MetricsSource.java    |     4 +-
 .../server/metrics/system/SingleMetric.java     |     2 +-
 .../system/impl/AbstractMetricsSource.java      |     4 +-
 .../system/impl/AmbariMetricSinkImpl.java       |    52 +-
 .../system/impl/AmbariPerformanceMonitor.java   |     6 +-
 .../system/impl/DatabaseMetricsSource.java      |    10 +-
 .../metrics/system/impl/JvmMetricsSource.java   |    16 +-
 .../system/impl/MetricsConfiguration.java       |     4 +-
 .../metrics/system/impl/MetricsServiceImpl.java |     9 +-
 .../server/notifications/DispatchCallback.java  |     2 +-
 .../notifications/DispatchCredentials.java      |     2 +-
 .../server/notifications/DispatchFactory.java   |     2 +-
 .../server/notifications/DispatchRunnable.java  |     4 +-
 .../server/notifications/Notification.java      |     2 +-
 .../notifications/NotificationDispatcher.java   |     2 +-
 .../ambari/server/notifications/Recipient.java  |     2 +-
 .../TargetConfigurationResult.java              |     4 +-
 .../dispatchers/AlertScriptDispatcher.java      |    49 +-
 .../dispatchers/AmbariSNMPDispatcher.java       |     2 +-
 .../dispatchers/EmailDispatcher.java            |     2 +-
 .../dispatchers/SNMPDispatcher.java             |     2 +-
 .../orm/AmbariLocalSessionInterceptor.java      |     2 +-
 .../apache/ambari/server/orm/DBAccessor.java    |   122 +
 .../ambari/server/orm/DBAccessorImpl.java       |   271 +-
 .../orm/EclipseLinkSessionCustomizer.java       |     2 +-
 .../ambari/server/orm/GuiceJpaInitializer.java  |     2 +-
 .../ambari/server/orm/PersistenceType.java      |     2 +-
 .../ambari/server/orm/TransactionalLocks.java   |     4 +-
 .../orm/cache/ConfigGroupHostMapping.java       |     2 +-
 .../orm/cache/ConfigGroupHostMappingImpl.java   |     2 +-
 .../server/orm/cache/HostConfigMapping.java     |     2 +-
 .../server/orm/cache/HostConfigMappingImpl.java |     2 +-
 .../server/orm/dao/AlertDefinitionDAO.java      |     4 +-
 .../ambari/server/orm/dao/AlertDispatchDAO.java |     2 +-
 .../server/orm/dao/AlertHostSummaryDTO.java     |     2 +-
 .../ambari/server/orm/dao/AlertSummaryDTO.java  |     2 +-
 .../apache/ambari/server/orm/dao/AlertsDAO.java |     2 +-
 .../ambari/server/orm/dao/ArtifactDAO.java      |     2 +-
 .../ambari/server/orm/dao/BlueprintDAO.java     |     2 +-
 .../ambari/server/orm/dao/ClusterDAO.java       |    19 +-
 .../server/orm/dao/ClusterServiceDAO.java       |     2 +-
 .../ambari/server/orm/dao/ClusterStateDAO.java  |     2 +-
 .../server/orm/dao/ClusterVersionDAO.java       |   233 -
 .../orm/dao/ConfigGroupConfigMappingDAO.java    |     2 +-
 .../ambari/server/orm/dao/ConfigGroupDAO.java   |     2 +-
 .../orm/dao/ConfigGroupHostMappingDAO.java      |     2 +-
 .../apache/ambari/server/orm/dao/CrudDAO.java   |     2 +-
 .../ambari/server/orm/dao/ExtensionDAO.java     |     2 +-
 .../ambari/server/orm/dao/ExtensionLinkDAO.java |    38 +-
 .../apache/ambari/server/orm/dao/GroupDAO.java  |     2 +-
 .../server/orm/dao/HostAlertSummaryDTO.java     |     2 +-
 .../orm/dao/HostComponentDesiredStateDAO.java   |     2 +-
 .../server/orm/dao/HostComponentStateDAO.java   |    39 +-
 .../server/orm/dao/HostConfigMappingDAO.java    |     4 +-
 .../apache/ambari/server/orm/dao/HostDAO.java   |     2 +-
 .../server/orm/dao/HostRoleCommandDAO.java      |    11 +-
 .../dao/HostRoleCommandStatusSummaryDTO.java    |     2 +-
 .../ambari/server/orm/dao/HostStateDAO.java     |     2 +-
 .../ambari/server/orm/dao/HostVersionDAO.java   |   189 +-
 .../server/orm/dao/KerberosDescriptorDAO.java   |    34 +-
 .../apache/ambari/server/orm/dao/MemberDAO.java |     2 +-
 .../ambari/server/orm/dao/PrivilegeDAO.java     |     2 +-
 .../server/orm/dao/RemoteAmbariClusterDAO.java  |     2 +-
 .../server/orm/dao/RepositoryVersionDAO.java    |    58 +-
 .../ambari/server/orm/dao/RequestDAO.java       |    20 +-
 .../orm/dao/RequestOperationLevelDAO.java       |     2 +-
 .../orm/dao/RequestScheduleBatchRequestDAO.java |     2 +-
 .../server/orm/dao/RequestScheduleDAO.java      |     2 +-
 .../ambari/server/orm/dao/ResourceDAO.java      |     2 +-
 .../ambari/server/orm/dao/ResourceTypeDAO.java  |     2 +-
 .../dao/ServiceComponentDesiredStateDAO.java    |    62 +-
 .../ambari/server/orm/dao/ServiceConfigDAO.java |    17 +-
 .../server/orm/dao/ServiceDesiredStateDAO.java  |     2 +-
 .../ambari/server/orm/dao/SettingDAO.java       |     2 +-
 .../apache/ambari/server/orm/dao/StackDAO.java  |    16 +-
 .../server/orm/dao/TopologyHostGroupDAO.java    |     2 +-
 .../server/orm/dao/TopologyHostRequestDAO.java  |     2 +-
 .../server/orm/dao/TopologyHostTaskDAO.java     |     6 +-
 .../orm/dao/TopologyLogicalRequestDAO.java      |     6 +-
 .../server/orm/dao/TopologyLogicalTaskDAO.java  |     6 +-
 .../server/orm/dao/TopologyRequestDAO.java      |     2 +-
 .../ambari/server/orm/dao/UpgradeDAO.java       |    76 +-
 .../apache/ambari/server/orm/dao/UserDAO.java   |     2 +-
 .../apache/ambari/server/orm/dao/ViewDAO.java   |     2 +-
 .../ambari/server/orm/dao/ViewInstanceDAO.java  |     2 +-
 .../ambari/server/orm/dao/ViewURLDAO.java       |     2 +-
 .../apache/ambari/server/orm/dao/WidgetDAO.java |     2 +-
 .../ambari/server/orm/dao/WidgetLayoutDAO.java  |     2 +-
 .../server/orm/entities/AlertCurrentEntity.java |     2 +-
 .../orm/entities/AlertDefinitionEntity.java     |     2 +-
 .../server/orm/entities/AlertGroupEntity.java   |     4 +-
 .../server/orm/entities/AlertHistoryEntity.java |     4 +-
 .../server/orm/entities/AlertNoticeEntity.java  |     2 +-
 .../server/orm/entities/AlertTargetEntity.java  |     4 +-
 .../server/orm/entities/ArtifactEntity.java     |     4 +-
 .../server/orm/entities/ArtifactEntityPK.java   |     2 +-
 .../orm/entities/BlueprintConfigEntity.java     |     2 +-
 .../orm/entities/BlueprintConfigEntityPK.java   |     2 +-
 .../server/orm/entities/BlueprintEntity.java    |     2 +-
 .../orm/entities/BlueprintSettingEntity.java    |     2 +-
 .../orm/entities/ClusterConfigEntity.java       |    16 +-
 .../server/orm/entities/ClusterEntity.java      |    25 +-
 .../orm/entities/ClusterServiceEntity.java      |     2 +-
 .../orm/entities/ClusterServiceEntityPK.java    |     2 +-
 .../server/orm/entities/ClusterStateEntity.java |     2 +-
 .../orm/entities/ClusterVersionEntity.java      |   217 -
 .../ConfigGroupConfigMappingEntity.java         |     2 +-
 .../ConfigGroupConfigMappingEntityPK.java       |     2 +-
 .../server/orm/entities/ConfigGroupEntity.java  |     2 +-
 .../entities/ConfigGroupHostMappingEntity.java  |     2 +-
 .../ConfigGroupHostMappingEntityPK.java         |     2 +-
 .../server/orm/entities/ExtensionEntity.java    |     2 +-
 .../orm/entities/ExtensionLinkEntity.java       |     3 +-
 .../ambari/server/orm/entities/GroupEntity.java |     2 +-
 .../HostComponentDesiredStateEntity.java        |    37 +-
 .../orm/entities/HostComponentStateEntity.java  |    44 +-
 .../ambari/server/orm/entities/HostEntity.java  |     2 +-
 .../ambari/server/orm/entities/HostEntity_.java |     4 +-
 .../orm/entities/HostGroupComponentEntity.java  |     2 +-
 .../entities/HostGroupComponentEntityPK.java    |     2 +-
 .../orm/entities/HostGroupConfigEntity.java     |     2 +-
 .../orm/entities/HostGroupConfigEntityPK.java   |     2 +-
 .../server/orm/entities/HostGroupEntity.java    |     2 +-
 .../server/orm/entities/HostGroupEntityPK.java  |     2 +-
 .../orm/entities/HostRoleCommandEntity.java     |    15 +
 .../server/orm/entities/HostStateEntity.java    |     2 +-
 .../server/orm/entities/HostVersionEntity.java  |    78 +-
 .../orm/entities/LdapSyncEventEntity.java       |     2 +-
 .../server/orm/entities/LdapSyncSpecEntity.java |     2 +-
 .../server/orm/entities/MemberEntity.java       |     2 +-
 .../orm/entities/OperatingSystemEntity.java     |     2 +-
 .../server/orm/entities/PrincipalEntity.java    |     2 +-
 .../orm/entities/PrincipalTypeEntity.java       |    12 +-
 .../server/orm/entities/PrivilegeEntity.java    |    10 +
 .../orm/entities/RemoteAmbariClusterEntity.java |     2 +-
 .../RemoteAmbariClusterServiceEntity.java       |     2 +-
 .../server/orm/entities/RepositoryEntity.java   |     2 +-
 .../orm/entities/RepositoryVersionEntity.java   |   142 +-
 .../server/orm/entities/RequestEntity.java      |    19 +
 .../RequestScheduleBatchRequestEntity.java      |     2 +-
 .../RequestScheduleBatchRequestEntityPK.java    |     2 +-
 .../orm/entities/RequestScheduleEntity.java     |     2 +-
 .../server/orm/entities/ResourceEntity.java     |     2 +-
 .../server/orm/entities/ResourceTypeEntity.java |     2 +-
 .../ServiceComponentDesiredStateEntity.java     |   152 +-
 .../entities/ServiceComponentHistoryEntity.java |   181 -
 .../entities/ServiceComponentVersionEntity.java |    28 +-
 .../orm/entities/ServiceConfigEntity.java       |    28 +-
 .../orm/entities/ServiceDesiredStateEntity.java |   100 +-
 .../entities/ServiceDesiredStateEntityPK.java   |     2 +-
 .../server/orm/entities/SettingEntity.java      |     2 +-
 .../ambari/server/orm/entities/StageEntity.java |    18 -
 .../server/orm/entities/StageEntity_.java       |     4 -
 .../orm/entities/TopologyHostGroupEntity.java   |     2 +-
 .../orm/entities/TopologyHostInfoEntity.java    |     2 +-
 .../orm/entities/TopologyHostRequestEntity.java |     2 +-
 .../orm/entities/TopologyHostTaskEntity.java    |     4 +-
 .../entities/TopologyLogicalRequestEntity.java  |     4 +-
 .../orm/entities/TopologyLogicalTaskEntity.java |     4 +-
 .../orm/entities/TopologyRequestEntity.java     |     2 +-
 .../server/orm/entities/UpgradeEntity.java      |   295 +-
 .../server/orm/entities/UpgradeGroupEntity.java |     2 +-
 .../orm/entities/UpgradeHistoryEntity.java      |   233 +
 .../server/orm/entities/UpgradeItemEntity.java  |     2 +-
 .../ambari/server/orm/entities/UserEntity.java  |     2 +-
 .../ambari/server/orm/entities/ViewEntity.java  |    11 +-
 .../server/orm/entities/ViewEntityEntity.java   |     2 +-
 .../orm/entities/ViewInstanceDataEntity.java    |     2 +-
 .../orm/entities/ViewInstanceDataEntityPK.java  |     2 +-
 .../server/orm/entities/ViewInstanceEntity.java |    11 +-
 .../entities/ViewInstancePropertyEntity.java    |     2 +-
 .../entities/ViewInstancePropertyEntityPK.java  |     2 +-
 .../orm/entities/ViewParameterEntity.java       |     2 +-
 .../orm/entities/ViewParameterEntityPK.java     |     2 +-
 .../server/orm/entities/ViewResourceEntity.java |     2 +-
 .../orm/entities/ViewResourceEntityPK.java      |     2 +-
 .../server/orm/entities/ViewURLEntity.java      |     2 +-
 .../server/orm/entities/WidgetEntity.java       |     2 +-
 .../server/orm/entities/WidgetLayoutEntity.java |     4 +-
 .../entities/WidgetLayoutUserWidgetEntity.java  |     4 +-
 .../WidgetLayoutUserWidgetEntityPK.java         |     4 +-
 .../ambari/server/orm/helpers/ScriptRunner.java |    10 +-
 .../server/orm/helpers/dbms/DbmsHelper.java     |    58 +
 .../orm/helpers/dbms/GenericDbmsHelper.java     |    38 +-
 .../server/orm/helpers/dbms/H2Helper.java       |    28 +-
 .../server/orm/helpers/dbms/MySqlHelper.java    |    28 +
 .../server/orm/helpers/dbms/OracleHelper.java   |    28 +
 .../server/orm/helpers/dbms/PostgresHelper.java |    27 +
 .../server/orm/models/HostComponentSummary.java |     2 +-
 .../ambari/server/proxy/ProxyService.java       |    11 +-
 .../server/resources/ResourceManager.java       |    13 +-
 .../server/resources/api/rest/GetResource.java  |    16 +-
 .../scheduler/AbstractLinearExecutionJob.java   |     8 +-
 .../ambari/server/scheduler/ExecutionJob.java   |     2 +-
 .../scheduler/ExecutionScheduleManager.java     |    34 +-
 .../server/scheduler/ExecutionScheduler.java    |     2 +-
 .../scheduler/ExecutionSchedulerImpl.java       |     8 +-
 .../server/security/CertificateManager.java     |     8 +-
 .../server/security/ClientSecurityType.java     |     2 +-
 .../security/InternalSSLSocketFactory.java      |   112 +
 .../InternalSSLSocketFactoryNonTrusting.java    |    49 +
 .../InternalSSLSocketFactoryTrusting.java       |    48 +
 .../ambari/server/security/SecurityFilter.java  |    14 +-
 .../ambari/server/security/SecurityHelper.java  |     2 +-
 .../server/security/SecurityHelperImpl.java     |     2 +-
 .../server/security/SignCertResponse.java       |     2 +-
 .../ambari/server/security/SignMessage.java     |     2 +-
 .../AmbariDelegatingAuthenticationFilter.java   |     2 +-
 .../LdapToPamMigrationHelper.java               |    73 +
 .../pam/PamAuthenticationFactory.java           |    35 +
 .../authorization/AmbariAuthentication.java     |     2 +-
 .../authorization/AmbariGrantedAuthority.java   |     2 +-
 .../AmbariLdapAuthoritiesPopulator.java         |     2 +-
 .../AmbariLdapBindAuthenticator.java            |     2 +-
 .../authorization/AmbariLocalUserProvider.java  |     2 +-
 .../AmbariPamAuthenticationProvider.java        |    34 +-
 .../authorization/AmbariUserAuthentication.java |     2 +-
 .../AmbariUserAuthorizationFilter.java          |     2 +-
 ...ateLdapUserFoundAuthenticationException.java |     2 +-
 .../security/authorization/GroupType.java       |     2 +-
 .../authorization/LdapServerProperties.java     |     2 +-
 .../PamAuthenticationException.java             |     2 +-
 .../authorization/PermissionHelper.java         |     2 +-
 .../server/security/authorization/User.java     |    12 +
 .../authorization/UserIdAuthentication.java     |     2 +-
 .../server/security/authorization/UserType.java |     2 +-
 .../server/security/authorization/Users.java    |    68 +-
 .../InternalAuthenticationInterceptor.java      |     2 +-
 .../internal/InternalTokenStorage.java          |     2 +-
 .../RunWithInternalSecurityContext.java         |     2 +-
 .../jwt/JwtAuthenticationFilter.java            |     2 +-
 .../security/encryption/AESEncryptor.java       |    26 +-
 .../encryption/AbstractCredentialStore.java     |     4 +-
 .../security/encryption/CredentialProvider.java |     2 +-
 .../security/encryption/EncryptionResult.java   |     2 +-
 .../security/encryption/MasterKeyService.java   |     2 +-
 .../encryption/MasterKeyServiceImpl.java        |    18 +-
 .../server/security/ldap/LdapBatchDto.java      |     2 +-
 .../server/security/ldap/LdapGroupDto.java      |     2 +-
 .../server/security/ldap/LdapSyncDto.java       |     2 +-
 .../server/security/ldap/LdapUserDto.java       |     2 +-
 .../security/ldap/LdapUserGroupMemberDto.java   |     2 +-
 .../unsecured/rest/CertificateDownload.java     |    13 +-
 .../unsecured/rest/CertificateSign.java         |    12 +-
 .../security/unsecured/rest/ConnectionInfo.java |    13 +-
 .../serveraction/AbstractServerAction.java      |     2 +-
 .../server/serveraction/ServerAction.java       |     2 +-
 .../serveraction/ServerActionExecutor.java      |     3 +-
 .../kerberos/ADKerberosOperationHandler.java    |    45 +-
 .../AbstractPrepareKerberosServerAction.java    |    21 +-
 .../server/serveraction/kerberos/Component.java |    74 +
 .../kerberos/CreateKeytabFilesServerAction.java |     6 +-
 .../kerberos/DeconstructedPrincipal.java        |     2 +-
 .../kerberos/DestroyPrincipalsServerAction.java |     2 +-
 .../kerberos/FinalizeKerberosServerAction.java  |    66 +-
 .../kerberos/IPAKerberosOperationHandler.java   |    26 +-
 .../KerberosKDCSSLConnectionException.java      |    45 +
 .../kerberos/KerberosOperationHandler.java      |    12 +-
 .../kerberos/KerberosServerAction.java          |    33 +
 .../kerberos/MITKerberosOperationHandler.java   |     2 +-
 .../kerberos/PreconfigureServiceType.java       |    46 +
 .../PrepareDisableKerberosServerAction.java     |    47 +-
 .../PrepareEnableKerberosServerAction.java      |    41 +-
 .../PrepareKerberosIdentitiesServerAction.java  |    51 +-
 .../kerberos/TrustingSSLSocketFactory.java      |   101 -
 .../UpdateKerberosConfigsServerAction.java      |     5 +-
 .../upgrades/AbstractUpgradeServerAction.java   |    66 +
 .../upgrades/AutoSkipFailedSummaryAction.java   |    14 +-
 .../upgrades/ComponentVersionCheckAction.java   |    28 +-
 .../serveraction/upgrades/ConfigureAction.java  |    36 +-
 .../upgrades/FinalizeUpgradeAction.java         |   634 +-
 .../FixCapacitySchedulerOrderingPolicy.java     |     7 +-
 .../upgrades/FixYarnWebServiceUrl.java          |     2 +-
 .../upgrades/HiveZKQuorumConfigAction.java      |     2 +-
 .../upgrades/KerberosKeytabsAction.java         |     2 +-
 .../upgrades/ManualStageAction.java             |     2 +-
 .../upgrades/PreconfigureKerberosAction.java    |   573 +
 .../upgrades/RangerConfigCalculation.java       |     2 +-
 .../RangerKerberosConfigCalculation.java        |     4 +-
 .../upgrades/RangerKmsProxyConfig.java          |     2 +-
 .../upgrades/RangerWebAlertConfigAction.java    |     2 +-
 .../upgrades/UpdateDesiredRepositoryAction.java |   189 +
 .../upgrades/UpdateDesiredStackAction.java      |   194 -
 .../upgrades/UpgradeUserKerberosDescriptor.java |   142 +-
 .../upgrades/ZooKeeperQuorumCalculator.java     |     2 +-
 .../users/CollectionPersisterService.java       |     2 +-
 .../CollectionPersisterServiceFactory.java      |     2 +-
 .../users/CsvFilePersisterService.java          |     2 +-
 .../users/PostUserCreationHookServerAction.java |     2 +-
 .../users/ShellCommandCallableFactory.java      |     2 +-
 .../users/ShellCommandUtilityCallable.java      |     2 +-
 .../users/ShellCommandUtilityWrapper.java       |     2 +-
 .../apache/ambari/server/stack/BaseModule.java  |     2 +-
 .../server/stack/CommonServiceDirectory.java    |    10 +-
 .../ambari/server/stack/ComponentModule.java    |     6 +-
 .../server/stack/ConfigurationDirectory.java    |     7 +-
 .../ambari/server/stack/ConfigurationInfo.java  |     2 +-
 .../server/stack/ConfigurationModule.java       |     2 +-
 .../ambari/server/stack/ExtensionDirectory.java |     7 +-
 .../ambari/server/stack/ExtensionHelper.java    |     2 +-
 .../ambari/server/stack/ExtensionModule.java    |     8 +-
 .../apache/ambari/server/stack/HostsType.java   |     2 +-
 .../ambari/server/stack/MasterHostResolver.java |    77 +-
 .../server/stack/ModuleFileUnmarshaller.java    |     6 +-
 .../apache/ambari/server/stack/ModuleState.java |     2 +-
 .../server/stack/NoSuchStackException.java      |     2 +-
 .../stack/QuickLinksConfigurationModule.java    |     4 +-
 .../apache/ambari/server/stack/RepoUtil.java    |     8 +-
 .../ambari/server/stack/ServiceDirectory.java   |    18 +-
 .../ambari/server/stack/ServiceModule.java      |    27 +-
 .../ambari/server/stack/StackContext.java       |    30 +-
 .../server/stack/StackDefinitionDirectory.java  |     2 +-
 .../server/stack/StackDefinitionModule.java     |     2 +-
 .../ambari/server/stack/StackDirectory.java     |   101 +-
 .../ambari/server/stack/StackManager.java       |   103 +-
 .../server/stack/StackManagerFactory.java       |     2 +-
 .../apache/ambari/server/stack/StackModule.java |    74 +-
 .../server/stack/StackServiceDirectory.java     |    11 +-
 .../apache/ambari/server/stack/ThemeModule.java |     4 +-
 .../stack/UpdateActiveRepoVersionOnStartup.java |    51 +-
 .../apache/ambari/server/stack/Validable.java   |     2 +-
 .../ambari/server/stageplanner/RoleGraph.java   |    55 +-
 .../server/stageplanner/RoleGraphFactory.java   |     2 +-
 .../server/stageplanner/RoleGraphNode.java      |     2 +-
 .../ambari/server/state/AgentVersion.java       |     2 +-
 .../ambari/server/state/AlertFirmness.java      |     2 +-
 .../apache/ambari/server/state/AlertState.java  |     6 +-
 .../ambari/server/state/AutoDeployInfo.java     |     2 +-
 .../server/state/BulkCommandDefinition.java     |     2 +-
 .../ambari/server/state/ChangedConfigInfo.java  |     2 +-
 .../apache/ambari/server/state/CheckHelper.java |    43 +-
 .../state/ClientConfigFileDefinition.java       |    17 +-
 .../org/apache/ambari/server/state/Cluster.java |   218 +-
 .../server/state/ClusterHealthReport.java       |    45 +-
 .../apache/ambari/server/state/Clusters.java    |    11 +-
 .../server/state/CommandScriptDefinition.java   |     2 +-
 .../ambari/server/state/ComponentInfo.java      |    15 +
 .../org/apache/ambari/server/state/Config.java  |     2 +-
 .../ambari/server/state/ConfigFactory.java      |    15 +-
 .../ambari/server/state/ConfigHelper.java       |   393 +-
 .../apache/ambari/server/state/ConfigImpl.java  |    29 +-
 .../ambari/server/state/ConfigMergeHelper.java  |     8 +-
 .../server/state/CredentialStoreInfo.java       |     2 +-
 .../server/state/CustomCommandDefinition.java   |     7 +-
 .../server/state/DependencyConditionInfo.java   |     2 +-
 .../ambari/server/state/DependencyInfo.java     |     2 +-
 .../apache/ambari/server/state/ExtensionId.java |     2 +-
 .../ambari/server/state/ExtensionInfo.java      |    28 +-
 .../org/apache/ambari/server/state/Host.java    |     2 +-
 .../server/state/HostComponentAdminState.java   |     2 +-
 .../apache/ambari/server/state/HostEvent.java   |     2 +-
 .../ambari/server/state/HostEventType.java      |     2 +-
 .../ambari/server/state/HostHealthStatus.java   |     2 +-
 .../apache/ambari/server/state/HostState.java   |     2 +-
 .../ambari/server/state/LogDefinition.java      |     2 +-
 .../ambari/server/state/MaintenanceState.java   |     2 +-
 .../ambari/server/state/NotificationState.java  |     2 +-
 .../server/state/OperatingSystemInfo.java       |     2 +-
 .../server/state/PropertyDependencyInfo.java    |     2 +-
 .../ambari/server/state/PropertyInfo.java       |     4 +-
 .../state/PropertyStackUpgradeBehavior.java     |     2 +-
 .../server/state/PropertyUpgradeBehavior.java   |     2 +-
 .../state/QuickLinksConfigurationInfo.java      |    10 +-
 .../ambari/server/state/RepositoryInfo.java     |    22 +-
 .../ambari/server/state/RepositoryType.java     |    41 +-
 .../server/state/RepositoryVersionState.java    |    85 +-
 .../ambari/server/state/SecurityState.java      |    83 -
 .../org/apache/ambari/server/state/Service.java |    43 +-
 .../ambari/server/state/ServiceComponent.java   |    29 +-
 .../server/state/ServiceComponentFactory.java   |     5 +-
 .../server/state/ServiceComponentHost.java      |    79 +-
 .../server/state/ServiceComponentHostEvent.java |     2 +-
 .../state/ServiceComponentHostEventType.java    |     2 +-
 .../state/ServiceComponentHostFactory.java      |     2 +-
 .../server/state/ServiceComponentImpl.java      |   253 +-
 .../ambari/server/state/ServiceFactory.java     |    27 +-
 .../apache/ambari/server/state/ServiceImpl.java |   183 +-
 .../apache/ambari/server/state/ServiceInfo.java |    45 +-
 .../ambari/server/state/ServiceOsSpecific.java  |     2 +-
 .../server/state/ServicePropertyInfo.java       |     2 +-
 .../org/apache/ambari/server/state/StackId.java |     2 +-
 .../apache/ambari/server/state/StackInfo.java   |    82 +-
 .../org/apache/ambari/server/state/State.java   |     2 +-
 .../apache/ambari/server/state/ThemeInfo.java   |     2 +-
 .../ambari/server/state/UpgradeContext.java     |  1262 +-
 .../server/state/UpgradeContextFactory.java     |    17 +-
 .../ambari/server/state/UpgradeHelper.java      |   491 +-
 .../ambari/server/state/UpgradeState.java       |     2 +-
 .../server/state/ValueAttributesInfo.java       |    77 +-
 .../ambari/server/state/ValueEntryInfo.java     |     8 +-
 .../ambari/server/state/action/Action.java      |     2 +-
 .../state/action/ActionCompletedEvent.java      |     2 +-
 .../ambari/server/state/action/ActionEvent.java |     2 +-
 .../server/state/action/ActionEventType.java    |     2 +-
 .../server/state/action/ActionFailedEvent.java  |     2 +-
 .../ambari/server/state/action/ActionId.java    |     2 +-
 .../ambari/server/state/action/ActionImpl.java  |    25 +-
 .../server/state/action/ActionInitEvent.java    |     2 +-
 .../state/action/ActionProgressUpdateEvent.java |     2 +-
 .../ambari/server/state/action/ActionState.java |     2 +-
 .../ambari/server/state/action/ActionType.java  |     2 +-
 .../state/alert/AggregateDefinitionMapping.java |     4 +-
 .../server/state/alert/AggregateSource.java     |     2 +-
 .../server/state/alert/AlertDefinition.java     |     2 +-
 .../state/alert/AlertDefinitionFactory.java     |     2 +-
 .../server/state/alert/AlertDefinitionHash.java |    16 +-
 .../ambari/server/state/alert/AlertGroup.java   |     2 +-
 .../server/state/alert/AlertNotification.java   |     2 +-
 .../ambari/server/state/alert/AlertTarget.java  |     2 +-
 .../ambari/server/state/alert/AlertUri.java     |    19 +-
 .../ambari/server/state/alert/AmsSource.java    |     2 +-
 .../ambari/server/state/alert/MetricSource.java |     2 +-
 .../server/state/alert/ParameterizedSource.java |     2 +-
 .../server/state/alert/PercentSource.java       |     2 +-
 .../ambari/server/state/alert/PortSource.java   |     2 +-
 .../server/state/alert/RecoverySource.java      |     2 +-
 .../ambari/server/state/alert/Reporting.java    |     2 +-
 .../apache/ambari/server/state/alert/Scope.java |     2 +-
 .../ambari/server/state/alert/ScriptSource.java |     2 +-
 .../ambari/server/state/alert/ServerSource.java |     2 +-
 .../ambari/server/state/alert/Source.java       |     2 +-
 .../ambari/server/state/alert/SourceType.java   |     2 +-
 .../ambari/server/state/alert/TargetType.java   |     2 +-
 .../ambari/server/state/alert/WebSource.java    |     2 +-
 .../server/state/cluster/ClusterFactory.java    |     2 +-
 .../server/state/cluster/ClusterImpl.java       |  1210 +-
 .../server/state/cluster/ClustersImpl.java      |   108 +-
 .../server/state/configgroup/ConfigGroup.java   |     4 +-
 .../state/configgroup/ConfigGroupFactory.java   |     7 +-
 .../state/configgroup/ConfigGroupImpl.java      |    47 +-
 .../fsm/InvalidStateTransitionException.java    |     2 +-
 .../server/state/fsm/MultipleArcTransition.java |     2 +-
 .../server/state/fsm/SingleArcTransition.java   |     2 +-
 .../ambari/server/state/fsm/StateMachine.java   |     2 +-
 .../server/state/fsm/StateMachineFactory.java   |     2 +-
 .../server/state/fsm/event/AbstractEvent.java   |     2 +-
 .../ambari/server/state/fsm/event/Event.java    |     2 +-
 .../server/state/fsm/event/EventHandler.java    |     2 +-
 .../ambari/server/state/host/HostFactory.java   |     2 +-
 .../state/host/HostHealthyHeartbeatEvent.java   |     2 +-
 .../state/host/HostHeartbeatLostEvent.java      |     2 +-
 .../ambari/server/state/host/HostImpl.java      |    41 +-
 .../host/HostRegistrationRequestEvent.java      |     2 +-
 .../host/HostStatusUpdatesReceivedEvent.java    |     2 +-
 .../state/host/HostUnhealthyHeartbeatEvent.java |     2 +-
 .../kerberos/AbstractKerberosDescriptor.java    |    51 +-
 .../AbstractKerberosDescriptorContainer.java    |    12 +
 .../kerberos/KerberosComponentDescriptor.java   |     2 +-
 .../state/kerberos/KerberosDescriptor.java      |    69 +-
 .../KerberosDescriptorUpdateHelper.java         |     9 +-
 .../kerberos/KerberosIdentityDescriptor.java    |    26 +-
 .../kerberos/KerberosPrincipalDescriptor.java   |     2 +-
 .../kerberos/KerberosServiceDescriptor.java     |    90 +-
 .../kerberos/VariableReplacementHelper.java     |    23 +-
 .../ambari/server/state/quicklinks/Port.java    |    15 +
 .../DefaultQuickLinkVisibilityController.java   |     6 +-
 .../server/state/quicklinksprofile/Filter.java  |     4 +-
 .../state/repository/AvailableService.java      |     2 +-
 .../repository/AvailableServiceReference.java   |     2 +-
 .../state/repository/AvailableVersion.java      |    23 +-
 .../state/repository/ClusterVersionSummary.java |    56 +
 .../state/repository/ManifestService.java       |    12 +-
 .../state/repository/ManifestServiceInfo.java   |     2 +-
 .../ambari/server/state/repository/Release.java |     4 +-
 .../state/repository/ServiceVersionSummary.java |    79 +
 .../state/repository/VersionDefinitionXml.java  |   184 +-
 .../server/state/repository/package-info.java   |     2 +-
 .../ambari/server/state/scheduler/Batch.java    |     2 +-
 .../server/state/scheduler/BatchRequest.java    |     2 +-
 .../server/state/scheduler/BatchRequestJob.java |     2 +-
 .../state/scheduler/BatchRequestResponse.java   |     2 +-
 .../server/state/scheduler/BatchSettings.java   |     2 +-
 .../state/scheduler/RequestExecution.java       |     2 +-
 .../scheduler/RequestExecutionFactory.java      |     2 +-
 .../state/scheduler/RequestExecutionImpl.java   |     2 +-
 .../ambari/server/state/scheduler/Schedule.java |     2 +-
 .../services/AlertNoticeDispatchService.java    |    90 +-
 .../services/AmbariServerAlertService.java      |     2 +-
 .../state/services/CachedAlertFlushService.java |     4 +-
 .../state/services/MetricsRetrievalService.java |     2 +-
 .../services/RetryUpgradeActionService.java     |    24 +-
 .../server/state/stack/ConfigUpgradePack.java   |     6 +-
 .../server/state/stack/ConfigurationXml.java    |     2 +-
 .../state/stack/ExtensionMetainfoXml.java       |    13 +-
 .../server/state/stack/JsonOsFamilyEntry.java   |     2 +-
 .../server/state/stack/JsonOsFamilyRoot.java    |     2 +-
 .../server/state/stack/LatestRepoCallable.java  |   129 +-
 .../ambari/server/state/stack/Metric.java       |     4 +-
 .../server/state/stack/MetricDefinition.java    |     2 +-
 .../ambari/server/state/stack/OsFamily.java     |    18 +-
 .../server/state/stack/RepositoryXml.java       |     8 +-
 .../server/state/stack/ServiceMetainfoXml.java  |     2 +-
 .../server/state/stack/StackMetainfoXml.java    |     2 +-
 .../state/stack/StackRoleCommandOrder.java      |     4 +-
 .../server/state/stack/TrimmingAdapter.java     |     4 +-
 .../ambari/server/state/stack/UpgradePack.java  |     4 +-
 .../ambari/server/state/stack/WidgetLayout.java |     2 +-
 .../server/state/stack/WidgetLayoutInfo.java    |     2 +-
 .../ambari/server/state/stack/package-info.java |     4 +-
 .../server/state/stack/upgrade/Batch.java       |     2 +-
 .../state/stack/upgrade/ClusterGrouping.java    |    50 +-
 .../state/stack/upgrade/ColocatedGrouping.java  |    10 +-
 .../server/state/stack/upgrade/Condition.java   |     2 +-
 .../upgrade/ConfigUpgradeChangeDefinition.java  |     9 +-
 .../stack/upgrade/ConfigurationCondition.java   |     2 +-
 .../state/stack/upgrade/ConfigureFunction.java  |     2 +-
 .../state/stack/upgrade/ConfigureTask.java      |     6 +-
 .../server/state/stack/upgrade/Direction.java   |    11 +-
 .../state/stack/upgrade/ExecuteHostType.java    |     2 +-
 .../server/state/stack/upgrade/ExecuteTask.java |     6 +-
 .../server/state/stack/upgrade/Grouping.java    |    21 +-
 .../state/stack/upgrade/HostOrderGrouping.java  |    23 +-
 .../state/stack/upgrade/HostOrderItem.java      |     4 +-
 .../server/state/stack/upgrade/ManualTask.java  |     2 +-
 .../state/stack/upgrade/ParallelScheduler.java  |     2 +-
 .../state/stack/upgrade/PropertyKeyState.java   |     2 +-
 .../stack/upgrade/RepositoryVersionHelper.java  |   119 +-
 .../state/stack/upgrade/RestartGrouping.java    |     4 +-
 .../server/state/stack/upgrade/RestartTask.java |     4 +-
 .../state/stack/upgrade/SecurityCondition.java  |     2 +-
 .../state/stack/upgrade/ServerActionTask.java   |     2 +-
 .../stack/upgrade/ServerSideActionTask.java     |     2 +-
 .../stack/upgrade/ServiceCheckGrouping.java     |    67 +-
 .../state/stack/upgrade/ServiceCheckTask.java   |     4 +-
 .../state/stack/upgrade/StageWrapper.java       |     6 +-
 .../stack/upgrade/StageWrapperBuilder.java      |     4 +-
 .../state/stack/upgrade/StartGrouping.java      |     4 +-
 .../server/state/stack/upgrade/StartTask.java   |     4 +-
 .../state/stack/upgrade/StopGrouping.java       |     4 +-
 .../server/state/stack/upgrade/StopTask.java    |     4 +-
 .../ambari/server/state/stack/upgrade/Task.java |     2 +-
 .../server/state/stack/upgrade/TaskWrapper.java |     4 +-
 .../state/stack/upgrade/TaskWrapperBuilder.java |     4 +-
 .../stack/upgrade/TransferCoercionType.java     |     2 +-
 .../state/stack/upgrade/TransferOperation.java  |     2 +-
 .../stack/upgrade/UpdateStackGrouping.java      |     2 +-
 .../state/stack/upgrade/UpgradeFunction.java    |     2 +-
 .../state/stack/upgrade/UpgradeScope.java       |    11 +-
 .../server/state/stack/upgrade/UpgradeType.java |     2 +-
 .../svccomphost/ServiceComponentHostImpl.java   |   280 +-
 .../ServiceComponentHostInstallEvent.java       |     2 +-
 .../ServiceComponentHostOpFailedEvent.java      |     2 +-
 .../ServiceComponentHostOpInProgressEvent.java  |     2 +-
 .../ServiceComponentHostOpRestartedEvent.java   |     2 +-
 .../ServiceComponentHostOpSucceededEvent.java   |     2 +-
 .../ServiceComponentHostStartEvent.java         |     2 +-
 .../ServiceComponentHostStartedEvent.java       |     2 +-
 .../ServiceComponentHostStopEvent.java          |     2 +-
 .../ServiceComponentHostStoppedEvent.java       |     2 +-
 .../ServiceComponentHostSummary.java            |   106 +-
 .../ServiceComponentHostUninstallEvent.java     |     2 +-
 .../ServiceComponentHostUpgradeEvent.java       |     2 +-
 .../ServiceComponentHostWipeoutEvent.java       |     2 +-
 .../server/state/theme/ConfigCondition.java     |    15 +-
 .../server/state/theme/ConfigPlacement.java     |    25 +-
 .../ambari/server/state/theme/Layout.java       |     5 +
 .../ambari/server/state/theme/Section.java      |    22 +-
 .../ambari/server/state/theme/Subsection.java   |    13 +-
 .../apache/ambari/server/state/theme/Tab.java   |    12 +-
 .../ambari/server/state/theme/TabLayout.java    |     8 +-
 .../apache/ambari/server/state/theme/Theme.java |     9 +-
 .../server/state/theme/ThemeConfiguration.java  |    10 +-
 .../apache/ambari/server/state/theme/Unit.java  |     7 +-
 .../ambari/server/state/theme/Widget.java       |    12 +-
 .../ambari/server/state/theme/WidgetEntry.java  |     9 +-
 .../ambari/server/topology/AmbariContext.java   |   176 +-
 .../ambari/server/topology/Blueprint.java       |    13 +-
 .../server/topology/BlueprintFactory.java       |     2 +-
 .../ambari/server/topology/BlueprintImpl.java   |    54 +-
 .../server/topology/BlueprintValidator.java     |     2 +-
 .../server/topology/BlueprintValidatorImpl.java |    90 +-
 .../ambari/server/topology/Cardinality.java     |     2 +-
 .../topology/ClusterConfigurationRequest.java   |    71 +-
 .../ambari/server/topology/ClusterTopology.java |     2 +-
 .../server/topology/ClusterTopologyImpl.java    |     2 +-
 .../ambari/server/topology/Component.java       |     2 +-
 .../ambari/server/topology/Configuration.java   |     6 +-
 .../server/topology/ConfigurationFactory.java   |     2 +-
 .../ambari/server/topology/Credential.java      |     2 +-
 .../ambari/server/topology/HostGroup.java       |     2 +-
 .../ambari/server/topology/HostGroupImpl.java   |     4 +-
 .../ambari/server/topology/HostGroupInfo.java   |     2 +-
 .../ambari/server/topology/HostRequest.java     |    22 +-
 .../topology/InvalidTopologyException.java      |     2 +-
 .../InvalidTopologyTemplateException.java       |     2 +-
 .../topology/KerberosDescriptorFactory.java     |     5 +-
 .../ambari/server/topology/LogicalRequest.java  |    65 +-
 .../server/topology/LogicalRequestFactory.java  |     2 +-
 .../topology/NoSuchBlueprintException.java      |     2 +-
 .../topology/NoSuchHostGroupException.java      |     2 +-
 .../ambari/server/topology/PersistedState.java  |    10 +-
 .../server/topology/PersistedStateImpl.java     |    51 +-
 .../topology/PersistedTopologyRequest.java      |     2 +-
 .../server/topology/RepositorySetting.java      |   116 +
 .../server/topology/SecurityConfiguration.java  |     2 +-
 .../topology/SecurityConfigurationFactory.java  |     2 +-
 .../apache/ambari/server/topology/Setting.java  |     4 +-
 .../ambari/server/topology/SettingFactory.java  |     2 +-
 .../ambari/server/topology/TopologyManager.java |   117 +-
 .../ambari/server/topology/TopologyRequest.java |     2 +-
 .../server/topology/TopologyRequestFactory.java |     2 +-
 .../topology/TopologyRequestFactoryImpl.java    |     2 +-
 .../server/topology/TopologyValidator.java      |     2 +-
 .../topology/tasks/ConfigureClusterTask.java    |     2 +-
 .../tasks/ConfigureClusterTaskFactory.java      |     2 +-
 .../server/topology/tasks/InstallHostTask.java  |    24 +-
 .../tasks/PersistHostResourcesTask.java         |     3 +
 .../tasks/RegisterWithConfigGroupTask.java      |     3 +
 .../server/topology/tasks/StartHostTask.java    |    23 +-
 .../server/topology/tasks/TopologyHostTask.java |     4 +-
 .../server/topology/tasks/TopologyTask.java     |     2 +-
 .../validators/ClusterConfigTypeValidator.java  |     2 +-
 .../RequiredConfigPropertiesValidator.java      |   191 +
 .../validators/TopologyValidatorFactory.java    |     3 +-
 .../validators/UnitValidatedProperty.java       |    95 +
 .../topology/validators/UnitValidator.java      |    79 +
 .../server/upgrade/AbstractUpgradeCatalog.java  |    44 +-
 .../server/upgrade/FinalUpgradeCatalog.java     |    32 +-
 .../server/upgrade/SchemaUpgradeHelper.java     |    17 +-
 .../server/upgrade/StackUpgradeHelper.java      |   171 -
 .../ambari/server/upgrade/StackUpgradeUtil.java |   198 -
 .../server/upgrade/UpgradeCatalog200.java       |   612 -
 .../server/upgrade/UpgradeCatalog210.java       |  1761 -
 .../server/upgrade/UpgradeCatalog211.java       |   295 -
 .../server/upgrade/UpgradeCatalog212.java       |   419 -
 .../server/upgrade/UpgradeCatalog2121.java      |   194 -
 .../server/upgrade/UpgradeCatalog220.java       |  1409 -
 .../server/upgrade/UpgradeCatalog221.java       |   449 -
 .../server/upgrade/UpgradeCatalog222.java       |   751 -
 .../server/upgrade/UpgradeCatalog230.java       |   402 -
 .../server/upgrade/UpgradeCatalog240.java       |  3052 -
 .../server/upgrade/UpgradeCatalog2402.java      |   121 -
 .../server/upgrade/UpgradeCatalog242.java       |   272 -
 .../server/upgrade/UpgradeCatalog250.java       |  1391 -
 .../server/upgrade/UpgradeCatalog251.java       |   117 +
 .../server/upgrade/UpgradeCatalog252.java       |   438 +
 .../server/upgrade/UpgradeCatalog260.java       |   498 +
 .../server/upgrade/UpgradeCatalog300.java       |   211 +-
 .../apache/ambari/server/utils/AmbariPath.java  |     2 +-
 .../ambari/server/utils/CommandUtils.java       |     2 +-
 .../apache/ambari/server/utils/DateUtils.java   |     2 +-
 .../server/utils/EventBusSynchronizer.java      |     2 +-
 .../apache/ambari/server/utils/HTTPUtils.java   |     5 +-
 .../apache/ambari/server/utils/HostAndPort.java |     4 +-
 .../ambari/server/utils/JaxbMapKeyList.java     |     2 +-
 .../server/utils/JaxbMapKeyListAdapter.java     |     2 +-
 .../ambari/server/utils/JaxbMapKeyMap.java      |     2 +-
 .../server/utils/JaxbMapKeyMapAdapter.java      |     2 +-
 .../ambari/server/utils/JaxbMapKeyVal.java      |     2 +-
 .../server/utils/JaxbMapKeyValAdapter.java      |     2 +-
 .../apache/ambari/server/utils/LoopBody.java    |     4 +-
 .../apache/ambari/server/utils/Parallel.java    |     2 +-
 .../ambari/server/utils/ParallelLoopResult.java |     2 +-
 .../ambari/server/utils/RequestUtils.java       |     2 +-
 .../ambari/server/utils/SecretReference.java    |     4 +-
 .../apache/ambari/server/utils/SetUtils.java    |     2 +-
 .../ambari/server/utils/ShellCommandUtil.java   |    31 +-
 .../apache/ambari/server/utils/StageUtils.java  |    78 +-
 .../ambari/server/utils/VersionUtils.java       |     2 +-
 .../apache/ambari/server/view/ClusterImpl.java  |     2 +-
 .../ambari/server/view/DefaultMasker.java       |     2 +-
 .../ambari/server/view/DirectoryWatcher.java    |     2 +-
 .../server/view/HttpImpersonatorImpl.java       |     4 +-
 .../server/view/IllegalClusterException.java    |     2 +-
 .../server/view/ImpersonatorSettingImpl.java    |     2 +-
 .../ambari/server/view/RemoteAmbariCluster.java |     2 +-
 .../view/RemoteAmbariClusterRegistry.java       |     2 +-
 .../RemoteAmbariConfigurationReadException.java |     2 +-
 .../server/view/RemoteAmbariStreamProvider.java |     2 +-
 .../server/view/ViewAmbariStreamProvider.java   |     4 +-
 .../ambari/server/view/ViewArchiveUtility.java  |     2 +-
 .../ambari/server/view/ViewClassLoader.java     |     2 +-
 .../ambari/server/view/ViewContextImpl.java     |    12 +-
 .../view/ViewDataMigrationContextImpl.java      |    10 +-
 .../server/view/ViewDataMigrationUtility.java   |     6 +-
 .../server/view/ViewDirectoryWatcher.java       |     8 +-
 .../view/ViewExternalSubResourceProvider.java   |     2 +-
 .../ambari/server/view/ViewExtractor.java       |    10 +-
 .../server/view/ViewInstanceHandlerList.java    |     2 +-
 .../view/ViewInstanceOperationHandler.java      |    96 +
 .../ambari/server/view/ViewProviderModule.java  |     2 +-
 .../apache/ambari/server/view/ViewRegistry.java |   113 +-
 .../server/view/ViewSubResourceDefinition.java  |     2 +-
 .../server/view/ViewSubResourceProvider.java    |     2 +-
 .../ambari/server/view/ViewThrottleFilter.java  |     2 +-
 .../server/view/ViewURLStreamProvider.java      |    20 +-
 .../server/view/configuration/EntityConfig.java |     2 +-
 .../view/configuration/InstanceConfig.java      |     4 +-
 .../view/configuration/ParameterConfig.java     |     2 +-
 .../view/configuration/PermissionConfig.java    |     2 +-
 .../view/configuration/PersistenceConfig.java   |     4 +-
 .../view/configuration/PropertyConfig.java      |     2 +-
 .../view/configuration/ResourceConfig.java      |     4 +-
 .../server/view/configuration/ViewConfig.java   |    10 +-
 .../ambari/server/view/events/EventImpl.java    |     4 +-
 .../server/view/persistence/DataStoreImpl.java  |     4 +-
 .../view/persistence/DataStoreModule.java       |     4 +-
 .../view/persistence/SchemaManagerFactory.java  |     2 +-
 .../InstanceValidationResultImpl.java           |     2 +-
 .../view/validation/ValidationException.java    |     2 +-
 .../view/validation/ValidationResultImpl.java   |     2 +-
 .../src/main/package/rpm/postinstall.sh         |    18 -
 ambari-server/src/main/python/ambari-server.py  |   329 +-
 .../src/main/python/ambari_server/dbCleanup.py  |    34 +-
 .../ambari_server/dbConfiguration_linux.py      |    61 +-
 .../python/ambari_server/resourceFilesKeeper.py |    11 +-
 .../python/ambari_server/serverConfiguration.py |    14 +-
 .../main/python/ambari_server/serverSetup.py    |   105 +-
 .../main/python/ambari_server/serverUpgrade.py  |   205 +-
 .../main/python/ambari_server/setupActions.py   |     4 +-
 .../main/python/ambari_server/setupMpacks.py    |    51 +-
 .../main/python/ambari_server/setupSecurity.py  |   123 +-
 .../src/main/python/ambari_server_main.py       |     2 +-
 .../src/main/python/azuredb_create_generator.py |    85 +
 ambari-server/src/main/python/setupAgent.py     |     4 +-
 ambari-server/src/main/python/upgradeHelper.py  |  2338 -
 ambari-server/src/main/resources/.gitignore     |     1 +
 .../resources/Ambari-DDL-AzureDB-CREATE.sql     |   306 +-
 .../main/resources/Ambari-DDL-Derby-CREATE.sql  |    69 +-
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |    70 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |    81 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |    69 +-
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql |    72 +-
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |    75 +-
 .../src/main/resources/META-INF/persistence.xml |     4 +-
 ambari-server/src/main/resources/alerts.json    |    12 +
 .../1.6.1.2.2.0/configuration/accumulo-env.xml  |     5 +
 .../ACCUMULO/1.6.1.2.2.0/kerberos.json          |     6 +-
 .../package/scripts/accumulo_client.py          |     7 +-
 .../package/scripts/accumulo_configuration.py   |     3 +
 .../package/scripts/accumulo_script.py          |    36 +-
 .../1.6.1.2.2.0/package/scripts/params.py       |    22 +-
 .../package/templates/accumulo_jaas.conf.j2     |    29 +
 .../hadoop-metrics2-accumulo.properties.j2      |     3 +
 .../templates/input.config-accumulo.json.j2     |    92 -
 .../0.1.0/configuration/infra-solr-env.xml      |    16 +-
 .../AMBARI_INFRA/0.1.0/kerberos.json            |     6 +-
 .../0.1.0/package/scripts/infra_solr.py         |     6 +-
 .../0.1.0/package/scripts/params.py             |    12 +-
 .../0.1.0/package/scripts/setup_infra_solr.py   |    17 +-
 .../0.1.0/package/scripts/status_params.py      |     6 +
 .../0.1.0/properties/infra-solr-env.sh.j2       |     3 +-
 .../properties/solr-client-log4j.properties.j2  |     4 +
 .../AMBARI_INFRA/0.1.0/service_advisor.py       |   133 +
 .../0.1.0/configuration/ams-env.xml             |    12 +
 .../0.1.0/configuration/ams-hbase-env.xml       |    20 +-
 .../0.1.0/configuration/ams-hbase-site.xml      |    24 +-
 .../0.1.0/configuration/ams-site.xml            |    79 +-
 .../0.1.0/configuration/ams-ssl-client.xml      |     9 -
 .../AMBARI_METRICS/0.1.0/kerberos.json          |    32 +-
 .../AMBARI_METRICS/0.1.0/metainfo.xml           |    18 +
 .../HDF/grafana-nifi-hosts.json                 |    17 +-
 .../HDP/grafana-hbase-misc.json                 |    18 +-
 .../HDP/grafana-hbase-regionservers.json        |  1459 +-
 .../HDP/grafana-hdfs-datanodes.json             |    18 +-
 .../HDP/grafana-hdfs-home.json                  |    18 +-
 .../HDP/grafana-hdfs-namenodes.json             |    18 +-
 .../HDP/grafana-hdfs-topn.json                  |    18 +-
 .../HDP/grafana-hive-hivemetastore.json         |    18 +-
 .../HDP/grafana-hive-hiverserver2.json          |    18 +-
 .../HDP/grafana-kafka-hosts.json                |    18 +-
 .../HDP/grafana-llapdaemon-daemons.json         |    17 +-
 .../HDP/grafana-llapdaemon-heatmaps.json        |    17 +-
 .../HDP/grafana-solr-cores-dashboard.json       |    18 +-
 .../HDP/grafana-solr-hosts-dashboard.json       |    18 +-
 .../HDP/grafana-yarn-nodemanagers.json          |    18 +-
 .../HDP/grafana-yarn-resourcemanagers.json      |    18 +-
 .../default/grafana-ambari-server-database.json |    19 +-
 .../default/grafana-ambari-server-topn.json     |    18 +-
 .../default/grafana-ambari-server.json          |    18 +-
 .../default/grafana-ams-hbase-misc.json         |    18 +-
 .../grafana-ams-hbase-regionservers.json        |    17 +-
 .../default/grafana-system-servers.json         |    18 +-
 .../AMBARI_METRICS/0.1.0/package/scripts/ams.py |    72 +-
 .../package/scripts/metrics_grafana_util.py     |    37 +-
 .../0.1.0/package/scripts/params.py             |    47 +-
 .../0.1.0/package/scripts/params_linux.py       |     6 +
 .../0.1.0/package/scripts/service_check.py      |   209 +-
 .../hadoop-metrics2-hbase.properties.j2         |     3 +
 .../package/templates/hbase_master_jaas.conf.j2 |    10 +
 .../templates/hbase_regionserver_jaas.conf.j2   |    10 +
 .../input.config-ambari-metrics.json.j2         |   169 -
 .../package/templates/metric_monitor.ini.j2     |    11 +
 .../AMBARI_METRICS/0.1.0/themes/theme.json      |   288 +
 .../ATLAS/0.1.0.2.3/kerberos.json               |     6 +-
 .../0.1.0.2.3/package/scripts/atlas_client.py   |    10 +-
 .../ATLAS/0.1.0.2.3/package/scripts/metadata.py |    30 +-
 .../package/scripts/metadata_server.py          |     9 +-
 .../ATLAS/0.1.0.2.3/package/scripts/params.py   |    12 +-
 .../configuration/application-properties.xml    |    10 +-
 .../ATLAS/0.7.0.2.5/kerberos.json               |     9 +-
 .../ATLAS/0.7.0.2.5/role_command_order.json     |     2 +-
 .../common-services/ATLAS/0.7.0.3.0/alerts.json |    39 +
 .../configuration/application-properties.xml    |   546 +
 .../ATLAS/0.7.0.3.0/configuration/atlas-env.xml |   194 +
 .../0.7.0.3.0/configuration/atlas-log4j.xml     |   170 +
 .../configuration/atlas-solrconfig.xml          |   641 +
 .../configuration/ranger-atlas-audit.xml        |   141 +
 .../ranger-atlas-plugin-properties.xml          |   132 +
 .../ranger-atlas-policymgr-ssl.xml              |    73 +
 .../configuration/ranger-atlas-security.xml     |    77 +
 .../ATLAS/0.7.0.3.0/kerberos.json               |   103 +
 .../ATLAS/0.7.0.3.0/metainfo.xml                |   190 +
 .../0.7.0.3.0/package/scripts/atlas_client.py   |    53 +
 .../ATLAS/0.7.0.3.0/package/scripts/metadata.py |   243 +
 .../package/scripts/metadata_server.py          |   183 +
 .../ATLAS/0.7.0.3.0/package/scripts/params.py   |   419 +
 .../0.7.0.3.0/package/scripts/service_check.py  |    55 +
 .../package/scripts/setup_ranger_atlas.py       |    70 +
 .../0.7.0.3.0/package/scripts/status_params.py  |    60 +
 .../package/templates/atlas_hbase_setup.rb.j2   |    42 +
 .../package/templates/atlas_jaas.conf.j2        |    26 +
 .../package/templates/atlas_kafka_acl.sh.j2     |    41 +
 .../templates/input.config-atlas.json.j2        |    48 +
 .../package/templates/kafka_jaas.conf.j2        |    41 +
 .../ATLAS/0.7.0.3.0/quicklinks/quicklinks.json  |    36 +
 .../ATLAS/0.7.0.3.0/role_command_order.json     |     7 +
 .../ATLAS/0.7.0.3.0/service_advisor.py          |   441 +
 .../ATLAS/0.7.0.3.0/themes/theme.json           |   619 +
 .../ATLAS/0.7.0.3.0/themes/theme_version_2.json |   845 +
 .../DRUID/0.9.2/configuration/druid-env.xml     |     2 +-
 .../0.9.2/configuration/druid-logrotate.xml     |     2 +-
 .../0.9.2/configuration/druid-middlemanager.xml |    18 +
 .../0.9.2/configuration/druid-superset-env.xml  |   118 -
 .../0.9.2/configuration/druid-superset.xml      |   178 -
 .../common-services/DRUID/0.9.2/metainfo.xml    |    21 -
 .../DRUID/0.9.2/package/scripts/druid.py        |    33 +-
 .../DRUID/0.9.2/package/scripts/druid_node.py   |     9 +-
 .../DRUID/0.9.2/package/scripts/params.py       |    57 +-
 .../0.9.2/package/scripts/status_params.py      |     2 -
 .../DRUID/0.9.2/package/scripts/superset.py     |   169 -
 .../DRUID/0.9.2/package/templates/superset.sh   |    95 -
 .../DRUID/0.9.2/quicklinks/quicklinks.json      |    13 -
 .../DRUID/0.9.2/role_command_order.json         |     3 +-
 .../DRUID/0.9.2/themes/theme.json               |    82 +-
 .../0.5.0.2.1/configuration/oozie-site.xml      |   208 -
 .../FALCON/0.5.0.2.1/kerberos.json              |    12 +-
 .../FALCON/0.5.0.2.1/package/scripts/falcon.py  |     4 +-
 .../0.5.0.2.1/package/scripts/falcon_client.py  |     8 +-
 .../0.5.0.2.1/package/scripts/falcon_server.py  |     7 +-
 .../0.5.0.2.1/package/scripts/params_linux.py   |    25 +-
 .../1.4.0.2.0/configuration/flume-log4j.xml     |    96 +
 .../FLUME/1.4.0.2.0/package/scripts/flume.py    |     4 +-
 .../1.4.0.2.0/package/scripts/flume_handler.py  |     8 +-
 .../FLUME/1.4.0.2.0/package/scripts/params.py   |    24 +-
 .../templates/flume-metrics2.properties.j2      |     2 +
 .../common-services/HAWQ/2.0.0/kerberos.json    |     9 +-
 .../0.96.0.2.0/configuration/hbase-env.xml      |    16 +-
 .../HBASE/0.96.0.2.0/kerberos.json              |     9 +-
 .../HBASE/0.96.0.2.0/package/scripts/hbase.py   |    12 +-
 .../0.96.0.2.0/package/scripts/hbase_client.py  |    18 +-
 .../0.96.0.2.0/package/scripts/hbase_master.py  |     5 +-
 .../package/scripts/hbase_regionserver.py       |     5 +-
 .../0.96.0.2.0/package/scripts/params_linux.py  |    29 +-
 .../package/scripts/phoenix_queryserver.py      |    11 +-
 .../HBASE/0.96.0.2.0/package/scripts/upgrade.py |     7 +-
 ...-metrics2-hbase.properties-GANGLIA-MASTER.j2 |     2 +
 ...doop-metrics2-hbase.properties-GANGLIA-RS.j2 |     3 +-
 .../package/templates/hbase_master_jaas.conf.j2 |    10 +
 .../templates/hbase_regionserver_jaas.conf.j2   |    10 +
 .../HBASE/0.96.0.2.0/role_command_order.json    |     3 +-
 .../HBASE/2.0.0.3.0/configuration/hbase-env.xml |     6 +-
 .../HBASE/2.0.0.3.0/kerberos.json               |    15 +-
 .../2.0.0.3.0/package/scripts/hbase_client.py   |    16 +-
 .../2.0.0.3.0/package/scripts/hbase_master.py   |     5 +-
 .../package/scripts/hbase_regionserver.py       |     5 +-
 .../2.0.0.3.0/package/scripts/params_linux.py   |     4 +-
 .../package/scripts/phoenix_queryserver.py      |     8 +-
 .../HBASE/2.0.0.3.0/package/scripts/upgrade.py  |     7 +-
 .../package/templates/hbase_master_jaas.conf.j2 |    10 +
 .../templates/hbase_regionserver_jaas.conf.j2   |    10 +
 .../HBASE/2.0.0.3.0/role_command_order.json     |     2 +-
 .../HBASE/2.0.0.3.0/service_advisor.py          |   675 +
 .../HDFS/2.1.0.2.0/configuration/hdfs-site.xml  |     6 +
 .../HDFS/2.1.0.2.0/kerberos.json                |    18 +-
 .../common-services/HDFS/2.1.0.2.0/metainfo.xml |    10 +-
 .../package/alerts/alert_metrics_deviation.py   |    10 +-
 .../HDFS/2.1.0.2.0/package/scripts/datanode.py  |    11 +-
 .../HDFS/2.1.0.2.0/package/scripts/hdfs.py      |    25 +
 .../2.1.0.2.0/package/scripts/hdfs_client.py    |     8 +-
 .../2.1.0.2.0/package/scripts/hdfs_datanode.py  |     2 +-
 .../2.1.0.2.0/package/scripts/hdfs_namenode.py  |    39 +-
 .../2.1.0.2.0/package/scripts/hdfs_snamenode.py |     6 +
 .../2.1.0.2.0/package/scripts/journalnode.py    |     8 +-
 .../HDFS/2.1.0.2.0/package/scripts/namenode.py  |    20 +-
 .../package/scripts/namenode_upgrade.py         |     2 +-
 .../2.1.0.2.0/package/scripts/nfsgateway.py     |     8 +-
 .../HDFS/2.1.0.2.0/package/scripts/params.py    |     2 +-
 .../2.1.0.2.0/package/scripts/params_linux.py   |    20 +-
 .../2.1.0.2.0/package/scripts/params_windows.py |     7 +
 .../HDFS/2.1.0.2.0/package/scripts/snamenode.py |     8 +-
 .../HDFS/2.1.0.2.0/package/scripts/utils.py     |    22 +-
 .../2.1.0.2.0/package/scripts/zkfc_slave.py     |    20 +-
 .../package/templates/hdfs_dn_jaas.conf.j2      |    27 +
 .../package/templates/hdfs_jn_jaas.conf.j2      |    27 +
 .../package/templates/hdfs_nn_jaas.conf.j2      |    27 +
 .../package/templates/include_hosts_list.j2     |    21 +
 .../package/templates/input.config-hdfs.json.j2 |   216 -
 .../common-services/HDFS/2.1.0.2.0/widgets.json |     4 +-
 .../HDFS/3.0.0.3.0/configuration/hadoop-env.xml |   200 +-
 .../hadoop-metrics2.properties.xml              |     2 +
 .../HDFS/3.0.0.3.0/configuration/hdfs-log4j.xml |   382 +-
 .../HDFS/3.0.0.3.0/kerberos.json                |    21 +-
 .../common-services/HDFS/3.0.0.3.0/metainfo.xml |    14 +-
 .../HDFS/3.0.0.3.0/package/scripts/datanode.py  |    11 +-
 .../HDFS/3.0.0.3.0/package/scripts/hdfs.py      |    25 +
 .../3.0.0.3.0/package/scripts/hdfs_client.py    |     8 +-
 .../3.0.0.3.0/package/scripts/hdfs_namenode.py  |    27 +-
 .../3.0.0.3.0/package/scripts/hdfs_snamenode.py |     6 +
 .../3.0.0.3.0/package/scripts/journalnode.py    |     8 +-
 .../HDFS/3.0.0.3.0/package/scripts/namenode.py  |    13 +-
 .../3.0.0.3.0/package/scripts/nfsgateway.py     |     7 +-
 .../3.0.0.3.0/package/scripts/params_linux.py   |    15 +-
 .../3.0.0.3.0/package/scripts/params_windows.py |     7 +
 .../HDFS/3.0.0.3.0/package/scripts/snamenode.py |     8 +-
 .../HDFS/3.0.0.3.0/package/scripts/utils.py     |    18 +-
 .../3.0.0.3.0/package/scripts/zkfc_slave.py     |    12 +-
 .../package/templates/hdfs_dn_jaas.conf.j2      |    27 +
 .../package/templates/hdfs_jn_jaas.conf.j2      |    27 +
 .../package/templates/hdfs_nn_jaas.conf.j2      |    27 +
 .../package/templates/include_hosts_list.j2     |    21 +
 .../HDFS/3.0.0.3.0/service_advisor.py           |    53 +
 .../HIVE/0.12.0.2.0/configuration/hive-env.xml  |     3 +-
 .../HIVE/0.12.0.2.0/configuration/hive-site.xml |   220 +-
 .../HIVE/0.12.0.2.0/kerberos.json               |    15 +-
 .../HIVE/0.12.0.2.0/metainfo.xml                |    21 +-
 .../package/alerts/alert_hive_metastore.py      |    11 +-
 .../package/alerts/alert_llap_app_status.py     |    16 +-
 .../0.12.0.2.0/package/scripts/hcat_client.py   |     8 +-
 .../HIVE/0.12.0.2.0/package/scripts/hive.py     |    13 +-
 .../0.12.0.2.0/package/scripts/hive_client.py   |     9 +-
 .../package/scripts/hive_metastore.py           |    19 +-
 .../0.12.0.2.0/package/scripts/hive_server.py   |     7 +-
 .../package/scripts/hive_server_interactive.py  |    13 +-
 .../package/scripts/hive_server_upgrade.py      |    16 +-
 .../0.12.0.2.0/package/scripts/hive_service.py  |     6 +-
 .../0.12.0.2.0/package/scripts/params_linux.py  |    65 +-
 .../0.12.0.2.0/package/scripts/service_check.py |     3 +-
 .../package/scripts/webhcat_server.py           |    10 +-
 .../hadoop-metrics2-hivemetastore.properties.j2 |     2 +
 .../hadoop-metrics2-hiveserver2.properties.j2   |     2 +
 .../templates/hadoop-metrics2-llapdaemon.j2     |     4 +-
 .../hadoop-metrics2-llaptaskscheduler.j2        |     4 +-
 .../HIVE/2.1.0.3.0/configuration/hcat-env.xml   |    48 +-
 .../HIVE/2.1.0.3.0/configuration/hive-env.xml   |    79 +-
 .../configuration/hive-interactive-env.xml      |    63 +-
 .../2.1.0.3.0/configuration/parquet-logging.xml |   106 +
 .../configuration/ranger-hive-security.xml      |     9 +
 .../HIVE/2.1.0.3.0/kerberos.json                |    30 +-
 .../common-services/HIVE/2.1.0.3.0/metainfo.xml |     7 +
 .../package/alerts/alert_llap_app_status.py     |     4 +-
 .../2.1.0.3.0/package/scripts/hcat_client.py    |     9 +-
 .../HIVE/2.1.0.3.0/package/scripts/hive.py      |    40 +-
 .../2.1.0.3.0/package/scripts/hive_client.py    |     9 +-
 .../2.1.0.3.0/package/scripts/hive_metastore.py |    19 +-
 .../2.1.0.3.0/package/scripts/hive_server.py    |     7 +-
 .../package/scripts/hive_server_interactive.py  |    10 +-
 .../package/scripts/hive_server_upgrade.py      |    17 +-
 .../2.1.0.3.0/package/scripts/hive_service.py   |     2 +-
 .../2.1.0.3.0/package/scripts/params_linux.py   |    43 +-
 .../2.1.0.3.0/package/scripts/webhcat_server.py |     9 +-
 .../hadoop-metrics2-hivemetastore.properties.j2 |     2 +
 .../hadoop-metrics2-hiveserver2.properties.j2   |     2 +
 .../templates/hadoop-metrics2-llapdaemon.j2     |     4 +-
 .../hadoop-metrics2-llaptaskscheduler.j2        |     4 +-
 .../HIVE/2.1.0.3.0/service_advisor.py           |    26 +
 .../KAFKA/0.10.0.3.0/alerts.json                |    32 +
 .../0.10.0.3.0/configuration/kafka-broker.xml   |   559 +
 .../0.10.0.3.0/configuration/kafka-env.xml      |   111 +
 .../0.10.0.3.0/configuration/kafka-log4j.xml    |   170 +
 .../configuration/kafka_client_jaas_conf.xml    |    41 +
 .../configuration/kafka_jaas_conf.xml           |    59 +
 .../configuration/ranger-kafka-audit.xml        |   130 +
 .../ranger-kafka-plugin-properties.xml          |   154 +
 .../ranger-kafka-policymgr-ssl.xml              |    66 +
 .../configuration/ranger-kafka-security.xml     |    64 +
 .../KAFKA/0.10.0.3.0/kerberos.json              |    82 +
 .../KAFKA/0.10.0.3.0/metainfo.xml               |   111 +
 .../KAFKA/0.10.0.3.0/metrics.json               |   239 +
 .../KAFKA/0.10.0.3.0/package/scripts/kafka.py   |   257 +
 .../0.10.0.3.0/package/scripts/kafka_broker.py  |   145 +
 .../KAFKA/0.10.0.3.0/package/scripts/params.py  |   341 +
 .../0.10.0.3.0/package/scripts/service_check.py |    70 +
 .../package/scripts/setup_ranger_kafka.py       |    90 +
 .../0.10.0.3.0/package/scripts/status_params.py |    26 +
 .../KAFKA/0.10.0.3.0/package/scripts/upgrade.py |    75 +
 .../KAFKA/0.10.0.3.0/package/scripts/utils.py   |    38 +
 .../templates/input.config-kafka.json.j2        |    92 +
 .../0.10.0.3.0/package/templates/kafka.conf.j2  |    35 +
 .../package/templates/kafka_client_jaas.conf.j2 |    29 +
 .../package/templates/kafka_jaas.conf.j2        |    41 +
 .../package/templates/tools-log4j.properties.j2 |    21 +
 .../KAFKA/0.10.0.3.0/role_command_order.json    |     7 +
 .../KAFKA/0.10.0.3.0/service_advisor.py         |   368 +
 .../KAFKA/0.10.0.3.0/widgets.json               |   182 +
 .../common-services/KAFKA/0.10.0/kerberos.json  |    12 +-
 .../common-services/KAFKA/0.10.0/metainfo.xml   |     1 +
 .../KAFKA/0.8.1/configuration/kafka-broker.xml  |    11 +
 .../KAFKA/0.8.1/configuration/kafka-env.xml     |     4 +
 .../0.8.1/configuration/kafka_jaas_conf.xml     |    11 +
 .../common-services/KAFKA/0.8.1/metainfo.xml    |     1 +
 .../KAFKA/0.8.1/package/scripts/kafka.py        |    41 +-
 .../KAFKA/0.8.1/package/scripts/kafka_broker.py |    25 +-
 .../KAFKA/0.8.1/package/scripts/params.py       |    29 +-
 .../0.8.1/package/scripts/service_check.py      |    15 +-
 .../KAFKA/0.8.1/package/scripts/upgrade.py      |     7 +-
 .../0.8.1/package/templates/kafka_jaas.conf.j2  |    11 +
 .../KAFKA/0.9.0/configuration/kafka-broker.xml  |     4 +-
 .../ranger-kafka-plugin-properties.xml          |     6 +
 .../common-services/KAFKA/0.9.0/kerberos.json   |     9 +-
 .../1.10.3-10/configuration/kerberos-env.xml    |    27 +
 .../KERBEROS/1.10.3-10/kerberos.json            |     3 +-
 .../KERBEROS/1.10.3-10/metainfo.xml             |     8 +
 .../package/scripts/kerberos_client.py          |     3 +
 .../package/scripts/kerberos_common.py          |    50 +-
 .../KERBEROS/1.10.3-10/properties/krb5_conf.j2  |    60 -
 .../1.10.3-30/configuration/kerberos-env.xml    |   423 +
 .../1.10.3-30/configuration/krb5-conf.xml       |    74 +
 .../KERBEROS/1.10.3-30/kerberos.json            |    18 +
 .../KERBEROS/1.10.3-30/metainfo.xml             |   131 +
 .../package/scripts/kerberos_client.py          |    56 +
 .../package/scripts/kerberos_common.py          |   494 +
 .../1.10.3-30/package/scripts/params.py         |   205 +
 .../1.10.3-30/package/scripts/service_check.py  |    85 +
 .../1.10.3-30/package/scripts/status_params.py  |    34 +
 .../KERBEROS/1.10.3-30/package/scripts/utils.py |   105 +
 .../KERBEROS/1.10.3-30/properties/krb5_conf.j2  |    60 +
 .../0.5.0.2.2/configuration/gateway-site.xml    |     2 +-
 .../0.5.0.2.2/package/scripts/knox_gateway.py   |     9 +-
 .../0.5.0.2.2/package/scripts/params_linux.py   |   117 +-
 .../package/templates/krb5JAASLogin.conf.j2     |     9 +-
 .../common-services/KNOX/0.5.0.3.0/alerts.json  |    32 +
 .../0.5.0.3.0/configuration/admin-topology.xml  |    97 +
 .../0.5.0.3.0/configuration/gateway-log4j.xml   |   110 +
 .../0.5.0.3.0/configuration/gateway-site.xml    |    71 +
 .../KNOX/0.5.0.3.0/configuration/knox-env.xml   |    83 +
 .../configuration/knoxsso-topology.xml          |   126 +
 .../KNOX/0.5.0.3.0/configuration/ldap-log4j.xml |    93 +
 .../configuration/ranger-knox-audit.xml         |   132 +
 .../ranger-knox-plugin-properties.xml           |   132 +
 .../configuration/ranger-knox-policymgr-ssl.xml |    66 +
 .../configuration/ranger-knox-security.xml      |    64 +
 .../KNOX/0.5.0.3.0/configuration/topology.xml   |   174 +
 .../KNOX/0.5.0.3.0/configuration/users-ldif.xml |   140 +
 .../KNOX/0.5.0.3.0/kerberos.json                |    82 +
 .../common-services/KNOX/0.5.0.3.0/metainfo.xml |   109 +
 .../package/files/validateKnoxStatus.py         |    43 +
 .../KNOX/0.5.0.3.0/package/scripts/knox.py      |   192 +
 .../0.5.0.3.0/package/scripts/knox_gateway.py   |   215 +
 .../KNOX/0.5.0.3.0/package/scripts/knox_ldap.py |    59 +
 .../KNOX/0.5.0.3.0/package/scripts/params.py    |    29 +
 .../0.5.0.3.0/package/scripts/params_linux.py   |   566 +
 .../0.5.0.3.0/package/scripts/params_windows.py |    71 +
 .../0.5.0.3.0/package/scripts/service_check.py  |    96 +
 .../package/scripts/setup_ranger_knox.py        |   121 +
 .../0.5.0.3.0/package/scripts/status_params.py  |    59 +
 .../KNOX/0.5.0.3.0/package/scripts/upgrade.py   |   118 +
 .../package/templates/input.config-knox.json.j2 |    60 +
 .../package/templates/krb5JAASLogin.conf.j2     |    27 +
 .../KNOX/0.5.0.3.0/role_command_order.json      |     7 +
 .../KNOX/0.5.0.3.0/service_advisor.py           |   253 +
 .../common-services/LOGSEARCH/0.5.0/alerts.json |     6 +-
 .../configuration/logfeeder-properties.xml      |    10 +
 .../0.5.0/configuration/logsearch-env.xml       |    14 -
 .../configuration/logsearch-properties.xml      |    31 +-
 .../LOGSEARCH/0.5.0/kerberos.json               |     6 +-
 .../LOGSEARCH/0.5.0/metainfo.xml                |    24 -
 .../scripts/logsearch_config_aggregator.py      |    77 -
 .../LOGSEARCH/0.5.0/package/scripts/params.py   |    21 +-
 .../package/templates/global.config.json.j2     |     3 +-
 .../package/templates/input.config-nifi.json.j2 |    79 -
 .../properties/audit_logs-solrconfig.xml.j2     |     3 +-
 .../logfeeder-default_grok_patterns.j2          |     2 +-
 .../0.5.0/properties/logfeeder-log4j.xml.j2     |     2 +-
 .../0.5.0/properties/logsearch-env.sh.j2        |     2 -
 .../0.5.0/properties/logsearch-log4j.xml.j2     |     2 +-
 .../0.5.0/properties/output.config.json.j2      |     8 +-
 .../properties/service_logs-solrconfig.xml.j2   |     3 +-
 .../LOGSEARCH/0.5.0/quicklinks/quicklinks.json  |    10 +-
 .../LOGSEARCH/0.5.0/service_advisor.py          |   190 +
 .../LOGSEARCH/0.5.0/themes/theme.json           |     4 +-
 .../MAHOUT/1.0.0.2.3/kerberos.json              |     6 +-
 .../1.0.0.2.3/package/scripts/mahout_client.py  |     9 +-
 .../OOZIE/4.0.0.2.0/kerberos.json               |    12 +-
 .../package/alerts/alert_check_oozie_server.py  |     8 +-
 .../OOZIE/4.0.0.2.0/package/scripts/oozie.py    |    65 +-
 .../4.0.0.2.0/package/scripts/oozie_client.py   |     8 +-
 .../4.0.0.2.0/package/scripts/oozie_server.py   |    13 +-
 .../package/scripts/oozie_server_upgrade.py     |    36 +-
 .../4.0.0.2.0/package/scripts/params_linux.py   |    22 +-
 .../OOZIE/4.2.0.2.3/kerberos.json               |    12 +-
 .../OOZIE/4.2.0.2.3/quicklinks/quicklinks.json  |     9 +-
 .../common-services/OOZIE/4.2.0.3.0/alerts.json |    45 +
 .../OOZIE/4.2.0.3.0/configuration/oozie-env.xml |   255 +
 .../4.2.0.3.0/configuration/oozie-log4j.xml     |   149 +
 .../4.2.0.3.0/configuration/oozie-site.xml      |   254 +
 .../OOZIE/4.2.0.3.0/kerberos.json               |    74 +
 .../OOZIE/4.2.0.3.0/metainfo.xml                |   203 +
 .../package/alerts/alert_check_oozie_server.py  |   244 +
 .../4.2.0.3.0/package/files/oozieSmoke2.sh      |    84 +
 .../files/prepareOozieHdfsDirectories.sh        |    42 +
 .../4.2.0.3.0/package/files/wrap_ooziedb.sh     |    31 +
 .../scripts/check_oozie_server_status.py        |    38 +
 .../OOZIE/4.2.0.3.0/package/scripts/oozie.py    |   511 +
 .../4.2.0.3.0/package/scripts/oozie_client.py   |    74 +
 .../4.2.0.3.0/package/scripts/oozie_server.py   |   155 +
 .../package/scripts/oozie_server_upgrade.py     |   237 +
 .../4.2.0.3.0/package/scripts/oozie_service.py  |   188 +
 .../OOZIE/4.2.0.3.0/package/scripts/params.py   |    39 +
 .../4.2.0.3.0/package/scripts/params_linux.py   |   374 +
 .../4.2.0.3.0/package/scripts/params_windows.py |    34 +
 .../4.2.0.3.0/package/scripts/service_check.py  |   140 +
 .../4.2.0.3.0/package/scripts/status_params.py  |    65 +
 .../package/templates/adminusers.txt.j2         |    28 +
 .../templates/input.config-oozie.json.j2        |    48 +
 .../package/templates/oozie-log4j.properties.j2 |    93 +
 .../4.2.0.3.0/package/templates/oozie.conf.j2   |    35 +
 .../package/templates/zkmigrator_jaas.conf.j2   |    26 +
 .../OOZIE/4.2.0.3.0/quicklinks/quicklinks.json  |    46 +
 .../OOZIE/4.2.0.3.0/role_command_order.json     |     9 +
 .../OOZIE/4.2.0.3.0/service_advisor.py          |   314 +
 .../OOZIE/4.2.0.3.0/themes/theme.json           |   116 +
 .../PIG/0.12.0.2.0/kerberos.json                |     3 +-
 .../0.12.0.2.0/package/scripts/pig_client.py    |     9 +-
 .../PIG/0.16.1.3.0/configuration/pig-env.xml    |    41 -
 .../PIG/0.16.1.3.0/kerberos.json                |     3 +-
 .../0.16.1.3.0/package/scripts/pig_client.py    |     9 +-
 .../PXF/3.0.0/configuration/pxf-profiles.xml    |    22 +
 .../RANGER/0.4.0/package/scripts/params.py      |    44 +-
 .../0.4.0/package/scripts/ranger_admin.py       |    24 +-
 .../0.4.0/package/scripts/ranger_tagsync.py     |    13 +-
 .../0.4.0/package/scripts/ranger_usersync.py    |     7 +-
 .../0.4.0/package/scripts/setup_ranger_xml.py   |   156 +-
 .../RANGER/0.4.0/package/scripts/upgrade.py     |    31 -
 .../0.5.0/configuration/ranger-ugsync-site.xml  |     3 +
 .../RANGER/0.5.0/role_command_order.json        |     2 +-
 .../RANGER/0.6.0/configuration/admin-log4j.xml  |     1 -
 .../0.6.0/configuration/tagsync-log4j.xml       |     3 +-
 .../0.6.0/configuration/usersync-log4j.xml      |     3 +-
 .../common-services/RANGER/0.6.0/kerberos.json  |    18 +-
 .../RANGER/0.7.0/configuration/ranger-env.xml   |    45 +
 .../0.7.0/configuration/ranger-ugsync-site.xml  |     7 +
 .../0.7.0/properties/ranger-solrconfig.xml.j2   |     9 +-
 .../RANGER/0.7.0/themes/theme_version_5.json    |    66 +
 .../RANGER/1.0.0.3.0/alerts.json                |    76 +
 .../1.0.0.3.0/configuration/admin-log4j.xml     |   131 +
 .../configuration/admin-properties.xml          |   161 +
 .../configuration/atlas-tagsync-ssl.xml         |    72 +
 .../configuration/ranger-admin-site.xml         |   751 +
 .../1.0.0.3.0/configuration/ranger-env.xml      |   526 +
 .../configuration/ranger-solr-configuration.xml |    59 +
 .../ranger-tagsync-policymgr-ssl.xml            |    72 +
 .../configuration/ranger-tagsync-site.xml       |   201 +
 .../configuration/ranger-ugsync-site.xml        |   578 +
 .../tagsync-application-properties.xml          |    62 +
 .../1.0.0.3.0/configuration/tagsync-log4j.xml   |    89 +
 .../1.0.0.3.0/configuration/usersync-log4j.xml  |    88 +
 .../RANGER/1.0.0.3.0/kerberos.json              |   159 +
 .../RANGER/1.0.0.3.0/metainfo.xml               |   177 +
 .../alerts/alert_ranger_admin_passwd_check.py   |   195 +
 .../RANGER/1.0.0.3.0/package/scripts/params.py  |   450 +
 .../1.0.0.3.0/package/scripts/ranger_admin.py   |   205 +
 .../1.0.0.3.0/package/scripts/ranger_service.py |    69 +
 .../1.0.0.3.0/package/scripts/ranger_tagsync.py |   132 +
 .../package/scripts/ranger_usersync.py          |   117 +
 .../1.0.0.3.0/package/scripts/service_check.py  |    49 +
 .../package/scripts/setup_ranger_xml.py         |   853 +
 .../1.0.0.3.0/package/scripts/status_params.py  |    39 +
 .../RANGER/1.0.0.3.0/package/scripts/upgrade.py |    29 +
 .../templates/input.config-ranger.json.j2       |    79 +
 .../package/templates/ranger_admin_pam.j2       |    22 +
 .../package/templates/ranger_remote_pam.j2      |    22 +
 .../package/templates/ranger_solr_jaas_conf.j2  |    26 +
 .../properties/ranger-solrconfig.xml.j2         |  1874 +
 .../RANGER/1.0.0.3.0/quicklinks/quicklinks.json |    41 +
 .../RANGER/1.0.0.3.0/role_command_order.json    |     9 +
 .../RANGER/1.0.0.3.0/service_advisor.py         |   774 +
 .../1.0.0.3.0/themes/theme_version_1.json       |  1861 +
 .../0.5.0.2.3/configuration/kms-log4j.xml       |     6 +-
 .../RANGER_KMS/0.5.0.2.3/kerberos.json          |    12 +-
 .../RANGER_KMS/0.5.0.2.3/metainfo.xml           |     9 +
 .../RANGER_KMS/0.5.0.2.3/package/scripts/kms.py |    28 +
 .../0.5.0.2.3/package/scripts/kms_server.py     |    16 +-
 .../0.5.0.2.3/package/scripts/params.py         |    40 +-
 .../0.5.0.2.3/package/scripts/upgrade.py        |    30 -
 .../0.5.0.2.3/role_command_order.json           |     2 +-
 .../RANGER_KMS/1.0.0.3.0/alerts.json            |    32 +
 .../1.0.0.3.0/configuration/dbks-site.xml       |   206 +
 .../1.0.0.3.0/configuration/kms-env.xml         |   115 +
 .../1.0.0.3.0/configuration/kms-log4j.xml       |   118 +
 .../1.0.0.3.0/configuration/kms-properties.xml  |   166 +
 .../1.0.0.3.0/configuration/kms-site.xml        |   133 +
 .../configuration/ranger-kms-audit.xml          |   118 +
 .../configuration/ranger-kms-policymgr-ssl.xml  |    68 +
 .../configuration/ranger-kms-security.xml       |    64 +
 .../1.0.0.3.0/configuration/ranger-kms-site.xml |   110 +
 .../RANGER_KMS/1.0.0.3.0/kerberos.json          |    81 +
 .../RANGER_KMS/1.0.0.3.0/metainfo.xml           |   111 +
 .../RANGER_KMS/1.0.0.3.0/package/scripts/kms.py |   675 +
 .../1.0.0.3.0/package/scripts/kms_server.py     |   114 +
 .../1.0.0.3.0/package/scripts/kms_service.py    |    58 +
 .../1.0.0.3.0/package/scripts/params.py         |   334 +
 .../1.0.0.3.0/package/scripts/service_check.py  |    41 +
 .../1.0.0.3.0/package/scripts/status_params.py  |    36 +
 .../1.0.0.3.0/package/scripts/upgrade.py        |    29 +
 .../templates/input.config-ranger-kms.json.j2   |    48 +
 .../1.0.0.3.0/role_command_order.json           |     7 +
 .../RANGER_KMS/1.0.0.3.0/service_advisor.py     |   358 +
 .../1.0.0.3.0/themes/theme_version_1.json       |   409 +
 .../SLIDER/0.60.0.2.2/kerberos.json             |     3 +-
 .../0.60.0.2.2/package/scripts/slider_client.py |    14 +-
 .../SLIDER/0.91.0.3.0/kerberos.json             |     3 +-
 .../0.91.0.3.0/package/scripts/slider_client.py |    14 +-
 .../common-services/SPARK/1.2.1/alerts.json     |    48 +
 .../common-services/SPARK/1.2.1/kerberos.json   |     6 +-
 .../scripts/alerts/alert_spark_livy_port.py     |   148 +
 .../scripts/alerts/alert_spark_thrift_port.py   |   154 +
 .../1.2.1/package/scripts/job_history_server.py |     8 +-
 .../SPARK/1.2.1/package/scripts/livy_server.py  |     8 +-
 .../SPARK/1.2.1/package/scripts/params.py       |    18 +-
 .../1.2.1/package/scripts/service_check.py      |     5 +-
 .../SPARK/1.2.1/package/scripts/setup_spark.py  |     6 +-
 .../SPARK/1.2.1/package/scripts/spark_client.py |     9 +-
 .../1.2.1/package/scripts/spark_service.py      |     6 +-
 .../package/scripts/spark_thrift_server.py      |     8 +-
 .../SPARK/1.2.1/quicklinks/quicklinks.json      |     1 +
 .../common-services/SPARK/1.4.1/kerberos.json   |    12 +-
 .../common-services/SPARK/2.2.0/kerberos.json   |     3 +-
 .../2.2.0/package/scripts/job_history_server.py |   103 +
 .../SPARK/2.2.0/package/scripts/livy_server.py  |   146 +
 .../SPARK/2.2.0/package/scripts/livy_service.py |    48 +
 .../SPARK/2.2.0/package/scripts/params.py       |   268 +
 .../2.2.0/package/scripts/service_check.py      |    62 +
 .../SPARK/2.2.0/package/scripts/setup_livy.py   |    88 +
 .../SPARK/2.2.0/package/scripts/setup_spark.py  |   116 +
 .../SPARK/2.2.0/package/scripts/spark_client.py |    57 +
 .../2.2.0/package/scripts/spark_service.py      |   146 +
 .../package/scripts/spark_thrift_server.py      |    86 +
 .../2.2.0/package/scripts/status_params.py      |    45 +
 .../SPARK/2.2.0/scripts/job_history_server.py   |   108 -
 .../SPARK/2.2.0/scripts/livy_server.py          |   151 -
 .../SPARK/2.2.0/scripts/livy_service.py         |    48 -
 .../SPARK/2.2.0/scripts/params.py               |   268 -
 .../SPARK/2.2.0/scripts/service_check.py        |    62 -
 .../SPARK/2.2.0/scripts/setup_livy.py           |    88 -
 .../SPARK/2.2.0/scripts/setup_spark.py          |   116 -
 .../SPARK/2.2.0/scripts/spark_client.py         |    62 -
 .../SPARK/2.2.0/scripts/spark_service.py        |   146 -
 .../SPARK/2.2.0/scripts/spark_thrift_server.py  |    91 -
 .../SPARK/2.2.0/scripts/status_params.py        |    45 -
 .../SPARK/2.2.0/service_advisor.py              |    48 +-
 .../common-services/SPARK2/2.0.0/alerts.json    |    48 +
 .../common-services/SPARK2/2.0.0/kerberos.json  |    12 +-
 .../scripts/alerts/alert_spark2_livy_port.py    |   148 +
 .../scripts/alerts/alert_spark2_thrift_port.py  |   155 +
 .../2.0.0/package/scripts/job_history_server.py |     8 +-
 .../2.0.0/package/scripts/livy2_server.py       |    10 +-
 .../SPARK2/2.0.0/package/scripts/params.py      |     6 +-
 .../2.0.0/package/scripts/service_check.py      |     5 +-
 .../2.0.0/package/scripts/spark_client.py       |     8 +-
 .../package/scripts/spark_thrift_server.py      |     8 +-
 .../SPARK2/2.0.0/quicklinks/quicklinks.json     |     1 +
 .../1.4.4.2.0/package/scripts/params_linux.py   |     2 +
 .../1.4.4.2.0/package/scripts/service_check.py  |     3 -
 .../1.4.4.2.0/package/scripts/sqoop_client.py   |     9 +-
 .../sqoop-atlas-application.properties.xml      |    47 +
 .../SQOOP/1.4.4.3.0/configuration/sqoop-env.xml |    87 +
 .../1.4.4.3.0/configuration/sqoop-site.xml      |    38 +
 .../SQOOP/1.4.4.3.0/kerberos.json               |    20 +
 .../SQOOP/1.4.4.3.0/metainfo.xml                |   115 +
 .../SQOOP/1.4.4.3.0/package/scripts/__init__.py |    19 +
 .../SQOOP/1.4.4.3.0/package/scripts/params.py   |    27 +
 .../1.4.4.3.0/package/scripts/params_linux.py   |   137 +
 .../1.4.4.3.0/package/scripts/params_windows.py |    30 +
 .../1.4.4.3.0/package/scripts/service_check.py  |    59 +
 .../SQOOP/1.4.4.3.0/package/scripts/sqoop.py    |   124 +
 .../1.4.4.3.0/package/scripts/sqoop_client.py   |    61 +
 .../SQOOP/1.4.4.3.0/role_command_order.json     |     6 +
 .../SQOOP/1.4.4.3.0/service_advisor.py          |   197 +
 .../STORM/0.9.1/configuration/storm-env.xml     |    11 +
 .../common-services/STORM/0.9.1/kerberos.json   |     9 +-
 .../common-services/STORM/0.9.1/metainfo.xml    |     2 -
 .../STORM/0.9.1/package/scripts/drpc_server.py  |     7 +-
 .../STORM/0.9.1/package/scripts/nimbus.py       |    17 +-
 .../STORM/0.9.1/package/scripts/nimbus_prod.py  |     8 +-
 .../STORM/0.9.1/package/scripts/pacemaker.py    |     7 +-
 .../STORM/0.9.1/package/scripts/params_linux.py |    16 +-
 .../STORM/0.9.1/package/scripts/rest_api.py     |     3 -
 .../0.9.1/package/scripts/storm_yaml_utils.py   |     5 +-
 .../STORM/0.9.1/package/scripts/supervisor.py   |     8 +-
 .../0.9.1/package/scripts/supervisor_prod.py    |     8 +-
 .../STORM/0.9.1/package/scripts/ui_server.py    |     7 +-
 .../0.9.1/package/templates/config.yaml.j2      |     2 +
 .../templates/storm-metrics2.properties.j2      |     2 +
 .../0.9.1/package/templates/storm_jaas.conf.j2  |    18 +
 .../common-services/STORM/1.0.1.3.0/alerts.json |   145 +
 .../configuration/ranger-storm-audit.xml        |   133 +
 .../ranger-storm-plugin-properties.xml          |   121 +
 .../ranger-storm-policymgr-ssl.xml              |    70 +
 .../configuration/ranger-storm-security.xml     |    67 +
 .../storm-atlas-application.properties.xml      |    31 +
 .../configuration/storm-cluster-log4j.xml       |   133 +
 .../STORM/1.0.1.3.0/configuration/storm-env.xml |   165 +
 .../1.0.1.3.0/configuration/storm-site.xml      |  1002 +
 .../configuration/storm-worker-log4j.xml        |   189 +
 .../STORM/1.0.1.3.0/kerberos.json               |   139 +
 .../STORM/1.0.1.3.0/metainfo.xml                |   177 +
 .../STORM/1.0.1.3.0/metrics.json                |  1202 +
 .../alerts/check_supervisor_process_win.py      |    50 +
 .../STORM/1.0.1.3.0/package/files/wordCount.jar |   Bin 0 -> 690588 bytes
 .../1.0.1.3.0/package/scripts/drpc_server.py    |    86 +
 .../STORM/1.0.1.3.0/package/scripts/nimbus.py   |   110 +
 .../1.0.1.3.0/package/scripts/nimbus_prod.py    |    75 +
 .../1.0.1.3.0/package/scripts/pacemaker.py      |    85 +
 .../STORM/1.0.1.3.0/package/scripts/params.py   |    28 +
 .../1.0.1.3.0/package/scripts/params_linux.py   |   422 +
 .../1.0.1.3.0/package/scripts/params_windows.py |    60 +
 .../STORM/1.0.1.3.0/package/scripts/rest_api.py |    82 +
 .../STORM/1.0.1.3.0/package/scripts/service.py  |    95 +
 .../1.0.1.3.0/package/scripts/service_check.py  |    79 +
 .../package/scripts/setup_ranger_storm.py       |   133 +
 .../1.0.1.3.0/package/scripts/status_params.py  |    83 +
 .../STORM/1.0.1.3.0/package/scripts/storm.py    |   182 +
 .../1.0.1.3.0/package/scripts/storm_upgrade.py  |   177 +
 .../package/scripts/storm_yaml_utils.py         |    53 +
 .../1.0.1.3.0/package/scripts/supervisor.py     |   111 +
 .../package/scripts/supervisor_prod.py          |    78 +
 .../package/scripts/supervisord_service.py      |    33 +
 .../1.0.1.3.0/package/scripts/ui_server.py      |   132 +
 .../package/templates/client_jaas.conf.j2       |    33 +
 .../1.0.1.3.0/package/templates/config.yaml.j2  |    72 +
 .../templates/input.config-storm.json.j2        |    78 +
 .../templates/storm-metrics2.properties.j2      |    32 +
 .../1.0.1.3.0/package/templates/storm.conf.j2   |    35 +
 .../package/templates/storm_jaas.conf.j2        |    65 +
 .../package/templates/worker-launcher.cfg.j2    |    19 +
 .../STORM/1.0.1.3.0/quicklinks/quicklinks.json  |    45 +
 .../STORM/1.0.1.3.0/role_command_order.json     |    13 +
 .../STORM/1.0.1.3.0/service_advisor.py          |   387 +
 .../STORM/1.0.1.3.0/widgets.json                |   127 +
 .../common-services/STORM/1.0.1/kerberos.json   |    15 +-
 .../common-services/STORM/1.0.1/metainfo.xml    |     2 -
 .../STORM/1.1.0/configuration/storm-site.xml    |    48 +
 .../common-services/STORM/1.1.0/kerberos.json   |   139 +
 .../common-services/STORM/1.1.0/metainfo.xml    |    42 +
 .../0.15.0/configuration/superset-env.xml       |   130 +
 .../SUPERSET/0.15.0/configuration/superset.xml  |   178 +
 .../SUPERSET/0.15.0/metainfo.xml                |    88 +
 .../SUPERSET/0.15.0/package/scripts/params.py   |    89 +
 .../0.15.0/package/scripts/service_check.py     |    37 +
 .../0.15.0/package/scripts/status_params.py     |    25 +
 .../SUPERSET/0.15.0/package/scripts/superset.py |   167 +
 .../0.15.0/package/templates/superset.sh        |    95 +
 .../SUPERSET/0.15.0/quicklinks/quicklinks.json  |    24 +
 .../SUPERSET/0.15.0/role_command_order.json     |     7 +
 .../SUPERSET/0.15.0/themes/theme.json           |   120 +
 .../common-services/TEZ/0.4.0.2.1/kerberos.json |     3 +-
 .../TEZ/0.4.0.2.1/package/scripts/tez_client.py |    11 +-
 .../common-services/TEZ/0.9.0.3.0/kerberos.json |     3 +-
 .../TEZ/0.9.0.3.0/package/scripts/tez_client.py |     9 +-
 .../YARN/2.1.0.2.0/configuration/yarn-site.xml  |     6 +
 .../YARN/2.1.0.2.0/kerberos.json                |    30 +-
 .../common-services/YARN/2.1.0.2.0/metainfo.xml |     1 +
 .../scripts/application_timeline_server.py      |     8 +-
 .../2.1.0.2.0/package/scripts/historyserver.py  |    10 +-
 .../package/scripts/mapreduce2_client.py        |    11 +-
 .../2.1.0.2.0/package/scripts/nodemanager.py    |     8 +-
 .../2.1.0.2.0/package/scripts/params_linux.py   |    55 +-
 .../2.1.0.2.0/package/scripts/params_windows.py |    10 +-
 .../package/scripts/resourcemanager.py          |    27 +-
 .../YARN/2.1.0.2.0/package/scripts/service.py   |     4 +
 .../2.1.0.2.0/package/scripts/service_check.py  |     6 +-
 .../YARN/2.1.0.2.0/package/scripts/yarn.py      |    32 +-
 .../2.1.0.2.0/package/scripts/yarn_client.py    |     8 +-
 .../package/templates/include_hosts_list.j2     |    21 +
 .../package/templates/input.config-yarn.json.j2 |    72 -
 .../package/templates/mapred_jaas.conf.j2       |    28 +
 .../package/templates/yarn_ats_jaas.conf.j2     |    27 +
 .../package/templates/yarn_jaas.conf.j2         |    12 +-
 .../package/templates/yarn_nm_jaas.conf.j2      |    27 +
 .../configuration-mapred/mapred-env.xml         |     4 +-
 .../YARN/3.0.0.3.0/configuration/yarn-env.xml   |   214 +-
 .../YARN/3.0.0.3.0/configuration/yarn-log4j.xml |   126 +-
 .../YARN/3.0.0.3.0/configuration/yarn-site.xml  |    13 +-
 .../YARN/3.0.0.3.0/kerberos.json                |    40 +-
 .../common-services/YARN/3.0.0.3.0/metainfo.xml |     1 +
 .../scripts/application_timeline_server.py      |     8 +-
 .../3.0.0.3.0/package/scripts/historyserver.py  |     8 +-
 .../package/scripts/mapreduce2_client.py        |     9 +-
 .../3.0.0.3.0/package/scripts/nodemanager.py    |     8 +-
 .../3.0.0.3.0/package/scripts/params_linux.py   |    44 +-
 .../3.0.0.3.0/package/scripts/params_windows.py |    10 +-
 .../package/scripts/resourcemanager.py          |    27 +-
 .../YARN/3.0.0.3.0/package/scripts/yarn.py      |    34 +-
 .../3.0.0.3.0/package/scripts/yarn_client.py    |     8 +-
 .../package/templates/include_hosts_list.j2     |    21 +
 .../package/templates/mapred_jaas.conf.j2       |    28 +
 .../package/templates/yarn_ats_jaas.conf.j2     |    27 +
 .../package/templates/yarn_jaas.conf.j2         |    12 +-
 .../package/templates/yarn_nm_jaas.conf.j2      |    27 +
 .../YARN/3.0.0.3.0/service_advisor.py           |    44 +-
 .../ZEPPELIN/0.6.0.2.5/alerts.json              |    18 -
 .../0.6.0.2.5/configuration/zeppelin-config.xml |   189 -
 .../0.6.0.2.5/configuration/zeppelin-env.xml    |   183 -
 .../configuration/zeppelin-log4j-properties.xml |    37 -
 .../configuration/zeppelin-shiro-ini.xml        |    90 -
 .../ZEPPELIN/0.6.0.2.5/kerberos.json            |    53 -
 .../ZEPPELIN/0.6.0.2.5/metainfo.xml             |   103 -
 .../package/scripts/alert_check_zeppelin.py     |    47 -
 .../package/scripts/livy2_config_template.py    |   107 -
 .../0.6.0.2.5/package/scripts/master.py         |   442 -
 .../0.6.0.2.5/package/scripts/params.py         |   227 -
 .../0.6.0.2.5/package/scripts/service_check.py  |    39 -
 .../package/scripts/spark2_config_template.py   |    84 -
 .../0.6.0.2.5/package/scripts/status_params.py  |    29 -
 .../0.6.0.2.5/quicklinks/quicklinks.json        |    35 -
 .../ZEPPELIN/0.6.0.2.5/role_command_order.json  |     7 -
 .../common-services/ZEPPELIN/0.6.0/alerts.json  |    18 +
 .../0.6.0/configuration/zeppelin-config.xml     |   208 +
 .../0.6.0/configuration/zeppelin-env.xml        |   184 +
 .../configuration/zeppelin-log4j-properties.xml |    37 +
 .../0.6.0/configuration/zeppelin-shiro-ini.xml  |    97 +
 .../ZEPPELIN/0.6.0/kerberos.json                |    52 +
 .../common-services/ZEPPELIN/0.6.0/metainfo.xml |   103 +
 .../package/scripts/alert_check_zeppelin.py     |    47 +
 .../scripts/interpreter_json_template.py        |   361 +
 .../package/scripts/livy2_config_template.py    |   107 +
 .../ZEPPELIN/0.6.0/package/scripts/master.py    |   522 +
 .../ZEPPELIN/0.6.0/package/scripts/params.py    |   258 +
 .../0.6.0/package/scripts/service_check.py      |    39 +
 .../package/scripts/spark2_config_template.py   |    84 +
 .../0.6.0/package/scripts/status_params.py      |    29 +
 .../templates/input.config-zeppelin.json.j2     |    48 +
 .../ZEPPELIN/0.6.0/quicklinks/quicklinks.json   |    35 +
 .../ZEPPELIN/0.6.0/role_command_order.json      |     7 +
 .../common-services/ZEPPELIN/0.7.0/alerts.json  |    18 +
 .../0.7.0/configuration/zeppelin-config.xml     |   214 +
 .../0.7.0/configuration/zeppelin-env.xml        |   184 +
 .../configuration/zeppelin-log4j-properties.xml |    37 +
 .../0.7.0/configuration/zeppelin-shiro-ini.xml  |    97 +
 .../ZEPPELIN/0.7.0/kerberos.json                |    52 +
 .../common-services/ZEPPELIN/0.7.0/metainfo.xml |   103 +
 .../package/scripts/alert_check_zeppelin.py     |    47 +
 .../scripts/interpreter_json_template.py        |   366 +
 .../package/scripts/livy2_config_template.py    |   112 +
 .../ZEPPELIN/0.7.0/package/scripts/master.py    |   564 +
 .../ZEPPELIN/0.7.0/package/scripts/params.py    |   258 +
 .../0.7.0/package/scripts/service_check.py      |    39 +
 .../package/scripts/spark2_config_template.py   |    84 +
 .../0.7.0/package/scripts/status_params.py      |    29 +
 .../templates/input.config-zeppelin.json.j2     |    48 +
 .../ZEPPELIN/0.7.0/quicklinks/quicklinks.json   |    35 +
 .../ZEPPELIN/0.7.0/role_command_order.json      |     7 +
 .../ZEPPELIN/0.7.0/service_advisor.py           |   209 +
 .../3.4.5/configuration/zookeeper-log4j.xml     |     2 +-
 .../ZOOKEEPER/3.4.5/kerberos.json               |     3 +-
 .../3.4.5/package/scripts/params_linux.py       |     6 +-
 .../3.4.5/package/scripts/zookeeper_client.py   |     7 +-
 .../3.4.5/package/scripts/zookeeper_server.py   |     7 +-
 .../custom_actions/scripts/check_host.py        |    31 +-
 .../custom_actions/scripts/install_packages.py  |   172 +-
 .../scripts/remove_previous_stacks.py           |     7 +-
 .../custom_actions/scripts/ru_execute_tasks.py  |     2 +
 .../custom_actions/scripts/ru_set_all.py        |    81 +-
 .../custom_actions/scripts/update_repo.py       |     7 +-
 .../resources/host_scripts/alert_disk_space.py  |    24 +-
 .../host_scripts/alert_version_select.py        |    16 +-
 .../resources/kerberos_descriptor_schema.json   |   194 +
 .../src/main/resources/key_properties.json      |    10 -
 .../src/main/resources/properties.json          |    44 +-
 .../scripts/check_ambari_permissions.py         |    25 +-
 .../src/main/resources/scripts/configs.py       |   219 +-
 .../src/main/resources/scripts/configs.sh       |   272 +-
 .../scripts/relocate_host_components.py         |   489 -
 .../scripts/shared_initialization.py            |    15 -
 .../services/HDFS/configuration/hdfs-site.xml   |     6 +
 .../HDFS/package/scripts/hdfs_namenode.py       |    12 +-
 .../HDFS/package/scripts/hdfs_snamenode.py      |     6 +
 .../0.8/services/HDFS/package/scripts/params.py |    11 +-
 .../0.8/services/HDFS/package/scripts/utils.py  |     3 +
 .../package/templates/include_hosts_list.j2     |    21 +
 .../services/YARN/configuration/yarn-site.xml   |     6 +
 .../0.8/services/YARN/package/scripts/params.py |    10 +-
 .../YARN/package/scripts/resourcemanager.py     |     9 +-
 .../package/templates/include_hosts_list.j2     |    21 +
 .../services/YARN/configuration/yarn-site.xml   |     6 +
 .../services/YARN/package/scripts/params.py     |     9 +-
 .../YARN/package/scripts/resourcemanager.py     |     9 +-
 .../package/templates/exclude_hosts_list.j2     |    21 +
 .../package/templates/include_hosts_list.j2     |    21 +
 .../HDP/2.0.6/configuration/cluster-env.xml     |    49 +-
 .../2.0.6/hooks/after-INSTALL/scripts/hook.py   |     2 +-
 .../2.0.6/hooks/after-INSTALL/scripts/params.py |     6 +-
 .../scripts/shared_initialization.py            |    58 +-
 .../hooks/before-ANY/files/changeToSecureUid.sh |    15 +-
 .../2.0.6/hooks/before-ANY/scripts/params.py    |     6 +
 .../before-ANY/scripts/shared_initialization.py |    83 +-
 .../hooks/before-INSTALL/scripts/params.py      |     2 +
 .../scripts/repo_initialization.py              |    23 +-
 .../before-START/scripts/custom_extensions.py   |   173 +
 .../2.0.6/hooks/before-START/scripts/hook.py    |     3 +
 .../2.0.6/hooks/before-START/scripts/params.py  |    46 +-
 .../before-START/scripts/rack_awareness.py      |     1 +
 .../scripts/shared_initialization.py            |    38 +-
 .../templates/hadoop-metrics2.properties.j2     |     2 +
 .../HDP/2.0.6/properties/stack_features.json    |   842 +-
 .../HDP/2.0.6/properties/stack_packages.json    |  1178 +
 .../HDP/2.0.6/properties/stack_tools.json       |    16 +-
 .../services/OOZIE/quicklinks/quicklinks.json   |     9 +-
 .../stacks/HDP/2.0.6/services/stack_advisor.py  |    97 +-
 .../services/YARN/configuration/yarn-site.xml   |     6 +
 .../services/YARN/package/scripts/params.py     |    10 +-
 .../YARN/package/scripts/resourcemanager.py     |     9 +-
 .../package/templates/include_hosts_list.j2     |    21 +
 .../FALCON/configuration/oozie-site.xml         |   198 -
 .../stacks/HDP/2.1/services/stack_advisor.py    |     4 +
 .../FALCON/configuration/oozie-site.xml         |   197 -
 .../services/HBASE/configuration/hbase-env.xml  |     4 +-
 .../services/HIVE/configuration/hive-site.xml   |     2 +-
 .../YARN/configuration-mapred/mapred-env.xml    |     4 +-
 .../services/YARN/configuration/yarn-site.xml   |     8 +-
 .../stacks/HDP/2.2/services/YARN/kerberos.json  |    30 +-
 .../stacks/HDP/2.2/services/stack_advisor.py    |    66 -
 .../HDP/2.3.ECS/services/ECS/kerberos.json      |     3 +-
 .../HDP/2.3.ECS/services/HBASE/kerberos.json    |     9 +-
 .../HDP/2.3.ECS/services/YARN/kerberos.json     |    33 +-
 .../services/ACCUMULO/kerberos.json             |    27 +-
 .../stacks/HDP/2.3/role_command_order.json      |     4 +-
 .../HDP/2.3/services/ACCUMULO/kerberos.json     |     6 +-
 .../services/HBASE/configuration/hbase-env.xml  |     6 +-
 .../services/HDFS/configuration/hadoop-env.xml  |     7 +
 .../services/OOZIE/quicklinks/quicklinks.json   |     9 +-
 .../stacks/HDP/2.3/services/TEZ/kerberos.json   |     3 +-
 .../services/YARN/configuration/yarn-env.xml    |    16 +-
 .../stacks/HDP/2.3/services/YARN/kerberos.json  |    30 +-
 .../stacks/HDP/2.3/services/stack_advisor.py    |   147 +-
 .../stacks/HDP/2.3/upgrades/config-upgrade.xml  |    30 +-
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml |    74 +-
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml |    75 +-
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.5.xml |    79 +-
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.6.xml |    79 +-
 .../stacks/HDP/2.3/upgrades/upgrade-2.4.xml     |     1 +
 .../stacks/HDP/2.3/upgrades/upgrade-2.5.xml     |     2 +
 .../stacks/HDP/2.3/upgrades/upgrade-2.6.xml     |     2 +
 .../services/HDFS/configuration/hadoop-env.xml  |     7 +
 .../stacks/HDP/2.4/upgrades/config-upgrade.xml  |    31 +-
 .../HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml |    74 +-
 .../HDP/2.4/upgrades/nonrolling-upgrade-2.5.xml |    79 +-
 .../HDP/2.4/upgrades/nonrolling-upgrade-2.6.xml |    79 +-
 .../stacks/HDP/2.4/upgrades/upgrade-2.5.xml     |     2 +
 .../stacks/HDP/2.4/upgrades/upgrade-2.6.xml     |     2 +
 .../services/ATLAS/configuration/atlas-env.xml  |     2 +-
 .../FALCON/configuration/oozie-site.xml         |    47 -
 .../HDP/2.5/services/FALCON/kerberos.json       |    15 +-
 .../stacks/HDP/2.5/services/HBASE/kerberos.json |    15 +-
 .../stacks/HDP/2.5/services/HDFS/kerberos.json  |    21 +-
 .../HIVE/configuration/hive-exec-log4j2.xml     |     6 +-
 .../services/HIVE/configuration/hive-log4j2.xml |    20 +-
 .../HIVE/configuration/llap-cli-log4j2.xml      |     6 +-
 .../HIVE/configuration/llap-daemon-log4j.xml    |     9 +-
 .../HIVE/configuration/tez-interactive-site.xml |    11 +
 .../stacks/HDP/2.5/services/HIVE/kerberos.json  |    30 +-
 .../stacks/HDP/2.5/services/KNOX/kerberos.json  |     3 +-
 .../HDP/2.5/services/RANGER_KMS/kerberos.json   |    15 +-
 .../stacks/HDP/2.5/services/SPARK/kerberos.json |    21 +-
 .../stacks/HDP/2.5/services/YARN/kerberos.json  |    36 +-
 .../HDP/2.5/services/ZEPPELIN/kerberos.json     |     7 +-
 .../HDP/2.5/services/ZEPPELIN/metainfo.xml      |     4 +-
 .../stacks/HDP/2.5/services/stack_advisor.py    |   127 +-
 .../stacks/HDP/2.5/upgrades/config-upgrade.xml  |   105 +-
 .../HDP/2.5/upgrades/host-upgrade-2.5.xml       |    50 +-
 .../HDP/2.5/upgrades/nonrolling-upgrade-2.5.xml |    98 +-
 .../HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml |   137 +-
 .../stacks/HDP/2.5/upgrades/upgrade-2.5.xml     |    13 +-
 .../stacks/HDP/2.5/upgrades/upgrade-2.6.xml     |    32 +-
 .../stacks/HDP/2.6/kerberos_preconfigure.json   |    22 +
 .../resources/stacks/HDP/2.6/repos/repoinfo.xml |    14 +
 .../configuration/application-properties.xml    |    17 +
 .../services/ATLAS/configuration/atlas-env.xml  |    12 +
 .../ATLAS/configuration/atlas-log4j.xml         |     4 +-
 .../stacks/HDP/2.6/services/ATLAS/kerberos.json |     9 +-
 .../stacks/HDP/2.6/services/ATLAS/metainfo.xml  |     1 +
 .../stacks/HDP/2.6/services/DRUID/kerberos.json |    30 +-
 .../services/HBASE/configuration/hbase-env.xml  |    87 +
 .../services/HBASE/configuration/hbase-site.xml |    19 +
 .../services/HDFS/configuration/core-site.xml   |    29 +
 .../services/HDFS/configuration/hadoop-env.xml  |     5 +
 .../hadoop-metrics2.properties.xml              |     2 +
 .../stacks/HDP/2.6/services/HDFS/kerberos.json  |    21 +-
 .../services/HIVE/configuration/hive-env.xml    |    79 +-
 .../HIVE/configuration/hive-interactive-env.xml |    62 +-
 .../configuration/hive-interactive-site.xml     |    25 +-
 .../services/HIVE/configuration/hive-site.xml   |    36 +
 .../HIVE/configuration/parquet-logging.xml      |   106 +
 .../HIVE/configuration/ranger-hive-security.xml |    33 +
 .../HIVE/configuration/tez-interactive-site.xml |    37 +
 .../stacks/HDP/2.6/services/OOZIE/kerberos.json |    12 +-
 .../configuration/spark-thrift-sparkconf.xml    |    40 +
 .../stacks/HDP/2.6/services/SPARK/kerberos.json |     6 +-
 .../services/SPARK2/configuration/livy2-env.xml |     4 +-
 .../configuration/spark2-thrift-sparkconf.xml   |    40 +
 .../HDP/2.6/services/SPARK2/kerberos.json       |    14 +-
 .../services/STORM/configuration/storm-site.xml |    61 +
 .../stacks/HDP/2.6/services/STORM/metainfo.xml  |     8 +
 .../HDP/2.6/services/SUPERSET/kerberos.json     |    53 +
 .../HDP/2.6/services/SUPERSET/metainfo.xml      |    28 +
 .../YARN/configuration-mapred/mapred-site.xml   |    11 +-
 .../services/YARN/configuration/yarn-env.xml    |    15 +-
 .../services/YARN/configuration/yarn-site.xml   |    18 +-
 .../stacks/HDP/2.6/services/YARN/kerberos.json  |    63 +-
 .../HDP/2.6/services/ZEPPELIN/kerberos.json     |     7 +-
 .../HDP/2.6/services/ZEPPELIN/metainfo.xml      |    19 +
 .../stacks/HDP/2.6/services/stack_advisor.py    |   205 +-
 .../stacks/HDP/2.6/upgrades/config-upgrade.xml  |   216 +
 .../HDP/2.6/upgrades/host-upgrade-2.6.xml       |    48 +-
 .../HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml |   146 +-
 .../stacks/HDP/2.6/upgrades/upgrade-2.6.xml     |    55 +-
 .../HDP/3.0/configuration/cluster-env.xml       |    43 +-
 .../HDP/3.0/hooks/after-INSTALL/scripts/hook.py |     2 +-
 .../3.0/hooks/after-INSTALL/scripts/params.py   |    15 +-
 .../scripts/shared_initialization.py            |    55 +-
 .../HDP/3.0/hooks/before-ANY/scripts/params.py  |     3 +
 .../before-ANY/scripts/shared_initialization.py |    31 +-
 .../3.0/hooks/before-INSTALL/scripts/params.py  |     2 +
 .../scripts/repo_initialization.py              |     8 +
 .../3.0/hooks/before-START/scripts/params.py    |    31 +-
 .../scripts/shared_initialization.py            |    38 +-
 .../templates/hadoop-metrics2.properties.j2     |     2 +
 .../main/resources/stacks/HDP/3.0/metainfo.xml  |     2 +-
 .../HDP/3.0/properties/stack_features.json      |   746 +-
 .../HDP/3.0/properties/stack_packages.json      |  1056 +
 .../stacks/HDP/3.0/properties/stack_tools.json  |    14 +-
 .../stacks/HDP/3.0/services/ATLAS/metainfo.xml  |    27 +
 .../services/HDFS/configuration/hadoop-env.xml  |     7 +
 .../stacks/HDP/3.0/services/KAFKA/metainfo.xml  |    27 +
 .../HDP/3.0/services/KERBEROS/metainfo.xml      |    26 +
 .../stacks/HDP/3.0/services/KNOX/metainfo.xml   |    27 +
 .../stacks/HDP/3.0/services/OOZIE/metainfo.xml  |    27 +
 .../stacks/HDP/3.0/services/RANGER/metainfo.xml |    27 +
 .../HDP/3.0/services/RANGER_KMS/metainfo.xml    |    27 +
 .../stacks/HDP/3.0/services/SQOOP/metainfo.xml  |    27 +
 .../stacks/HDP/3.0/services/STORM/metainfo.xml  |    27 +
 .../YARN/configuration-mapred/mapred-env.xml    |     4 +-
 .../HDP/3.0/services/ZEPPELIN/metainfo.xml      |    27 +
 .../PERF/1.0/configuration/cluster-env.xml      |    16 +-
 .../PERF/1.0/hooks/before-ANY/scripts/params.py |     3 +
 .../before-ANY/scripts/shared_initialization.py |    23 +-
 .../PERF/1.0/properties/stack_features.json     |    38 +-
 .../stacks/PERF/1.0/properties/stack_tools.json |    16 +-
 .../PERF/1.0/services/FAKEHBASE/kerberos.json   |    15 +-
 .../PERF/1.0/services/FAKEHDFS/kerberos.json    |    21 +-
 .../package/templates/input.config-hdfs.json.j2 |   216 -
 .../PERF/1.0/services/FAKEHDFS/widgets.json     |    48 +-
 .../PERF/1.0/services/FAKEYARN/kerberos.json    |    36 +-
 .../1.0/services/FAKEZOOKEEPER/kerberos.json    |     3 +-
 .../PERF/1.0/services/GRUMPY/kerberos.json      |    12 +-
 .../PERF/1.0/services/HAPPY/kerberos.json       |    12 +-
 .../PERF/1.0/services/KERBEROS/kerberos.json    |     3 +-
 .../PERF/1.0/services/KERBEROS/metainfo.xml     |     8 +
 .../KERBEROS/package/scripts/kerberos_client.py |     2 +
 .../KERBEROS/package/scripts/kerberos_common.py |    48 +
 .../services/KERBEROS/properties/krb5_conf.j2   |    60 -
 .../PERF/1.0/services/SLEEPY/kerberos.json      |    12 +-
 .../stacks/PERF/1.0/services/SNOW/kerberos.json |    12 +-
 .../1.0/upgrades/nonrolling-upgrade-2.0.xml     |     6 +-
 .../src/main/resources/stacks/stack_advisor.py  |   144 +-
 .../src/main/resources/upgrade-pack.xsd         |     1 +
 .../catalog/UpgradeCatalog_1.3_to_2.2.json      |   948 -
 .../catalog/UpgradeCatalog_2.0_to_2.2.2.json    |   408 -
 .../catalog/UpgradeCatalog_2.0_to_2.2.4.json    |   453 -
 .../catalog/UpgradeCatalog_2.0_to_2.2.json      |   275 -
 .../catalog/UpgradeCatalog_2.1_to_2.2.2.json    |   465 -
 .../catalog/UpgradeCatalog_2.1_to_2.2.4.json    |   499 -
 .../catalog/UpgradeCatalog_2.1_to_2.2.json      |   292 -
 .../catalog/UpgradeCatalog_2.1_to_2.3.json      |   440 -
 .../catalog/UpgradeCatalog_2.2_to_2.3.json      |  2234 -
 .../UpgradeCatalog_2.2_to_2.3_step2.json        |    81 -
 .../src/main/resources/version_definition.xsd   |     9 +-
 .../src/main/sh/azuredb_create_generator.sh     |    26 +
 .../TransactionalLockInterceptorTest.java       |     3 +-
 .../apache/ambari/server/H2DatabaseCleaner.java |     2 +-
 .../ambari/server/RandomPortJerseyTest.java     |     2 +-
 .../ambari/server/StateRecoveryManagerTest.java |    70 +-
 .../actionmanager/ActionManagerTestHelper.java  |     2 +-
 .../ExecutionCommandWrapperTest.java            |   153 +-
 .../actionmanager/HostRoleStatusTest.java       |     2 +-
 .../ambari/server/actionmanager/StageTest.java  |     6 +-
 .../actionmanager/TestActionDBAccessorImpl.java |    36 +-
 .../server/actionmanager/TestActionManager.java |    46 +-
 .../actionmanager/TestActionScheduler.java      |   143 +-
 .../TestActionSchedulerThreading.java           |    37 +-
 .../ambari/server/actionmanager/TestStage.java  |     7 +-
 .../ambari/server/agent/AgentHostInfoTest.java  |     2 +-
 .../ambari/server/agent/AgentResourceTest.java  |    10 +-
 .../server/agent/DummyHeartbeatConstants.java   |     1 +
 .../server/agent/HeartbeatProcessorTest.java    |   257 +-
 .../server/agent/HeartbeatTestHelper.java       |    24 +-
 .../server/agent/LocalAgentSimulator.java       |    13 +-
 .../ambari/server/agent/TestActionQueue.java    |     4 +-
 .../server/agent/TestHeartbeatHandler.java      |   158 +-
 .../server/agent/TestHeartbeatMonitor.java      |    51 +-
 .../alerts/AgentHeartbeatAlertRunnableTest.java |     2 +-
 .../alerts/AmbariPerformanceRunnableTest.java   |     5 +-
 .../ComponentVersionAlertRunnableTest.java      |   363 +
 .../server/alerts/StaleAlertRunnableTest.java   |     2 +-
 .../org/apache/ambari/server/api/TestSuite.java |    12 +-
 .../server/api/UserNameOverrideFilterTest.java  |     2 +-
 .../server/api/handlers/CreateHandlerTest.java  |     2 +-
 .../server/api/handlers/DeleteHandlerTest.java  |     5 +-
 .../api/handlers/QueryCreateHandlerTest.java    |     2 +-
 .../server/api/handlers/ReadHandlerTest.java    |    14 +-
 .../server/api/handlers/UpdateHandlerTest.java  |     4 +-
 .../server/api/predicate/QueryLexerTest.java    |     2 +-
 .../server/api/predicate/QueryParserTest.java   |    20 +-
 .../predicate/operators/AndOperatorTest.java    |     4 +-
 .../predicate/operators/EqualsOperatorTest.java |     4 +-
 .../predicate/operators/FilterOperatorTest.java |     2 +-
 .../operators/GreaterEqualsOperatorTest.java    |     4 +-
 .../operators/GreaterOperatorTest.java          |     4 +-
 .../api/predicate/operators/InOperatorTest.java |     2 +-
 .../operators/IsEmptyOperatorTest.java          |     2 +-
 .../operators/LessEqualsOperatorTest.java       |     4 +-
 .../predicate/operators/LessOperatorTest.java   |     4 +-
 .../operators/NotEqualsOperatorTest.java        |     4 +-
 .../predicate/operators/NotOperatorTest.java    |     4 +-
 .../api/predicate/operators/OrOperatorTest.java |     4 +-
 .../ExtendedResourcePredicateVisitorTest.java   |     2 +-
 .../server/api/query/JpaSortBuilderTest.java    |     2 +-
 .../query/ProcessingPredicateVisitorTest.java   |     2 +-
 .../ambari/server/api/query/QueryImplTest.java  |    26 +-
 .../ambari/server/api/query/QueryInfoTest.java  |     4 +-
 .../query/SubResourcePredicateVisitorTest.java  |     2 +-
 .../render/ClusterBlueprintRendererTest.java    |    59 +-
 .../api/query/render/DefaultRendererTest.java   |    10 +-
 .../render/MetricsPaddingRendererTest.java      |     2 +-
 .../api/query/render/MinimalRendererTest.java   |    16 +-
 .../resources/BaseResourceDefinitionTest.java   |    33 +-
 .../BlueprintResourceDefinitionTest.java        |     2 +-
 .../ClusterResourceDefinitionTest.java          |     2 +-
 ...onentStackVersionResourceDefinitionTest.java |     2 +-
 .../resources/FeedResourceDefinitionTest.java   |     2 +-
 .../resources/HostResourceDefinitionTest.java   |     2 +-
 .../InstanceResourceDefinitionTest.java         |     2 +-
 .../LdapSyncEventResourceDefinitionTest.java    |     2 +-
 .../PermissionResourceDefinitionTest.java       |     2 +-
 .../PrivilegeResourceDefinitionTest.java        |     2 +-
 .../RepositoryResourceDefinitionTest.java       |     2 +-
 ...RepositoryVersionResourceDefinitionTest.java |     2 +-
 .../ResourceInstanceFactoryImplTest.java        |     2 +-
 .../ServiceResourceDefinitionTest.java          |     2 +-
 .../resources/SimpleResourceDefinitionTest.java |    12 +-
 .../StackConfigurationDefinitionTest.java       |     2 +-
 ...ckConfigurationDependencyDefinitionTest.java |     2 +-
 .../StackServiceResourceDefinitionTest.java     |     2 +-
 .../StackVersionResourceDefinitionTest.java     |     2 +-
 .../TargetClusterResourceDefinitionTest.java    |     2 +-
 .../UpgradeResourceDefinitionTest.java          |     4 +-
 .../resources/UserResourceDefinitionTest.java   |     2 +-
 .../ViewExternalSubResourceDefinitionTest.java  |     2 +-
 .../ViewInstanceResourceDefinitionTest.java     |     2 +-
 .../ViewPermissionResourceDefinitionTest.java   |     2 +-
 .../resources/ViewResourceDefinitionTest.java   |     2 +-
 .../ViewVersionResourceDefinitionTest.java      |     2 +-
 .../server/api/services/ActionServiceTest.java  |     2 +-
 .../services/ActiveWidgetLayoutServiceTest.java |    75 -
 .../server/api/services/AmbariMetaInfoTest.java |   362 +-
 .../server/api/services/BaseRequestTest.java    |     2 +-
 .../server/api/services/BaseServiceTest.java    |     2 +-
 .../api/services/BlueprintServiceTest.java      |     4 +-
 .../services/ClusterPrivilegeServiceTest.java   |     4 +-
 .../server/api/services/ClusterServiceTest.java |    36 +-
 .../ClusterStackVersionServiceTest.java         |     4 +-
 .../api/services/ComponentServiceTest.java      |     2 +-
 .../api/services/ConfigGroupServiceTest.java    |     2 +-
 .../api/services/ConfigurationServiceTest.java  |     2 +-
 .../server/api/services/DeleteRequestTest.java  |     2 +-
 .../api/services/DeleteResultMetaDataTest.java  |     4 +-
 .../api/services/ExtensionsServiceTest.java     |     2 +-
 .../server/api/services/FeedServiceTest.java    |     2 +-
 .../server/api/services/GetRequestTest.java     |     2 +-
 .../api/services/GroupPrivilegeServiceTest.java |   111 -
 .../server/api/services/GroupServiceTest.java   |     5 +-
 .../api/services/HostComponentServiceTest.java  |     2 +-
 .../server/api/services/HostServiceTest.java    |     4 +-
 .../services/HostStackVersionServiceTest.java   |     4 +-
 .../api/services/InstanceServiceTest.java       |     2 +-
 .../services/KerberosServiceMetaInfoTest.java   |     2 +-
 .../api/services/LdapSyncEventServiceTest.java  |     2 +-
 .../server/api/services/LoggingServiceTest.java |     2 +-
 .../server/api/services/MemberServiceTest.java  |   110 -
 .../api/services/NamedPropertySetTest.java      |     4 +-
 .../api/services/PermissionServiceTest.java     |     2 +-
 .../server/api/services/PersistServiceTest.java |     8 +-
 .../services/PersistenceManagerImplTest.java    |     4 +-
 .../server/api/services/PostRequestTest.java    |     2 +-
 .../services/PreUpgradeCheckServiceTest.java    |     4 +-
 .../api/services/PrivilegeServiceTest.java      |     2 +-
 .../server/api/services/PutRequestTest.java     |     2 +-
 .../api/services/QueryPostRequestTest.java      |     2 +-
 .../api/services/RecommendationServiceTest.java |     2 +-
 .../api/services/RepositoryServiceTest.java     |     6 +-
 .../server/api/services/RequestBodyTest.java    |     4 +-
 .../server/api/services/RequestFactoryTest.java |    14 +-
 .../api/services/RootServiceServiceTest.java    |    13 +-
 .../server/api/services/ServiceServiceTest.java |     2 +-
 .../server/api/services/SettingServiceTest.java |     4 +-
 .../server/api/services/StacksServiceTest.java  |     2 +-
 .../api/services/TargetClusterServiceTest.java  |     2 +-
 .../services/UpdatePersistenceManagerTest.java  |     2 +-
 .../api/services/UpgradeItemServiceTest.java    |     4 +-
 .../services/UserAuthorizationServiceTest.java  |   100 -
 .../api/services/UserPrivilegeServiceTest.java  |   124 -
 .../api/services/ValidationServiceTest.java     |     2 +-
 .../services/ViewDataMigrationServiceTest.java  |    81 -
 .../ViewExternalSubResourceServiceTest.java     |    50 -
 .../api/services/ViewPermissionServiceTest.java |   101 -
 .../services/ViewSubResourceServiceTest.java    |     3 +-
 .../parsers/BodyParseExceptionTest.java         |     2 +-
 .../parsers/JsonRequestBodyParserTest.java      |     2 +-
 .../serializers/JsonSerializerTest.java         |     2 +-
 .../StackAdvisorBlueprintProcessorTest.java     |     4 +
 .../stackadvisor/StackAdvisorExceptionTest.java |     2 +-
 .../stackadvisor/StackAdvisorHelperTest.java    |    65 +-
 .../StackAdvisorRequestTypeTest.java            |     2 +-
 .../stackadvisor/StackAdvisorRunnerTest.java    |    12 +-
 .../ConfigurationRecommendationCommandTest.java |     7 +-
 .../commands/StackAdvisorCommandTest.java       |    49 +-
 .../views/ViewDataMigrationServiceTest.java     |    81 +
 .../ViewExternalSubResourceServiceTest.java     |    50 +
 .../audit/AccessUnauthorizedAuditEventTest.java |     2 +-
 .../server/audit/LoginAuditEventTest.java       |     2 +-
 .../server/audit/LogoutAuditEventTest.java      |     2 +-
 .../audit/OperationStatusAuditEventTest.java    |     2 +-
 .../StartOperationRequestAuditEventTest.java    |     2 +-
 .../audit/request/AbstractBaseCreator.java      |     2 +-
 .../server/audit/request/AllGetCreator.java     |     2 +-
 .../audit/request/AllPostAndPutCreator.java     |     2 +-
 .../audit/request/DefaultEventCreatorTest.java  |    11 +-
 .../audit/request/PutHostComponentCreator.java  |     2 +-
 .../audit/request/RequestAuditLogModule.java    |     2 +-
 .../audit/request/RequestAuditLoggerTest.java   |     5 +-
 .../creator/AuditEventCreatorTestBase.java      |     2 +-
 .../ConfigurationChangeEventCreatorTest.java    |     2 +-
 .../request/creator/HostEventCreatorTest.java   |     4 +-
 .../creator/UpgradeEventCreatorTest.java        |     4 +-
 .../server/bootstrap/BootStrapResourceTest.java |    10 +-
 .../ambari/server/bootstrap/BootStrapTest.java  |     8 +-
 .../checks/AbstractCheckDescriptorTest.java     |   287 +-
 .../server/checks/AtlasPresenceCheckTest.java   |     4 +-
 .../checks/AutoStartDisabledCheckTest.java      |     2 +-
 .../checks/ClientRetryPropertyCheckTest.java    |    42 +-
 .../checks/ComponentExistsInRepoCheckTest.java  |   352 +
 .../checks/ComponentsInstallationCheckTest.java |    62 +-
 .../checks/ConfigurationMergeCheckTest.java     |    15 +-
 .../DatabaseConsistencyCheckHelperTest.java     |    64 +-
 ...ardcodedStackVersionPropertiesCheckTest.java |     4 +-
 .../ambari/server/checks/HealthCheckTest.java   |     2 +-
 .../HiveDynamicServiceDiscoveryCheckTest.java   |    25 +-
 .../checks/HiveMultipleMetastoreCheckTest.java  |    57 +-
 .../checks/HiveNotRollingWarningTest.java       |    39 +-
 .../server/checks/HostsHeartbeatCheckTest.java  |    16 +-
 .../checks/HostsMasterMaintenanceCheckTest.java |    69 +-
 .../checks/HostsRepositoryVersionCheckTest.java |    90 +-
 .../server/checks/InstallPackagesCheckTest.java |    44 +-
 .../server/checks/KafkaKerberosCheckTest.java   |    39 +-
 ...duce2JobHistoryStatePreservingCheckTest.java |    64 +-
 .../checks/PreviousUpgradeCompletedTest.java    |    15 +-
 .../server/checks/RangerAuditDbCheckTest.java   |    42 +-
 .../server/checks/RangerPasswordCheckTest.java  |    52 +-
 .../server/checks/RangerSSLConfigCheckTest.java |    38 +-
 .../SecondaryNamenodeDeletedCheckTest.java      |    56 +-
 .../checks/ServiceCheckValidityCheckTest.java   |    47 +-
 .../server/checks/ServicePresenceCheckTest.java |    34 +-
 .../ServicesMaintenanceModeCheckTest.java       |    46 +-
 ...vicesMapReduceDistributedCacheCheckTest.java |    50 +-
 ...rvicesNamenodeHighAvailabilityCheckTest.java |    39 +-
 .../ServicesNamenodeTruncateCheckTest.java      |    48 +-
 .../ServicesTezDistributedCacheCheckTest.java   |    39 +-
 .../server/checks/ServicesUpCheckTest.java      |    79 +-
 .../ServicesYarnWorkPreservingCheckTest.java    |    38 +-
 .../server/checks/StormShutdownWarningTest.java |    38 +-
 .../server/checks/UpgradeCheckOrderTest.java    |     2 +-
 .../server/checks/VersionMismatchCheckTest.java |     4 +-
 ...nTimelineServerStatePreservingCheckTest.java |    20 +-
 .../server/cleanup/CleanupServiceImplTest.java  |    39 +-
 .../server/collections/PredicateUtilsTest.java  |     6 +-
 .../collections/functors/AndPredicateTest.java  |     8 +-
 .../collections/functors/NotPredicateTest.java  |     4 +-
 .../collections/functors/OrPredicateTest.java   |     8 +-
 .../ComponentSSLConfigurationTest.java          |     2 +-
 .../configuration/RecoveryConfigHelperTest.java |    52 +-
 .../server/controller/ActionRequestTest.java    |     2 +-
 .../server/controller/ActionResponseTest.java   |     5 +-
 .../AmbariCustomCommandExecutionHelperTest.java |   142 +-
 .../controller/AmbariHandlerListTest.java       |     2 +-
 .../AmbariManagementControllerImplTest.java     |   300 +-
 .../AmbariManagementControllerTest.java         |  2004 +-
 .../server/controller/AmbariServerTest.java     |     2 +-
 .../controller/AmbariSessionManagerTest.java    |     2 +-
 .../controller/AuthToLocalBuilderTest.java      |    87 +-
 .../BackgroundCustomCommandExecutionTest.java   |    28 +-
 .../server/controller/ClusterRequestTest.java   |    18 +-
 .../server/controller/ClusterResponseTest.java  |    16 +-
 .../server/controller/KerberosHelperTest.java   |  1408 +-
 .../server/controller/LdapSyncRequestTest.java  |     2 +-
 .../controller/MaintenanceStateHelperTest.java  |     2 +-
 ...hYarnCapacitySchedulerReleaseConfigTest.java |    80 +-
 .../RootServiceResponseFactoryTest.java         |    13 +-
 .../ServiceConfigVersionResponseTest.java       |     2 +-
 .../controller/StackServiceResponseTest.java    |     2 +-
 .../GSInstallerClusterProviderTest.java         |   104 -
 .../GSInstallerComponentProviderTest.java       |   102 -
 .../GSInstallerHostComponentProviderTest.java   |   149 -
 .../GSInstallerHostProviderTest.java            |   153 -
 .../GSInstallerNoOpProviderTest.java            |    46 -
 .../GSInstallerServiceProviderTest.java         |   166 -
 .../TestGSInstallerStateProvider.java           |    36 -
 .../AbstractControllerResourceProviderTest.java |    34 +-
 .../AbstractDRResourceProviderTest.java         |     2 +-
 .../AbstractJDBCResourceProviderTest.java       |     2 +-
 .../internal/AbstractPropertyProviderTest.java  |     2 +-
 .../internal/AbstractResourceProviderTest.java  |    41 +-
 .../internal/ActionResourceProviderTest.java    |     2 +-
 .../ActiveWidgetLayoutResourceProviderTest.java |     3 +-
 .../AlertDefinitionResourceProviderTest.java    |    10 +-
 .../AlertGroupResourceProviderTest.java         |     4 +-
 .../AlertHistoryResourceProviderTest.java       |     4 +-
 .../AlertNoticeResourceProviderTest.java        |     4 +-
 .../internal/AlertResourceProviderTest.java     |     2 +-
 .../AlertTargetResourceProviderTest.java        |     2 +-
 .../AmbariPrivilegeResourceProviderTest.java    |     8 +-
 .../internal/AppCookieManagerTest.java          |     2 +-
 .../internal/ArtifactResourceProviderTest.java  |    14 +-
 .../AtlasServerHttpPropertyRequestTest.java     |     4 +-
 .../internal/BaseBlueprintProcessorTest.java    |    13 +-
 .../controller/internal/BaseProviderTest.java   |     2 +-
 .../BlueprintConfigurationProcessorTest.java    |   552 +-
 .../internal/BlueprintResourceProviderTest.java |    17 +-
 .../internal/CalculatedStatusTest.java          |    12 +-
 .../ClientConfigResourceProviderTest.java       |    39 +-
 .../internal/ClusterControllerImplTest.java     |    14 +-
 ...rKerberosDescriptorResourceProviderTest.java |    16 +-
 .../internal/ClusterResourceProviderTest.java   |    38 +-
 ...ClusterStackVersionResourceProviderTest.java |  1199 +-
 ...leRepositoryVersionResourceProviderTest.java |     5 +-
 .../internal/ComponentResourceProviderTest.java |   142 +-
 .../ConfigGroupResourceProviderTest.java        |    11 +-
 .../ConfigurationResourceProviderTest.java      |     4 +-
 .../CredentialResourceProviderTest.java         |    10 +-
 .../internal/DeleteStatusMetaDataTest.java      |     4 +-
 .../internal/ExportBlueprintRequestTest.java    |     8 +-
 .../internal/ExtensionResourceProviderTest.java |     5 +-
 .../internal/FeedResourceProviderTest.java      |     8 +-
 .../GroupPrivilegeResourceProviderTest.java     |    13 +-
 ...ostComponentProcessResourceProviderTest.java |     8 +-
 .../HostComponentResourceProviderTest.java      |    70 +-
 .../internal/HostResourceProviderTest.java      |   255 +-
 .../HostStackVersionResourceProviderTest.java   |    29 +-
 .../internal/HttpPropertyProviderTest.java      |    31 +-
 .../internal/InstanceResourceProviderTest.java  |     8 +-
 .../internal/JMXHostProviderTest.java           |    37 +-
 .../KerberosDescriptorResourceProviderTest.java |     7 +-
 .../LdapSyncEventResourceProviderTest.java      |     2 +-
 .../internal/MemberResourceProviderTest.java    |    11 +-
 .../internal/MetricsServiceProviderTest.java    |     2 +-
 .../internal/PageRequestImplTest.java           |     2 +-
 .../internal/PageResponseImplTest.java          |     2 +-
 .../PermissionResourceProviderTest.java         |     2 +-
 .../PreUpgradeCheckResourceProviderTest.java    |    25 +-
 .../internal/PropertyPredicateVisitorTest.java  |     2 +-
 .../internal/ProvisionClusterRequestTest.java   |    27 +-
 .../QuickLinkArtifactResourceProviderTest.java  |     8 +-
 .../RecommendationResourceProviderTest.java     |     4 +-
 .../RemoteClusterResourceProviderTest.java      |     2 +-
 .../RepositoryResourceProviderTest.java         |    12 +-
 .../RepositoryVersionResourceProviderTest.java  |    76 +-
 .../controller/internal/RequestImplTest.java    |    42 +-
 .../internal/RequestOperationLevelTest.java     |     2 +-
 .../internal/RequestResourceProviderTest.java   |   110 +-
 .../RequestScheduleResourceProviderTest.java    |     2 +-
 .../internal/RequestStageContainerTest.java     |     7 +-
 .../internal/RequestStatusImplTest.java         |     2 +-
 .../controller/internal/ResourceImplTest.java   |     2 +-
 ...ootServiceComponentPropertyProviderTest.java |     3 +-
 ...ootServiceComponentResourceProviderTest.java |    26 +-
 ...erviceHostComponentResourceProviderTest.java |    15 +-
 .../RootServiceResourceProviderTest.java        |     7 +-
 .../internal/ScaleClusterRequestTest.java       |    22 +-
 .../controller/internal/SchemaImplTest.java     |     2 +-
 .../internal/ServiceResourceProviderTest.java   |   389 +-
 .../internal/SettingResourceProviderTest.java   |     2 +-
 .../SimplifyingPredicateVisitorTest.java        |     8 +-
 .../StackAdvisorResourceProviderTest.java       |    27 +-
 .../StackArtifactResourceProviderTest.java      |     2 +-
 ...igurationDependencyResourceProviderTest.java |     2 +-
 .../StackConfigurationResourceProviderTest.java |     2 +-
 .../StackDefinedPropertyProviderTest.java       |    44 +-
 .../StackDependencyResourceProviderTest.java    |     2 +-
 ...kLevelConfigurationResourceProviderTest.java |     2 +-
 .../internal/StackResourceProviderTest.java     |     5 +-
 .../StackServiceResourceProviderTest.java       |     7 +-
 .../server/controller/internal/StackTest.java   |    64 +-
 .../StackUpgradeConfigurationMergeTest.java     |   255 +-
 .../internal/StageResourceProviderTest.java     |     8 +-
 .../TargetClusterResourceProviderTest.java      |     8 +-
 .../internal/TaskResourceProviderTest.java      |    10 +-
 .../internal/TestIvoryProviderModule.java       |     2 +-
 .../controller/internal/TestIvoryService.java   |     2 +-
 .../internal/URLStreamProviderTest.java         |     4 +-
 .../controller/internal/UnitUpdaterTest.java    |   114 +
 .../UpgradeResourceProviderHDP22Test.java       |   321 -
 .../internal/UpgradeResourceProviderTest.java   |   625 +-
 .../UpgradeSummaryResourceProviderTest.java     |    27 +-
 .../UserAuthorizationResourceProviderTest.java  |     2 +-
 .../UserPrivilegeResourceProviderTest.java      |    26 +-
 .../internal/UserResourceProviderDBTest.java    |     2 +-
 .../internal/UserResourceProviderTest.java      |     2 +-
 .../ValidationResourceProviderTest.java         |     4 +-
 .../VersionDefinitionResourceProviderTest.java  |   186 +-
 .../ViewInstanceResourceProviderTest.java       |     5 +-
 .../ViewPermissionResourceProviderTest.java     |     2 +-
 .../internal/ViewURLResourceProviderTest.java   |     6 +-
 .../WidgetLayoutResourceProviderTest.java       |     8 +-
 .../internal/WidgetResourceProviderTest.java    |     2 +-
 .../server/controller/ivory/ClusterTest.java    |     2 +-
 .../server/controller/ivory/FeedTest.java       |     2 +-
 .../server/controller/ivory/InstanceTest.java   |     2 +-
 .../jdbc/TestJDBCResourceProvider.java          |     2 +-
 .../controller/jmx/TestStreamProvider.java      |     2 +-
 .../logging/LogLevelQueryResponseTest.java      |     2 +-
 .../controller/logging/LogLineResultTest.java   |     2 +-
 .../logging/LogQueryResponseTest.java           |     2 +-
 .../LogSearchDataRetrievalServiceTest.java      |   252 +-
 .../LoggingRequestHelperFactoryImplTest.java    |    14 +-
 .../logging/LoggingRequestHelperImplTest.java   |    17 +-
 .../LoggingSearchPropertyProviderTest.java      |    27 +-
 .../server/controller/logging/UtilsTest.java    |     2 +-
 .../metrics/JMXPropertyProviderTest.java        |    23 +-
 .../RestMetricsPropertyProviderTest.java        |    28 +-
 .../ThreadPoolEnabledPropertyProviderTest.java  |     2 +-
 .../metrics/ganglia/GangliaMetricTest.java      |     6 +-
 .../ganglia/GangliaPropertyProviderTest.java    |     4 +-
 .../GangliaReportPropertyProviderTest.java      |     2 +-
 .../metrics/ganglia/TestHttpUrlConnection.java  |     5 +-
 .../metrics/ganglia/TestStreamProvider.java     |     5 +-
 .../timeline/AMSPropertyProviderTest.java       |    38 +-
 .../timeline/AMSReportPropertyProviderTest.java |     2 +-
 .../timeline/MetricsPaddingMethodTest.java      |     2 +-
 .../timeline/MetricsRequestHelperTest.java      |     8 +-
 .../cache/TimelineMetricCacheSizingTest.java    |     2 +-
 .../timeline/cache/TimelineMetricCacheTest.java |     2 +-
 .../controller/predicate/AndPredicateTest.java  |     2 +-
 .../predicate/CategoryIsEmptyPredicateTest.java |     2 +-
 .../predicate/CategoryPredicateTest.java        |     2 +-
 .../predicate/EqualsPredicateTest.java          |     2 +-
 .../predicate/FilterPredicateTest.java          |     2 +-
 .../predicate/GreaterEqualsPredicateTest.java   |     2 +-
 .../predicate/GreaterPredicateTest.java         |     2 +-
 .../predicate/LessEqualsPredicateTest.java      |     2 +-
 .../controller/predicate/LessPredicateTest.java |     2 +-
 .../controller/predicate/NotPredicateTest.java  |     2 +-
 .../controller/predicate/OrPredicateTest.java   |     2 +-
 .../predicate/PredicateVisitorTest.java         |     2 +-
 .../server/controller/spi/ResourceTest.java     |     2 +-
 ...ThreadPoolExecutorCompletionServiceTest.java |     2 +-
 .../utilities/DatabaseCheckerTest.java          |     2 +-
 .../utilities/KerberosIdentityCleanerTest.java  |   284 +
 .../utilities/PredicateBuilderTest.java         |     2 +-
 .../utilities/PropertyHelperTest.java           |     8 +-
 .../DefaultServiceCalculatedStateTest.java      |     2 +-
 .../state/FlumeServiceCalculatedStateTest.java  |     2 +-
 .../GeneralServiceCalculatedStateTest.java      |    13 +-
 .../state/HBaseServiceCalculatedStateTest.java  |     2 +-
 .../state/HDFSServiceCalculatedStateTest.java   |     2 +-
 .../state/HiveServiceCalculatedStateTest.java   |     2 +-
 .../state/OozieServiceCalculatedStateTest.java  |     2 +-
 .../state/YarnServiceCalculatedStateTest.java   |     2 +-
 .../utilities/webserver/StartServer.java        |     2 +-
 .../credentialapi/CredentialUtilTest.java       |     5 +-
 .../ActionDefinitionManagerTest.java            |     2 +-
 .../apache/ambari/server/events/EventsTest.java |    21 +-
 .../ambari/server/events/MockEventListener.java |     2 +-
 .../listeners/tasks/TaskStatusListenerTest.java |     5 +-
 .../AlertMaintenanceModeListenerTest.java       |    10 +-
 .../HostVersionOutOfSyncListenerTest.java       |   150 +-
 .../upgrade/StackUpgradeFinishListenerTest.java |    10 +-
 .../upgrade/StackVersionListenerTest.java       |   107 +-
 .../publishers/VersionEventPublisherTest.java   |     4 +-
 .../server/hooks/users/UserHookServiceTest.java |    12 +-
 .../metadata/AgentAlertDefinitionsTest.java     |     4 +-
 .../server/metadata/RoleCommandOrderTest.java   |    66 +-
 .../ambari/server/metadata/RoleGraphTest.java   |    25 +-
 .../metric/system/impl/MetricsServiceTest.java  |     4 +-
 .../metric/system/impl/MetricsSourceTest.java   |     4 +-
 .../system/impl/TestAmbariMetricsSinkImpl.java  |    12 +-
 .../metric/system/impl/TestMetricsSource.java   |     4 +-
 .../notifications/DispatchFactoryTest.java      |     2 +-
 .../server/notifications/MockDispatcher.java    |     2 +-
 .../dispatchers/AlertScriptDispatcherTest.java  |    69 +-
 .../dispatchers/AmbariSNMPDispatcherTest.java   |     2 +-
 .../dispatchers/EmailDispatcherTest.java        |     2 +-
 .../dispatchers/SNMPDispatcherTest.java         |     2 +-
 .../ambari/server/orm/AlertDaoHelper.java       |     2 +-
 .../ambari/server/orm/DBAccessorImplTest.java   |   178 +
 .../server/orm/InMemoryDefaultTestModule.java   |     5 +-
 .../ambari/server/orm/JdbcPropertyTest.java     |     2 +-
 .../apache/ambari/server/orm/OrmTestHelper.java |    88 +-
 .../apache/ambari/server/orm/TestOrmImpl.java   |     2 +-
 .../server/orm/dao/AlertDefinitionDAOTest.java  |     2 +-
 .../server/orm/dao/AlertDispatchDAOTest.java    |     2 +-
 .../server/orm/dao/AlertsDAOCachedTest.java     |     2 +-
 .../ambari/server/orm/dao/AlertsDAOTest.java    |     2 +-
 .../ambari/server/orm/dao/BlueprintDAOTest.java |     2 +-
 .../server/orm/dao/ClusterVersionDAOTest.java   |   264 -
 .../server/orm/dao/ConfigGroupDAOTest.java      |     2 +-
 .../ambari/server/orm/dao/CrudDAOTest.java      |     2 +-
 .../ambari/server/orm/dao/GroupDAOTest.java     |     2 +-
 .../dao/HostComponentDesiredStateDAOTest.java   |     4 +-
 .../orm/dao/HostComponentStateDAOTest.java      |     4 +-
 .../orm/dao/HostConfigMappingDAOTest.java       |     2 +-
 .../server/orm/dao/HostRoleCommandDAOTest.java  |    12 +-
 .../server/orm/dao/HostVersionDAOTest.java      |    36 +-
 .../ambari/server/orm/dao/PrincipalDAOTest.java |     2 +-
 .../server/orm/dao/PrincipalTypeDAOTest.java    |     2 +-
 .../orm/dao/RepositoryVersionDAOTest.java       |    51 +-
 .../ambari/server/orm/dao/RequestDAOTest.java   |     8 +-
 .../server/orm/dao/RequestScheduleDAOTest.java  |     2 +-
 .../ambari/server/orm/dao/ResourceDAOTest.java  |     2 +-
 .../server/orm/dao/ResourceTypeDAOTest.java     |     2 +-
 .../server/orm/dao/ServiceConfigDAOTest.java    |    25 +-
 .../ambari/server/orm/dao/SettingDAOTest.java   |     2 +-
 .../ambari/server/orm/dao/StageDAOTest.java     |     4 +-
 .../orm/dao/TopologyLogicalRequestDAOTest.java  |     2 +-
 .../server/orm/dao/TopologyRequestDAOTest.java  |     2 +-
 .../ambari/server/orm/dao/UpgradeDAOTest.java   |   138 +-
 .../ambari/server/orm/dao/UserDAOTest.java      |     2 +-
 .../server/orm/dao/ViewInstanceDAOTest.java     |     2 +-
 .../ambari/server/orm/dao/WidgetDAOTest.java    |     4 +-
 .../server/orm/dao/WidgetLayoutDAOTest.java     |     2 +-
 .../apache/ambari/server/orm/db/DDLTests.java   |    26 +-
 .../orm/entities/AlertCurrentEntityTest.java    |     2 +-
 .../orm/entities/AlertDefinitionEntityTest.java |     2 +-
 .../orm/entities/AlertHistoryEntityTest.java    |     2 +-
 .../entities/BlueprintConfigEntityPKTest.java   |     2 +-
 .../orm/entities/BlueprintConfigEntityTest.java |     2 +-
 .../orm/entities/BlueprintEntityTest.java       |     2 +-
 .../entities/BlueprintSettingEntityTest.java    |     2 +-
 .../server/orm/entities/HostEntityTest.java     |    16 +-
 .../entities/HostGroupComponentEntityTest.java  |     2 +-
 .../entities/HostGroupConfigEntityPKTest.java   |     2 +-
 .../orm/entities/HostGroupConfigEntityTest.java |     2 +-
 .../orm/entities/HostGroupEntityTest.java       |     2 +-
 .../orm/entities/HostRoleCommandEntityTest.java |    49 +
 .../orm/entities/LdapSyncEventEntityTest.java   |     4 +-
 .../orm/entities/LdapSyncSpecEntityTest.java    |    12 +-
 .../orm/entities/PrincipalEntityTest.java       |     2 +-
 .../orm/entities/PrincipalTypeEntityTest.java   |     2 +-
 .../server/orm/entities/ResourceEntityTest.java |     2 +-
 .../orm/entities/ResourceTypeEntityTest.java    |     2 +-
 .../orm/entities/ServiceConfigEntityTest.java   |     2 +-
 .../server/orm/entities/SettingEntityTest.java  |     2 +-
 .../server/orm/entities/StageEntityTest.java    |     2 +-
 .../orm/entities/ViewEntityEntityTest.java      |     2 +-
 .../server/orm/entities/ViewEntityTest.java     |     2 +-
 .../orm/entities/ViewInstanceEntityTest.java    |     2 +-
 .../ambari/server/proxy/ProxyServiceTest.java   |     2 +-
 .../ambari/server/resources/TestResources.java  |     2 +-
 .../sample/checks/SampleServiceCheck.java       |     4 -
 .../scheduler/ExecutionScheduleManagerTest.java |    23 +-
 .../scheduler/ExecutionSchedulerTest.java       |     2 +-
 .../server/security/CertGenerationTest.java     |     8 +-
 .../server/security/SecurityFilterTest.java     |     2 +-
 .../server/security/SecurityHelperImplTest.java |     2 +-
 .../server/security/SslExecutionTest.java       |     8 +-
 .../authorization/AmbariAuthenticationTest.java |    13 +-
 .../AmbariAuthorizationFilterTest.java          |    10 +-
 ...mbariLdapAuthenticationProviderBaseTest.java |     2 +-
 ...uthenticationProviderForDNWithSpaceTest.java |     2 +-
 ...henticationProviderForDuplicateUserTest.java |     2 +-
 .../AmbariLdapAuthenticationProviderTest.java   |     2 +-
 .../AmbariLocalUserProviderTest.java            |     2 +-
 .../AmbariPamAuthenticationProviderTest.java    |   126 +-
 .../AmbariUserAuthenticationFilterTest.java     |     6 +-
 .../AuthorizationHelperInitializer.java         |     2 +-
 .../authorization/AuthorizationHelperTest.java  |     2 +-
 .../authorization/AuthorizationTestModule.java  |     2 +-
 ...thorizationTestModuleForLdapDNWithSpace.java |     2 +-
 .../authorization/LdapServerPropertiesTest.java |     2 +-
 .../TestAmbariLdapAuthoritiesPopulator.java     |     2 +-
 .../security/authorization/UsersTest.java       |     4 +-
 .../security/encryption/AESEncryptorTest.java   |     2 +-
 .../encryption/CredentialProviderTest.java      |     2 +-
 .../encryption/CredentialStoreTest.java         |     2 +-
 .../encryption/MasterKeyServiceTest.java        |     8 +-
 .../ldap/AmbariLdapDataPopulatorTest.java       |    85 +-
 .../serveraction/ServerActionExecutorTest.java  |    11 +-
 .../ADKerberosOperationHandlerTest.java         |    96 +-
 .../FinalizeKerberosServerActionTest.java       |     8 +-
 .../serveraction/kerberos/KDCTypeTest.java      |     4 +-
 .../kerberos/KerberosOperationHandlerTest.java  |     2 +-
 .../MITKerberosOperationHandlerTest.java        |    20 +-
 .../UpdateKerberosConfigsServerActionTest.java  |     7 +-
 .../AutoSkipFailedSummaryActionTest.java        |    26 +-
 .../ComponentVersionCheckActionTest.java        |   297 +-
 .../upgrades/ConfigureActionTest.java           |   705 +-
 .../FixCapacitySchedulerOrderingPolicyTest.java |     2 +-
 .../upgrades/FixLzoCodecPathTest.java           |     2 +-
 .../upgrades/FixOozieAdminUsersTest.java        |     2 +-
 .../upgrades/FixYarnWebServiceUrlTest.java      |     2 +-
 .../HBaseEnvMaxDirectMemorySizeActionTest.java  |     2 +-
 .../upgrades/HiveEnvClasspathActionTest.java    |     2 +-
 .../upgrades/HiveZKQuorumConfigActionTest.java  |     4 +-
 .../upgrades/KerberosKeytabsActionTest.java     |     2 +-
 .../upgrades/OozieConfigCalculationTest.java    |     2 +-
 .../PreconfigureKerberosActionTest.java         |   596 +
 .../upgrades/RangerConfigCalculationTest.java   |     2 +-
 .../RangerKerberosConfigCalculationTest.java    |     4 +-
 .../upgrades/RangerKmsProxyConfigTest.java      |     4 +-
 .../RangerWebAlertConfigActionTest.java         |     4 +-
 .../upgrades/UpgradeActionTest.java             |   760 +-
 .../UpgradeUserKerberosDescriptorTest.java      |    65 +-
 .../CsvFilePersisterServiceFunctionalTest.java  |     4 +-
 .../PostUserCreationHookServerActionTest.java   |     8 +-
 .../server/stack/ComponentModuleTest.java       |    29 +-
 .../QuickLinksConfigurationModuleTest.java      |    26 +-
 .../ambari/server/stack/RepoUtilTest.java       |     2 +-
 .../ambari/server/stack/ServiceModuleTest.java  |    60 +-
 .../stack/StackManagerCommonServicesTest.java   |     6 +-
 .../server/stack/StackManagerExtensionTest.java |    75 +-
 .../server/stack/StackManagerMiscTest.java      |    15 +-
 .../ambari/server/stack/StackManagerMock.java   |     7 +-
 .../ambari/server/stack/StackManagerTest.java   |    22 +-
 .../ambari/server/stack/StackModuleTest.java    |    12 +-
 .../ambari/server/stack/ThemeModuleTest.java    |    16 +-
 .../UpdateActiveRepoVersionOnStartupTest.java   |    83 +-
 .../server/stageplanner/TestStagePlanner.java   |   259 +-
 .../apache/ambari/server/state/AlertTest.java   |     2 +-
 .../ambari/server/state/CheckHelperTest.java    |   265 +-
 .../ambari/server/state/ConfigGroupTest.java    |    11 +-
 .../ambari/server/state/ConfigHelperTest.java   |    71 +-
 .../server/state/ConfigMergeHelperTest.java     |     2 +-
 .../ambari/server/state/DesiredConfigTest.java  |     2 +-
 .../ambari/server/state/PropertyInfoTest.java   |     4 +-
 .../server/state/RequestExecutionTest.java      |     2 +-
 .../server/state/ServiceComponentTest.java      |   332 +-
 .../ambari/server/state/ServiceInfoTest.java    |     2 +-
 .../server/state/ServicePropertiesTest.java     |     4 +-
 .../server/state/ServicePropertyInfoTest.java   |     2 +-
 .../apache/ambari/server/state/ServiceTest.java |   117 +-
 .../ambari/server/state/UpgradeContextTest.java |   413 +
 .../ambari/server/state/UpgradeHelperTest.java  |   899 +-
 .../ambari/server/state/action/JobTest.java     |     2 +-
 .../alerts/AggregateAlertListenerTest.java      |     2 +-
 .../alerts/AlertDefinitionEqualityTest.java     |     2 +-
 .../state/alerts/AlertDefinitionHashTest.java   |    13 +-
 .../state/alerts/AlertEventPublisherTest.java   |    16 +-
 .../state/alerts/AlertReceivedListenerTest.java |     5 +-
 .../alerts/AlertStateChangedEventTest.java      |     6 +-
 .../state/alerts/InitialAlertEventTest.java     |    34 +-
 .../state/cluster/AlertDataManagerTest.java     |     2 +-
 .../state/cluster/ClusterDeadlockTest.java      |    23 +-
 .../cluster/ClusterEffectiveVersionTest.java    |   303 -
 .../server/state/cluster/ClusterImplTest.java   |    31 +-
 .../server/state/cluster/ClusterTest.java       |   948 +-
 .../state/cluster/ClustersDeadlockTest.java     |    18 +-
 .../server/state/cluster/ClustersImplTest.java  |     4 +-
 .../server/state/cluster/ClustersTest.java      |   132 +-
 .../ConcurrentServiceConfigVersionTest.java     |    17 +-
 ...omponentHostConcurrentWriteDeadlockTest.java |    28 +-
 .../ambari/server/state/host/HostImplTest.java  |     4 +-
 .../ambari/server/state/host/HostTest.java      |    18 +-
 .../state/kerberos/KerberosDescriptorTest.java  |     9 +
 .../KerberosDescriptorUpdateHelperTest.java     |    77 +-
 .../kerberos/KerberosServiceDescriptorTest.java |     2 +
 .../kerberos/VariableReplacementHelperTest.java |   128 +-
 .../quicklinksprofile/FilterEvaluatorTest.java  |     8 +-
 .../QuickLinkVisibilityControllerTest.java      |    40 +-
 .../state/repository/VersionDefinitionTest.java |   150 +-
 .../AlertNoticeDispatchServiceTest.java         |    27 +-
 .../services/CachedAlertFlushServiceTest.java   |     2 +-
 .../services/MetricsRetrievalServiceTest.java   |     2 +-
 .../services/RetryUpgradeActionServiceTest.java |    21 +-
 .../state/stack/ConfigUpgradePackTest.java      |     2 +-
 .../state/stack/ConfigUpgradeValidityTest.java  |     2 +-
 .../ambari/server/state/stack/OSFamilyTest.java |     2 +-
 .../state/stack/UpgradePackParsingTest.java     |     2 +-
 .../server/state/stack/UpgradePackTest.java     |     6 +-
 .../upgrade/RepositoryVersionHelperTest.java    |    29 +-
 .../stack/upgrade/StageWrapperBuilderTest.java  |    32 +-
 .../svccomphost/ServiceComponentHostTest.java   |   153 +-
 .../server/testing/DBInconsistencyTests.java    |     6 +-
 .../server/testing/DeadlockWarningThread.java   |     2 +-
 .../server/testing/DeadlockedThreadsTest.java   |     4 +-
 .../server/topology/AmbariContextTest.java      |   141 +-
 .../server/topology/BlueprintFactoryTest.java   |     4 +-
 .../server/topology/BlueprintImplTest.java      |    15 +-
 .../topology/BlueprintValidatorImplTest.java    |    22 +-
 .../ClusterConfigurationRequestTest.java        |   159 +-
 .../ClusterDeployWithStartOnlyTest.java         |    47 +-
 ...InstallWithoutStartOnComponentLevelTest.java |    51 +-
 .../ClusterInstallWithoutStartTest.java         |    51 +-
 .../topology/ClusterTopologyImplTest.java       |    12 +-
 .../topology/ConfigurationFactoryTest.java      |     2 +-
 .../server/topology/ConfigurationTest.java      |     2 +-
 .../topology/ConfigureClusterTaskTest.java      |    12 +-
 .../server/topology/HostGroupInfoTest.java      |     2 +-
 .../server/topology/LogicalRequestTest.java     |   169 +-
 .../topology/RequiredPasswordValidatorTest.java |    34 +-
 .../SecurityConfigurationFactoryTest.java       |     2 +-
 .../server/topology/SettingFactoryTest.java     |     2 +-
 .../ambari/server/topology/SettingTest.java     |    20 +-
 .../server/topology/TopologyManagerTest.java    |    78 +-
 .../validators/HiveServiceValidatorTest.java    |     6 +-
 .../RequiredConfigPropertiesValidatorTest.java  |   305 +
 .../StackConfigTypeValidatorTest.java           |     2 +-
 .../topology/validators/UnitValidatorTest.java  |   114 +
 .../upgrade/AbstractUpgradeCatalogTest.java     |     8 +-
 .../server/upgrade/StackUpgradeUtilTest.java    |   145 -
 .../server/upgrade/UpgradeCatalog200Test.java   |   923 -
 .../server/upgrade/UpgradeCatalog210Test.java   |  1349 -
 .../server/upgrade/UpgradeCatalog211Test.java   |   445 -
 .../server/upgrade/UpgradeCatalog2121Test.java  |   161 -
 .../server/upgrade/UpgradeCatalog212Test.java   |   687 -
 .../server/upgrade/UpgradeCatalog220Test.java   |  1633 -
 .../server/upgrade/UpgradeCatalog221Test.java   |   614 -
 .../server/upgrade/UpgradeCatalog222Test.java   |  1126 -
 .../server/upgrade/UpgradeCatalog230Test.java   |   317 -
 .../server/upgrade/UpgradeCatalog240Test.java   |  2654 -
 .../server/upgrade/UpgradeCatalog242Test.java   |   450 -
 .../server/upgrade/UpgradeCatalog250Test.java   |  2150 -
 .../server/upgrade/UpgradeCatalog251Test.java   |   102 +
 .../server/upgrade/UpgradeCatalog252Test.java   |   426 +
 .../server/upgrade/UpgradeCatalog260Test.java   |   623 +
 .../server/upgrade/UpgradeCatalog300Test.java   |   245 +-
 .../server/upgrade/UpgradeCatalogHelper.java    |    37 +-
 .../server/upgrade/UpgradeCatalogTest.java      |    13 +-
 .../ambari/server/upgrade/UpgradeTest.java      |     2 +-
 .../utils/CollectionPresentationUtils.java      |     2 +-
 .../ambari/server/utils/RequestUtilsTest.java   |     2 +-
 .../ambari/server/utils/SetUtilsTest.java       |     2 +-
 .../ambari/server/utils/StageUtilsTest.java     |   134 +-
 .../utils/SynchronousThreadPoolExecutor.java    |     4 +-
 .../ambari/server/utils/TestDateUtils.java      |     2 +-
 .../ambari/server/utils/TestHTTPUtils.java      |     2 +-
 .../ambari/server/utils/TestJsonUtils.java      |     2 +-
 .../ambari/server/utils/TestParallel.java       |     4 +-
 .../server/utils/TestShellCommandUtil.java      |     2 +-
 .../ambari/server/utils/TestVersionUtils.java   |     2 +-
 .../ambari/server/view/ClusterImplTest.java     |     4 +-
 .../ambari/server/view/DefaultMaskerTest.java   |     2 +-
 .../server/view/HttpImpersonatorImplTest.java   |     2 +-
 .../server/view/RemoteAmbariClusterTest.java    |     9 +-
 .../view/ViewAmbariStreamProviderTest.java      |     4 +-
 .../server/view/ViewArchiveUtilityTest.java     |     4 +-
 .../ambari/server/view/ViewClassLoaderTest.java |     2 +-
 .../ambari/server/view/ViewContextImplTest.java |     2 +-
 .../view/ViewDataMigrationContextImplTest.java  |     2 +-
 .../view/ViewDataMigrationUtilityTest.java      |     6 +-
 .../server/view/ViewDirectoryWatcherTest.java   |     2 +-
 .../ambari/server/view/ViewExtractorTest.java   |     2 +-
 .../view/ViewInstanceOperationHandlerTest.java  |   105 +
 .../ambari/server/view/ViewRegistryTest.java    |    71 +-
 .../view/ViewSubResourceDefinitionTest.java     |     2 +-
 .../view/ViewSubResourceProviderTest.java       |     6 +-
 .../server/view/ViewThrottleFilterTest.java     |     2 +-
 .../server/view/ViewURLStreamProviderTest.java  |     2 +-
 .../view/configuration/EntityConfigTest.java    |     2 +-
 .../view/configuration/InstanceConfigTest.java  |     2 +-
 .../view/configuration/ParameterConfigTest.java |     2 +-
 .../configuration/PermissionConfigTest.java     |     2 +-
 .../configuration/PersistenceConfigTest.java    |     2 +-
 .../view/configuration/PropertyConfigTest.java  |     2 +-
 .../view/configuration/ResourceConfigTest.java  |     2 +-
 .../view/configuration/ViewConfigTest.java      |     2 +-
 .../server/view/events/EventImplTest.java       |    10 +-
 .../InstanceValidationResultImplTest.java       |     4 +-
 .../validation/ValidationResultImplTest.java    |     4 +-
 .../src/test/python/TestAmbariServer.py         |   670 +-
 .../test/python/TestComponentVersionMapping.py  |    84 +
 ambari-server/src/test/python/TestConfigs.py    |    38 +-
 ambari-server/src/test/python/TestMpacks.py     |    19 +-
 .../src/test/python/TestResourceFilesKeeper.py  |    29 +-
 .../src/test/python/TestServerUpgrade.py        |    35 +-
 .../src/test/python/TestStackFeature.py         |   181 +-
 .../src/test/python/TestStackSelect.py          |   258 +
 .../src/test/python/TestUpgradeHelper.py        |  1028 -
 .../src/test/python/TestUpgradeSummary.py       |   137 +
 ambari-server/src/test/python/TestVersion.py    |    12 +
 .../src/test/python/TestVersionSelectUtil.py    |    18 +-
 .../HIVE/test_jdbc_driver_config.py             |    66 +
 .../LOGSEARCH/test_service_advisor.py           |   142 +
 .../RANGER/test_db_flavor_config.py             |    63 +
 .../RANGER_KMS/test_db_flavor_config.py         |    63 +
 .../SPARK/2.2.0/test_service_advisor.py         |   289 +
 .../SQOOP/test_jdbc_driver_config.py            |    63 +
 .../common-services/configs/hawq_default.json   |     6 +-
 .../common-services/configs/hive_default.json   |   650 +
 .../configs/hive_unsupported_jdbc_type.json     |   650 +
 .../configs/ranger_admin_default.json           |   386 +
 .../ranger_admin_unsupported_db_flavor.json     |   386 +
 .../configs/ranger_kms_default.json             |   802 +
 .../ranger_kms_unsupported_db_flavor.json       |   802 +
 .../common-services/configs/sqoop_default.json  |   879 +
 .../configs/sqoop_unsupported_jdbc_driver.json  |   879 +
 .../test/python/custom_actions/TestCheckHost.py |    33 +
 .../custom_actions/TestInstallPackages.py       |  1534 +-
 .../custom_actions/TestRemoveStackVersion.py    |    40 +-
 .../configs/install_packages_config.json        |    19 +-
 .../install_packages_repository_file.json       |   112 +
 .../python/custom_actions/test_ru_set_all.py    |   159 +-
 .../python/host_scripts/TestAlertDiskSpace.py   |    16 +-
 .../python/stacks/2.0.6/FLUME/test_flume.py     |    15 +-
 .../stacks/2.0.6/HBASE/test_hbase_client.py     |    20 +-
 .../stacks/2.0.6/HBASE/test_hbase_master.py     |   101 +-
 .../2.0.6/HBASE/test_hbase_regionserver.py      |    14 +-
 .../2.0.6/HBASE/test_phoenix_queryserver.py     |    31 +-
 .../python/stacks/2.0.6/HDFS/test_datanode.py   |    29 +-
 .../stacks/2.0.6/HDFS/test_hdfs_client.py       |    15 +-
 .../stacks/2.0.6/HDFS/test_journalnode.py       |    24 +-
 .../python/stacks/2.0.6/HDFS/test_namenode.py   |    39 +-
 .../python/stacks/2.0.6/HDFS/test_nfsgateway.py |    17 +-
 .../python/stacks/2.0.6/HDFS/test_snamenode.py  |    12 +-
 .../test/python/stacks/2.0.6/HDFS/test_zkfc.py  |    17 +-
 .../stacks/2.0.6/HIVE/test_hcat_client.py       |     3 +
 .../stacks/2.0.6/HIVE/test_hive_client.py       |    23 +-
 .../stacks/2.0.6/HIVE/test_hive_server.py       |    42 +-
 .../2.0.6/HIVE/test_hive_service_check.py       |    26 +-
 .../stacks/2.0.6/HIVE/test_webhcat_server.py    |    19 +-
 .../stacks/2.0.6/OOZIE/test_oozie_client.py     |    15 +-
 .../stacks/2.0.6/OOZIE/test_oozie_server.py     |   132 +-
 .../python/stacks/2.0.6/PIG/test_pig_client.py  |    20 +-
 .../python/stacks/2.0.6/SQOOP/test_sqoop.py     |    14 +-
 .../stacks/2.0.6/YARN/test_historyserver.py     |    37 +-
 .../stacks/2.0.6/YARN/test_mapreduce2_client.py |    25 +-
 .../stacks/2.0.6/YARN/test_nodemanager.py       |    26 +-
 .../stacks/2.0.6/YARN/test_resourcemanager.py   |   185 +-
 .../stacks/2.0.6/YARN/test_yarn_client.py       |    24 +-
 .../2.0.6/ZOOKEEPER/test_zookeeper_client.py    |    14 +-
 .../2.0.6/ZOOKEEPER/test_zookeeper_server.py    |    17 +-
 .../stacks/2.0.6/common/test_stack_advisor.py   |   159 +-
 .../stacks/2.0.6/configs/altfs_plus_hdfs.json   |     2 +-
 .../python/stacks/2.0.6/configs/default.json    |     8 +-
 .../2.0.6/configs/default_ams_embedded.json     |     2 +-
 .../2.0.6/configs/default_hive_nn_ha.json       |     2 +-
 .../2.0.6/configs/default_hive_nn_ha_2.json     |     2 +-
 .../2.0.6/configs/default_hive_non_hdfs.json    |     2 +-
 .../2.0.6/configs/default_no_install.json       |     2 +-
 .../2.0.6/configs/default_oozie_mysql.json      |     2 +-
 .../default_update_exclude_file_only.json       |     2 +-
 .../2.0.6/configs/default_with_bucket.json      |     2 +-
 .../default_yarn_include_file_dont_manage.json  |  1260 +
 .../default_yarn_include_file_manage.json       |  1260 +
 .../python/stacks/2.0.6/configs/flume_22.json   |     2 +-
 .../python/stacks/2.0.6/configs/flume_only.json |     2 +-
 .../configs/ha_bootstrap_standby_node.json      |     2 +-
 ...ha_bootstrap_standby_node_initial_start.json |     2 +-
 ...dby_node_initial_start_dfs_nameservices.json |     2 +-
 .../stacks/2.0.6/configs/hbase_no_phx.json      |     2 +-
 .../stacks/2.0.6/configs/hbase_with_phx.json    |    14 +-
 .../test/python/stacks/2.0.6/configs/nn_eu.json |    23 +-
 .../stacks/2.0.6/configs/nn_eu_standby.json     |    23 +-
 .../2.0.6/configs/oozie_existing_sqla.json      |     2 +-
 .../stacks/2.0.6/configs/repository_file.json   |  1275 +
 .../python/stacks/2.0.6/configs/secured.json    |  1210 +-
 .../secured_yarn_include_file_dont_manage.json  |  1078 +
 .../secured_yarn_include_file_manage.json       |  1078 +
 .../hooks/after-INSTALL/test_after_install.py   |    58 +-
 .../2.0.6/hooks/before-ANY/test_before_any.py   |   252 +-
 .../hooks/before-INSTALL/test_before_install.py |    40 +
 .../hooks/before-START/test_before_start.py     |     6 +-
 .../stacks/2.1/FALCON/test_falcon_client.py     |    19 +-
 .../stacks/2.1/FALCON/test_falcon_server.py     |    30 +-
 .../stacks/2.1/FALCON/test_service_check.py     |     5 +-
 .../stacks/2.1/HIVE/test_hive_metastore.py      |   106 +-
 .../stacks/2.1/STORM/test_storm_drpc_server.py  |    14 +-
 .../stacks/2.1/STORM/test_storm_nimbus.py       |    74 +-
 .../stacks/2.1/STORM/test_storm_nimbus_prod.py  |    14 +-
 .../stacks/2.1/STORM/test_storm_supervisor.py   |    14 +-
 .../2.1/STORM/test_storm_supervisor_prod.py     |    15 +-
 .../stacks/2.1/STORM/test_storm_ui_server.py    |    15 +-
 .../python/stacks/2.1/TEZ/test_tez_client.py    |    19 +-
 .../stacks/2.1/YARN/test_apptimelineserver.py   |    13 +-
 .../stacks/2.1/common/test_stack_advisor.py     |    28 +
 .../stacks/2.1/configs/default-storm-start.json |    14 +
 .../test/python/stacks/2.1/configs/default.json |    13 +
 .../2.1/configs/hive-metastore-upgrade.json     |    23 +-
 .../stacks/2.1/configs/secured-storm-start.json |    13 +
 .../test/python/stacks/2.1/configs/secured.json |    15 +-
 .../stacks/2.2/ACCUMULO/test_accumulo_client.py |    15 +-
 .../stacks/2.2/KAFKA/test_kafka_broker.py       |    15 +-
 .../stacks/2.2/KERBEROS/test_kerberos_client.py |    23 +
 .../python/stacks/2.2/KNOX/test_knox_gateway.py |    62 +-
 .../stacks/2.2/RANGER/test_ranger_admin.py      |    18 +-
 .../stacks/2.2/RANGER/test_ranger_usersync.py   |     9 -
 .../stacks/2.2/SLIDER/test_slider_client.py     |    21 +-
 .../stacks/2.2/SPARK/test_job_history_server.py |    13 +-
 .../stacks/2.2/SPARK/test_spark_client.py       |    13 +-
 .../2.2/SPARK/test_spark_service_check.py       |     8 +-
 .../stacks/2.2/common/test_conf_select.py       |    30 +-
 .../stacks/2.2/common/test_stack_advisor.py     |   232 +-
 .../python/stacks/2.2/configs/knox_upgrade.json |    23 +-
 .../stacks/2.3/ATLAS/test_metadata_server.py    |     6 +-
 .../stacks/2.3/MAHOUT/test_mahout_client.py     |    18 +-
 .../2.3/SPARK/test_spark_thrift_server.py       |    13 +-
 .../stacks/2.3/common/test_stack_advisor.py     |   145 +-
 .../test/python/stacks/2.3/configs/ats_1_5.json |     2 +-
 .../stacks/2.3/configs/storm_default.json       |     6 +-
 .../2.3/configs/storm_default_secure.json       |     6 +-
 .../stacks/2.4/AMBARI_INFRA/test_infra_solr.py  |     6 +
 .../stacks/2.4/LOGSEARCH/test_logsearch.py      |     2 +
 .../test/python/stacks/2.4/configs/default.json |     5 +-
 .../stacks/2.5/ATLAS/test_atlas_server.py       |     2 +-
 .../stacks/2.5/RANGER/test_ranger_admin.py      |    10 +
 .../stacks/2.5/RANGER_KMS/test_kms_server.py    |   121 +-
 .../2.5/ZEPPELIN/interpreter_json_generated.py  |    27 +
 .../stacks/2.5/ZEPPELIN/test_zeppelin_060.py    |   339 +
 .../stacks/2.5/ZEPPELIN/test_zeppelin_master.py |   330 -
 .../stacks/2.5/common/test_stack_advisor.py     |   924 +-
 .../test/python/stacks/2.5/configs/default.json |    53 +-
 .../python/stacks/2.5/configs/hsi_default.json  |     2 +-
 .../2.5/configs/hsi_default_for_restart.json    |     2 +-
 .../test/python/stacks/2.5/configs/hsi_ha.json  |     2 +-
 .../2.5/configs/ranger-admin-default.json       |   989 +-
 .../2.5/configs/ranger-admin-secured.json       |  1107 +-
 .../stacks/2.5/configs/ranger-kms-default.json  |  1157 +-
 .../stacks/2.5/configs/ranger-kms-secured.json  |  1321 +-
 .../test/python/stacks/2.5/configs/secured.json |    71 +-
 .../test/python/stacks/2.6/DRUID/test_druid.py  |    57 +-
 .../stacks/2.6/RANGER/test_ranger_admin.py      |    10 +
 .../2.6/ZEPPELIN/interpreter_json_generated.py  |    27 +
 .../stacks/2.6/ZEPPELIN/test_zeppelin_070.py    |   448 +
 .../stacks/2.6/common/test_stack_advisor.py     |   664 +-
 .../test/python/stacks/2.6/configs/default.json |    84 +-
 .../2.6/configs/ranger-admin-default.json       |   954 +-
 .../2.6/configs/ranger-admin-secured.json       |  1067 +-
 .../src/test/python/stacks/utils/RMFTestCase.py |   138 +-
 ambari-server/src/test/python/unitTests.py      |     2 +-
 .../PreconfigureActionTest_cluster_config.json  |   110 +
 ...ureActionTest_kerberos_descriptor_stack.json |   713 +
 ..._kerberos_descriptor_stack_preconfigure.json |   730 +
 .../src/test/resources/TestConfigs-content.xml  |    28 +
 .../resources/extensions/EXT/0.1/metainfo.xml   |     2 +-
 .../resources/extensions/EXT/0.2/metainfo.xml   |     3 +-
 .../resources/extensions/EXT/0.3/metainfo.xml   |    32 +
 .../EXT/0.3/services/OOZIE2/metainfo.xml        |   118 +
 .../services/OOZIE2/themes/broken_theme.json    |     3 +
 .../src/test/resources/hbase_version_test.xml   |     2 +
 .../test_kerberos_descriptor_ranger_kms.json    |   109 +
 .../src/test/resources/parent_quicklinks.json   |     1 +
 .../stacks/HDP/2.0.6.1/role_command_order.json  |   101 +-
 .../stacks/HDP/2.0.8/kerberos_preconfigure.json |    23 +
 .../HDP/2.0.8/services/HDFS/kerberos.json       |    12 +-
 .../upgrades/upgrade_execute_task_test.xml      |    42 +
 .../upgrades/upgrade_nonrolling_new_stack.xml   |     8 +-
 .../HDP/2.1.1/upgrades/upgrade_test_HDP-250.xml |   267 +
 .../HDP/2.1.1/upgrades/upgrade_test_checks.xml  |    15 +
 .../upgrade_test_force_config_change.xml        |   267 +
 .../2.1.1/upgrades/upgrade_test_nonrolling.xml  |     4 +-
 .../resources/stacks/HDP/2.2.0/repos/hdp.json   |     4 +
 .../stacks/HDP/2.2.0/repos/repoinfo.xml         |     8 +
 .../stacks/HDP/2.2.0/repos/version-2.2.0.5.xml  |    51 +
 .../HDP/2.2.0/upgrades/upgrade_test_checks.xml  |     2 +-
 .../resources/stacks/HDP/2.2.1/metainfo.xml     |    24 +
 .../resources/stacks/HDP/2.2.1/repos/hdp.json   |     7 +
 .../stacks/HDP/2.2.1/repos/repoinfo.xml         |    36 +
 .../HDP/2.2.1/services/RANGER/alerts.json       |    74 +
 .../resources/stacks/OTHER/1.0/widgets.json     |    95 +
 .../stacks_with_extensions/HDP/0.3/metainfo.xml |    22 +
 .../HDP/0.3/repos/repoinfo.xml                  |    63 +
 .../HDP/0.3/services/HBASE/metainfo.xml         |    26 +
 .../0.3/services/HDFS/configuration/global.xml  |   145 +
 .../services/HDFS/configuration/hadoop-env.xml  |   223 +
 .../services/HDFS/configuration/hbase-site.xml  |   137 +
 .../services/HDFS/configuration/hdfs-log4j.xml  |   199 +
 .../services/HDFS/configuration/hdfs-site.xml   |   396 +
 .../HDP/0.3/services/HDFS/metainfo.xml          |    30 +
 .../0.3/services/HDFS/package/dummy-script.py   |    20 +
 .../HDP/0.3/services/HIVE/metainfo.xml          |    26 +
 .../HDP/0.3/services/MAPREDUCE/metainfo.xml     |    23 +
 .../HDP/0.3/services/ZOOKEEPER/metainfo.xml     |    26 +
 .../resources/version_definition_test_maint.xml |    62 +
 .../version_definition_test_maint_partial.xml   |    54 +
 .../version_definition_test_patch_config.xml    |    55 +
 ambari-serviceadvisor/pom.xml                   |   124 +
 .../ambari/serviceadvisor/ServiceAdvisor.java   |   147 +
 .../ServiceAdvisorCommandType.java              |    63 +
 ambari-utility/checkstyle.xml                   |    38 +
 ambari-utility/pom.xml                          |   145 +
 .../src/main/java/category/AlertTest.java       |    27 +
 .../main/java/category/AmbariUpgradeTest.java   |    27 +
 .../src/main/java/category/BlueprintTest.java   |    27 +
 .../src/main/java/category/FastTest.java        |    27 +
 .../src/main/java/category/KerberosTest.java    |    27 +
 .../src/main/java/category/MetricsTest.java     |    27 +
 .../src/main/java/category/SlowTest.java        |    27 +
 .../main/java/category/StackUpgradeTest.java    |    27 +
 .../apache/ambari/annotations/ApiIgnore.java    |    29 +
 ...AvoidTransactionalOnPrivateMethodsCheck.java |    55 +
 .../UndocumentedRestApiOperationCheck.java      |    76 +
 .../ambari/swagger/AmbariSwaggerReader.java     |   222 +
 .../src/main/resources/checkstyle_packages.xml  |    15 +
 ...dTransactionalOnPrivateMethodsCheckTest.java |    49 +
 .../UndocumentedRestApiOperationCheckTest.java  |    53 +
 .../ambari/swagger/AmbariSwaggerReaderTest.java |   182 +
 .../src/test/resources/log4j.properties         |    19 +
 .../checkstyle/InputRestApiOperation.java       |   138 +
 .../InputTransactionalOnPrivateMethods.java     |    46 +
 ambari-views/examples/weather-view/pom.xml      |     2 +-
 ambari-web/api-docs/css/api-explorer.css        |  2423 +
 ambari-web/api-docs/css/index.css               | 17430 +++++
 ambari-web/api-docs/css/print.css               |  1167 +
 ambari-web/api-docs/css/reset.css               |   125 +
 ambari-web/api-docs/css/screen.css              |     9 +
 ambari-web/api-docs/css/standalone.css          |   293 +
 ambari-web/api-docs/css/typography.css          |    26 +
 .../api-docs/fonts/droid-sans-v6-latin-700.eot  |   Bin 0 -> 22922 bytes
 .../api-docs/fonts/droid-sans-v6-latin-700.svg  |   411 +
 .../api-docs/fonts/droid-sans-v6-latin-700.ttf  |   Bin 0 -> 40513 bytes
 .../api-docs/fonts/droid-sans-v6-latin-700.woff |   Bin 0 -> 25992 bytes
 .../fonts/droid-sans-v6-latin-700.woff2         |   Bin 0 -> 11480 bytes
 .../fonts/droid-sans-v6-latin-regular.eot       |   Bin 0 -> 22008 bytes
 .../fonts/droid-sans-v6-latin-regular.svg       |   403 +
 .../fonts/droid-sans-v6-latin-regular.ttf       |   Bin 0 -> 39069 bytes
 .../fonts/droid-sans-v6-latin-regular.woff      |   Bin 0 -> 24868 bytes
 .../fonts/droid-sans-v6-latin-regular.woff2     |   Bin 0 -> 11304 bytes
 ambari-web/api-docs/images/Swagger_explorer.png |   Bin 0 -> 108087 bytes
 .../api-docs/images/Swagger_explorer_min.png    |   Bin 0 -> 46646 bytes
 ambari-web/api-docs/images/explorer_icons.png   |   Bin 0 -> 5763 bytes
 ambari-web/api-docs/images/favicon-16x16.png    |   Bin 0 -> 645 bytes
 ambari-web/api-docs/images/favicon-32x32.png    |   Bin 0 -> 1654 bytes
 ambari-web/api-docs/images/favicon.ico          |   Bin 0 -> 5430 bytes
 .../api-docs/images/json_editor_integration.png |   Bin 0 -> 63019 bytes
 ambari-web/api-docs/images/logo_small.png       |   Bin 0 -> 770 bytes
 ambari-web/api-docs/images/pet_store_api.png    |   Bin 0 -> 824 bytes
 ambari-web/api-docs/images/senodio.png          |   Bin 0 -> 22838 bytes
 ambari-web/api-docs/images/throbber.gif         |   Bin 0 -> 9257 bytes
 ambari-web/api-docs/images/wordnik_api.png      |   Bin 0 -> 980 bytes
 ambari-web/api-docs/index.html                  |   241 +
 ambari-web/api-docs/lib/backbone-min.js         |    15 +
 ambari-web/api-docs/lib/bootstrap.min.js        |     6 +
 ambari-web/api-docs/lib/handlebars-2.0.0.js     |    28 +
 ambari-web/api-docs/lib/highlight.7.3.pack.js   |     1 +
 ambari-web/api-docs/lib/jquery-1.8.0.min.js     |     2 +
 ambari-web/api-docs/lib/jquery.ba-bbq.min.js    |    18 +
 ambari-web/api-docs/lib/jquery.slideto.min.js   |     1 +
 ambari-web/api-docs/lib/jquery.wiggle.min.js    |     8 +
 ambari-web/api-docs/lib/jsoneditor.js           |  7287 +++
 ambari-web/api-docs/lib/marked.js               |  1272 +
 ambari-web/api-docs/lib/swagger-oauth.js        |   286 +
 ambari-web/api-docs/lib/underscore-min.js       |     6 +
 ambari-web/api-docs/lib/underscore-min.map      |     1 +
 ambari-web/api-docs/o2c.html                    |    20 +
 ambari-web/api-docs/swagger-ui.js               | 22644 +++++++
 ambari-web/api-docs/swagger-ui.min.js           |    12 +
 ambari-web/app/app.js                           |    19 +-
 .../assets/data/stack_versions/upgrades.json    |    17 +-
 ambari-web/app/assets/test/tests.js             |     1 +
 ambari-web/app/config.js                        |    10 +-
 .../global/background_operations_controller.js  |     3 +
 .../controllers/global/cluster_controller.js    |     7 +-
 .../app/controllers/global/update_controller.js |     2 +-
 .../global/user_settings_controller.js          |     3 +
 .../global/wizard_watcher_controller.js         |     6 +-
 ambari-web/app/controllers/installer.js         |    77 +-
 .../journalNode/step1_controller.js             |     2 +-
 .../journalNode/step8_controller.js             |     2 +-
 .../progress_popup_controller.js                |    10 +-
 .../rangerAdmin/step4_controller.js             |     2 +-
 .../main/admin/stack_and_upgrade_controller.js  |   272 +-
 .../manage_alert_notifications_controller.js    |    35 +-
 .../app/controllers/main/host/add_controller.js |     3 -
 .../main/host/bulk_operations_controller.js     |    34 +-
 ambari-web/app/controllers/main/host/details.js |   351 +-
 ambari-web/app/controllers/main/service.js      |    13 +-
 .../controllers/main/service/add_controller.js  |     3 +
 .../controllers/main/service/info/summary.js    |     2 +-
 ambari-web/app/controllers/main/service/item.js |    26 +-
 .../service/manage_config_groups_controller.js  |   152 +-
 .../main/service/reassign/step1_controller.js   |    13 +-
 .../main/service/reassign/step3_controller.js   |     1 +
 .../main/service/reassign/step4_controller.js   |     8 +-
 .../main/service/reassign_controller.js         |     7 +-
 .../app/controllers/main/views_controller.js    |     4 +-
 ambari-web/app/controllers/wizard.js            |    59 +-
 .../app/controllers/wizard/step1_controller.js  |     2 +
 .../app/controllers/wizard/step2_controller.js  |     4 +-
 .../wizard/step7/assign_master_controller.js    |    23 +-
 .../app/controllers/wizard/step7_controller.js  |    81 +-
 .../app/controllers/wizard/step8_controller.js  |   279 +-
 .../app/controllers/wizard/step9_controller.js  |     2 +-
 .../configs/services/ambari_infra_properties.js |    31 +-
 .../configs/services/logsearch_properties.js    |    97 +-
 ambari-web/app/data/controller_route.js         |     2 +-
 .../configs/stack_config_properties_mapper.js   |    14 +-
 ambari-web/app/mappers/hosts_mapper.js          |    16 +-
 .../app/mappers/repository_version_mapper.js    |    23 +-
 ambari-web/app/mappers/service_mapper.js        |     6 +-
 .../app/mappers/service_metrics_mapper.js       |     3 +-
 ambari-web/app/mappers/stack_mapper.js          |     5 +-
 ambari-web/app/mappers/stack_service_mapper.js  |     1 +
 .../app/mappers/stack_upgrade_history_mapper.js |    11 +-
 ambari-web/app/mappers/stack_version_mapper.js  |     9 +-
 ambari-web/app/messages.js                      |   120 +-
 .../configs/config_recommendation_parser.js     |    29 +-
 ...onfig_with_override_recommendation_parser.js |     7 +-
 .../app/mixins/common/configs/configs_saver.js  |    53 +-
 .../mixins/common/configs/enhanced_configs.js   |    39 +-
 ambari-web/app/mixins/common/persist.js         |   166 -
 .../app/mixins/common/widgets/widget_mixin.js   |     5 +-
 .../main/host/details/actions/check_host.js     |     4 +-
 .../configs/component_actions_by_configs.js     |    10 +-
 .../main/service/configs/config_overridable.js  |     2 +
 .../mixins/wizard/assign_master_components.js   |    96 +-
 .../app/mixins/wizard/wizardHostsLoading.js     |     8 +-
 .../wizard/wizardProgressPageController.js      |    20 +-
 .../models/configs/objects/service_config.js    |     4 +-
 .../configs/objects/service_config_property.js  |     8 +
 ambari-web/app/models/host.js                   |     2 +
 ambari-web/app/models/operating_system.js       |     3 +-
 ambari-web/app/models/repository.js             |     4 +-
 ambari-web/app/models/service.js                |     1 +
 ambari-web/app/models/stack.js                  |     4 +-
 .../app/models/stack_service_component.js       |     3 +-
 .../models/stack_version/repository_version.js  |    18 +-
 .../app/models/stack_version/service_simple.js  |     4 +-
 .../stack_version/stack_upgrade_history.js      |     5 +-
 ambari-web/app/models/stack_version/version.js  |     2 +
 ambari-web/app/models/view_instance.js          |     6 +-
 ambari-web/app/routes/add_host_routes.js        |    38 +-
 ambari-web/app/routes/add_service_routes.js     |     3 +-
 ambari-web/app/routes/installer.js              |     5 +-
 ambari-web/app/routes/main.js                   |     4 +-
 ambari-web/app/routes/stack_upgrade_routes.js   |    15 +-
 ambari-web/app/styles/alerts.less               |    77 +-
 ambari-web/app/styles/application.less          |   158 +-
 ambari-web/app/styles/bootstrap_overrides.less  |    70 +-
 ambari-web/app/styles/common.less               |     1 +
 ambari-web/app/styles/config_history_flow.less  |     7 +-
 ambari-web/app/styles/dashboard.less            |   116 +-
 .../app/styles/enhanced_service_dashboard.less  |    79 +-
 ambari-web/app/styles/modal_popups.less         |    11 +
 ambari-web/app/styles/stack_versions.less       |   193 +-
 .../app/styles/theme/bootstrap-ambari.css       |    89 +-
 ambari-web/app/styles/top-nav.less              |     2 +-
 ambari-web/app/templates/common/breadcrumbs.hbs |     6 +-
 .../common/configs/overriddenProperty.hbs       |     4 +-
 .../templates/common/host_progress_popup.hbs    |    27 +-
 .../modal_popups/install_repo_confirmation.hbs  |    32 +
 .../revert_patch_upgrade_confirmation.hbs       |    48 +
 ambari-web/app/templates/common/progress.hbs    |     4 +
 .../templates/common/widget/gauge_widget.hbs    |    33 +-
 .../templates/common/widget/graph_widget.hbs    |    44 +-
 .../templates/common/widget/number_widget.hbs   |    33 +-
 .../templates/common/widget/template_widget.hbs |    35 +-
 ambari-web/app/templates/main.hbs               |     2 +-
 .../app/templates/main/admin/kerberos.hbs       |    34 +-
 .../stack_upgrade/stack_upgrade_wizard.hbs      |   180 +-
 .../main/admin/stack_upgrade/upgrade_group.hbs  |    18 +-
 .../admin/stack_upgrade/upgrade_history.hbs     |    53 +-
 .../admin/stack_upgrade/upgrade_options.hbs     |    47 +-
 .../admin/stack_upgrade/upgrade_version_box.hbs |    10 +-
 .../stack_upgrade/upgrade_version_column.hbs    |    39 +-
 .../main/admin/stack_upgrade/versions.hbs       |     2 +-
 ambari-web/app/templates/main/alerts.hbs        |    16 +-
 .../main/alerts/create_alert_notification.hbs   |    14 +
 ambari-web/app/templates/main/dashboard.hbs     |     2 +-
 .../main/dashboard/widgets/cluster_metrics.hbs  |    25 +-
 .../main/dashboard/widgets/hbase_links.hbs      |    15 +-
 .../main/dashboard/widgets/hdfs_links.hbs       |    17 +-
 .../main/dashboard/widgets/pie_chart.hbs        |    21 +-
 .../main/dashboard/widgets/simple_text.hbs      |    21 +-
 .../templates/main/dashboard/widgets/uptime.hbs |    16 +-
 .../main/dashboard/widgets/yarn_links.hbs       |    18 +-
 .../main/host/delete_hosts_result_popup.hbs     |     8 +-
 ambari-web/app/templates/main/host/details.hbs  |     3 +
 .../main/host/details/recoverHostErrorPopup.hbs |    23 +
 .../main/host/details/recoverHostPopup.hbs      |    22 +
 .../main/service/all_services_actions.hbs       |     6 +-
 .../app/templates/main/service/info/summary.hbs |    91 +-
 .../main/service/info/summary/base.hbs          |    13 +-
 .../service/info/summary/client_components.hbs  |    10 +-
 .../service/info/summary/master_components.hbs  |    26 +-
 .../service/info/summary/slave_components.hbs   |    12 +-
 ambari-web/app/templates/main/service/item.hbs  |    40 +-
 .../app/templates/main/service/menu_item.hbs    |    11 +-
 .../templates/main/service/services/hbase.hbs   |   128 +-
 .../templates/main/service/services/hdfs.hbs    |   270 +-
 .../templates/main/service/services/hive.hbs    |    13 +-
 .../templates/main/service/services/ranger.hbs  |    59 +-
 .../templates/main/service/services/storm.hbs   |   118 +-
 .../templates/main/service/services/yarn.hbs    |   194 +-
 .../app/templates/main/side-menu-item.hbs       |     6 +-
 ...ontrols_service_config_usergroup_with_id.hbs |    27 +
 ambari-web/app/templates/wizard/step1.hbs       |   326 +-
 ambari-web/app/templates/wizard/step2.hbs       |     5 +
 .../wizard/step3/step3_host_warnings_popup.hbs  |     4 +-
 ambari-web/app/templates/wizard/step4.hbs       |    16 +-
 ambari-web/app/templates/wizard/step6.hbs       |     2 +-
 ambari-web/app/templates/wizard/step8.hbs       |     5 +
 ambari-web/app/utils/ajax/ajax.js               |    86 +-
 ambari-web/app/utils/array_utils.js             |     6 +-
 .../app/utils/batch_scheduled_requests.js       |     2 +-
 ambari-web/app/utils/config.js                  |     5 +-
 ambari-web/app/utils/db.js                      |    18 +-
 ambari-web/app/utils/helper.js                  |    18 +-
 ambari-web/app/utils/host_progress_popup.js     |   123 +-
 ambari-web/app/utils/hosts.js                   |     5 +-
 ambari-web/app/utils/validator.js               |     8 +
 .../common/assign_master_components_view.js     |     4 +
 ambari-web/app/views/common/breadcrumbs_view.js |    24 +-
 ambari-web/app/views/common/chart/pie.js        |    10 +-
 .../views/common/configs/config_history_flow.js |     7 +-
 .../app/views/common/configs/controls_view.js   |     2 +-
 .../configs/overriddenPropertyRow_view.js       |     3 +
 .../configs/service_config_container_view.js    |     2 +-
 .../views/common/configs/service_config_view.js |     3 +-
 .../configs/service_configs_by_category_view.js |    22 +-
 .../widgets/slider_config_widget_view.js        |    17 +-
 ambari-web/app/views/common/controls_view.js    |    39 +
 .../views/common/helpers/status_icon_view.js    |     1 +
 .../common/host_progress_popup_body_view.js     |   312 +-
 .../app/views/common/quick_view_link_view.js    |    44 +-
 ambari-web/app/views/common/sort_view.js        |    26 +-
 .../views/common/widget/gauge_widget_view.js    |    14 +-
 ambari-web/app/views/loading.js                 |     2 +-
 ambari-web/app/views/main/admin.js              |    16 +-
 .../views/main/admin/kerberos/disable_view.js   |     3 +-
 .../main/admin/stack_upgrade/services_view.js   |     2 +-
 .../admin/stack_upgrade/upgrade_history_view.js |    59 +-
 .../stack_upgrade/upgrade_version_box_view.js   |   227 +-
 .../upgrade_version_column_view.js              |    73 +-
 .../admin/stack_upgrade/upgrade_wizard_view.js  |    25 +-
 .../main/admin/stack_upgrade/versions_view.js   |    20 +-
 .../app/views/main/alert_definitions_view.js    |    10 +-
 .../main/alerts/definition_details_view.js      |     2 +-
 .../views/main/dashboard/config_history_view.js |    25 +-
 ambari-web/app/views/main/dashboard/widgets.js  |     2 +-
 .../dashboard/widgets/cluster_metrics_widget.js |     3 -
 .../main/dashboard/widgets/pie_chart_widget.js  |    23 +-
 ambari-web/app/views/main/host.js               |    18 +-
 ambari-web/app/views/main/menu.js               |    30 +-
 .../app/views/main/service/info/summary.js      |    24 +
 ambari-web/app/views/main/service/item.js       |     8 +-
 ambari-web/app/views/main/service/menu.js       |     4 -
 .../views/main/service/reassign/step1_view.js   |    25 +-
 .../app/views/main/service/reassign_view.js     |     6 +-
 ambari-web/app/views/main/service/service.js    |    13 +-
 .../app/views/main/service/services/hbase.js    |     2 +-
 .../app/views/main/service/services/hdfs.js     |    19 +-
 .../app/views/main/service/services/yarn.js     |     3 +-
 ambari-web/app/views/wizard/step1_view.js       |     6 +-
 ambari-web/app/views/wizard/step2_view.js       |    21 +
 ambari-web/app/views/wizard/step4_view.js       |     7 +-
 .../views/wizard/step9/hostLogPopupBody_view.js |     2 +-
 ambari-web/brunch-config.js                     |     3 +-
 ambari-web/pom.xml                              |   721 +-
 ambari-web/test/app_test.js                     |    10 +-
 .../global/cluster_controller_test.js           |    21 +-
 .../global/wizard_watcher_controller_test.js    |     3 +-
 ambari-web/test/controllers/installer_test.js   |    12 -
 .../journalNode/step1_controller_test.js        |     4 +-
 .../progress_popup_controller_test.js           |     2 +
 .../admin/stack_and_upgrade_controller_test.js  |   295 +-
 ...anage_alert_notifications_controller_test.js |    38 +-
 .../main/host/add_controller_test.js            |    19 -
 .../test/controllers/main/host/details_test.js  |   123 +-
 .../main/service/add_controller_test.js         |    54 +-
 .../manage_config_groups_controller_test.js     |    89 +-
 .../service/reassign/step1_controller_test.js   |     2 +
 .../service/reassign/step4_controller_test.js   |    12 +-
 .../test/controllers/main/service_test.js       |     4 +-
 .../controllers/main/views_controller_test.js   |    14 +-
 .../test/controllers/wizard/step1_test.js       |     2 +
 .../test/controllers/wizard/step5_test.js       |    86 +-
 .../step7/assign_master_controller_test.js      |    63 +-
 .../test/controllers/wizard/step7_test.js       |    11 +
 .../test/controllers/wizard/step8_test.js       |   176 +-
 ambari-web/test/controllers/wizard_test.js      |    38 +-
 .../stack_upgrade_history_mapper_test.js        |    32 +-
 .../mixins/common/configs/configs_saver_test.js |    83 +-
 .../common/configs/enhanced_configs_test.js     |    61 +-
 .../test/mixins/common/widget_mixin_test.js     |     2 +
 .../component_actions_by_configs_test.js        |    10 +-
 .../service/configs/config_overridable_test.js  |     2 +
 .../configs/objects/service_config_test.js      |    14 +-
 ambari-web/test/models/view_instance_test.js    |     6 +-
 ambari-web/test/utils/config_test.js            |     2 +-
 ambari-web/test/utils/helper_test.js            |    10 +
 .../test/utils/host_progress_popup_test.js      |     7 +-
 ambari-web/test/utils/hosts_test.js             |     3 +-
 .../test/views/common/breadcrumbs_view_test.js  |    30 +-
 .../widgets/slider_config_widget_view_test.js   |    23 +-
 .../host_progress_popup_body_view_test.js       |   641 +-
 .../test/views/common/quick_link_view_test.js   |    52 +-
 ambari-web/test/views/common/sort_view_test.js  |    49 +-
 .../common/widget/gauge_widget_view_test.js     |     2 +-
 .../resourceManager/wizard_view_test.js         |    29 +-
 .../admin/stack_upgrade/services_view_test.js   |     1 +
 .../stack_upgrade/upgrade_history_view_test.js  |    88 +-
 .../upgrade_version_box_view_test.js            |   395 +-
 .../upgrade_version_column_view_test.js         |   187 +
 .../stack_upgrade/upgrade_wizard_view_test.js   |    20 +-
 .../admin/stack_upgrade/version_view_test.js    |   139 +-
 .../views/main/alert_definitions_view_test.js   |    71 +-
 .../main/alerts/definition_details_view_test.js |     2 +-
 .../main/dashboard/config_history_view_test.js  |     1 +
 .../test/views/main/dashboard/widgets_test.js   |     4 +-
 ambari-web/test/views/main/host_test.js         |     4 +-
 ambari-web/test/views/main/service/menu_test.js |    12 -
 .../views/main/service/reassign_view_test.js    |    25 +-
 ambari-web/test/views/wizard/step1_view_test.js |    50 +-
 .../vendor/scripts/theme/bootstrap-ambari.js    |    20 +-
 ambari-web/yarn.lock                            |    65 +-
 .../common-services/NIFI/1.0.0/kerberos.json    |     6 +-
 .../HDF/2.0/hooks/after-INSTALL/scripts/hook.py |     2 +-
 .../2.0/hooks/after-INSTALL/scripts/params.py   |     3 -
 .../scripts/shared_initialization.py            |    35 +-
 .../2.0/hooks/before-START/scripts/params.py    |     2 +
 .../scripts/shared_initialization.py            |    14 -
 .../HDF/2.0/properties/stack_features.json      |     6 -
 .../stacks/HDF/2.0/services/KAFKA/kerberos.json |     9 +-
 .../MICROSOFT_R_SERVER/8.0.5/kerberos.json      |     6 +-
 .../src/main/assemblies/odpi-ambari-mpack.xml   |     2 +-
 .../2.0/hooks/after-INSTALL/scripts/hook.py     |     2 +-
 .../2.0/hooks/after-INSTALL/scripts/params.py   |     3 -
 .../scripts/shared_initialization.py            |    31 +-
 .../scripts/shared_initialization.py            |    14 -
 .../stacks/ODPi/2.0/services/HIVE/kerberos.json |    18 +-
 .../HIVE/package/scripts/hive_metastore.py      |     7 +-
 .../HIVE/package/scripts/hive_server_upgrade.py |    21 +-
 .../HIVE/package/scripts/hive_service.py        |     2 +-
 .../HIVE/package/scripts/params_linux.py        |    11 +-
 .../services/YARN/configuration/yarn-site.xml   |     6 +
 .../stacks/ODPi/2.0/services/YARN/kerberos.json |    30 +-
 .../YARN/package/scripts/params_linux.py        |    14 +-
 .../YARN/package/scripts/params_windows.py      |    10 +-
 .../YARN/package/scripts/resourcemanager.py     |    18 +-
 .../2.0/services/YARN/package/scripts/yarn.py   |    16 +-
 .../package/templates/include_hosts_list.j2     |    21 +
 .../stacks/ODPi/2.0/services/stack_advisor.py   |     9 +-
 contrib/version-builder/example.py              |     1 +
 contrib/version-builder/example.sh              |     3 +-
 contrib/version-builder/version_builder.py      |    17 +-
 contrib/views/capacity-scheduler/pom.xml        |    32 +-
 .../src/main/resources/ui/yarn.lock             |  1374 +
 .../view/commons/hdfs/FileOperationService.java |    41 +-
 .../addon/components/directory-viewer.js        |   324 +-
 .../hdfs-directory-viewer/addon/styles/app.css  |   190 +
 .../templates/components/directory-viewer.hbs   |   145 +
 .../addon/utils/viewer-config.js                |     4 +
 .../ui/hdfs-directory-viewer/bower.json         |     1 -
 .../resources/ui/hdfs-directory-viewer/index.js |     3 -
 .../ui/hdfs-directory-viewer/package.json       |     5 +-
 contrib/views/files/pom.xml                     |    18 +-
 .../view/filebrowser/DownloadService.java       |    13 +-
 .../resources/ui/app/components/file-search.js  |    10 +-
 .../main/resources/ui/app/controllers/files.js  |    20 +-
 .../src/main/resources/ui/app/routes/files.js   |    16 +-
 .../ui/app/templates/components/file-row.hbs    |     2 +-
 .../ui/app/templates/components/file-search.hbs |     2 +-
 .../main/resources/ui/app/templates/files.hbs   |     8 +-
 .../files/src/main/resources/ui/package.json    |     2 +-
 .../views/files/src/main/resources/ui/yarn.lock |  6041 ++
 .../view/filebrowser/FilebrowserTest.java       |     4 +-
 contrib/views/hawq/pom.xml                      |    22 +-
 .../views/hawq/src/main/resources/ui/yarn.lock  |  6665 ++
 contrib/views/hive-next/pom.xml                 |    22 +-
 .../ambari/view/hive2/actor/DeathWatch.java     |     5 +-
 .../ambari/view/hive2/actor/HiveActor.java      |    32 +-
 .../ambari/view/hive2/actor/JdbcConnector.java  |     8 +-
 .../view/hive2/actor/OperationController.java   |     2 +-
 .../view/hive2/client/NonPersistentCursor.java  |     4 +-
 .../view/hive2/resources/files/FileService.java |     8 +-
 .../view/hive2/resources/jobs/JobService.java   |     9 +-
 .../hive2/resources/uploads/UploadService.java  |     4 +-
 .../src/main/resources/ui/hive-web/Brocfile.js  |     1 +
 .../ui/hive-web/app/controllers/index.js        |     2 +-
 .../resources/ui/hive-web/app/routes/splash.js  |     2 +-
 .../src/main/resources/ui/hive-web/bower.json   |     3 +-
 .../src/main/resources/ui/hive-web/package.json |     9 +-
 .../ui/hive-web/vendor/browser-pollyfills.js    |   213 +
 .../src/main/resources/ui/hive-web/yarn.lock    |  5066 ++
 contrib/views/hive20/pom.xml                    |    22 +-
 .../ambari/view/hive20/actor/DeathWatch.java    |     7 +-
 .../ambari/view/hive20/actor/HiveActor.java     |    32 +-
 .../ambari/view/hive20/actor/JdbcConnector.java |     6 -
 .../view/hive20/actor/OperationController.java  |     2 +-
 .../view/hive20/client/NonPersistentCursor.java |     4 +-
 .../view/hive20/internal/dto/TableStats.java    |    24 +-
 .../internal/parsers/TableMetaParserImpl.java   |     8 +-
 .../generators/InsertFromQueryGenerator.java    |    41 +-
 .../view/hive20/resources/jobs/JobService.java  |    16 +-
 .../resources/system/ranger/RangerService.java  |    26 +-
 .../uploads/query/InsertFromQueryInput.java     |    24 +-
 .../src/main/resources/ui/app/adapters/job.js   |     2 +-
 .../resources/ui/app/components/create-table.js |    32 +-
 .../resources/ui/app/components/jobs-browser.js |    18 +-
 .../resources/ui/app/components/setting-list.js |     9 +
 .../resources/ui/app/components/udf-item.js     |     1 +
 .../ui/app/controllers/savedqueries.js          |    24 +
 .../main/resources/ui/app/controllers/udfs.js   |     2 +
 .../main/resources/ui/app/models/worksheet.js   |     1 +
 .../databases/database/tables/upload-table.js   |    16 +-
 .../resources/ui/app/routes/queries/query.js    |    15 +-
 .../ui/app/routes/queries/query/results.js      |     6 +-
 .../resources/ui/app/routes/savedqueries.js     |    11 +-
 .../src/main/resources/ui/app/routes/udfs.js    |    10 +-
 .../resources/ui/app/services/auto-refresh.js   |     1 +
 .../src/main/resources/ui/app/styles/app.scss   |    32 +-
 .../app/templates/components/create-table.hbs   |     4 +-
 .../ui/app/templates/components/edit-table.hbs  |     5 -
 .../app/templates/components/jobs-browser.hbs   |    42 +-
 .../components/notification-message.hbs         |     2 +-
 .../templates/components/query-result-table.hbs |    92 +-
 .../app/templates/components/setting-list.hbs   |     8 +-
 .../templates/components/table-rename-form.hbs  |     2 +-
 .../templates/components/table-statistics.hbs   |    12 +-
 .../ui/app/templates/components/udf-edit.hbs    |    66 +-
 .../ui/app/templates/components/udf-item.hbs    |    10 +-
 .../ui/app/templates/components/udf-new.hbs     |    97 +-
 .../app/templates/components/visual-explain.hbs |     7 +-
 .../resources/ui/app/templates/databases.hbs    |     2 +-
 .../ui/app/templates/queries/query.hbs          |    26 +-
 .../ui/app/templates/queries/query/log.hbs      |    12 +-
 .../ui/app/templates/queries/query/results.hbs  |     9 +-
 .../resources/ui/app/templates/savedqueries.hbs |    82 +-
 .../main/resources/ui/app/templates/udfs.hbs    |    49 +-
 .../ui/app/utils/hive-explainer/processor.js    |    13 +-
 .../ui/app/utils/hive-explainer/renderer.js     |   226 +-
 .../ui/app/utils/hive-explainer/transformer.js  |    11 +-
 .../src/main/resources/ui/ember-cli-build.js    |     1 +
 .../hive20/src/main/resources/ui/package.json   |     3 +-
 .../resources/ui/vendor/browser-pollyfills.js   |   213 +
 .../hive20/src/main/resources/ui/yarn.lock      |  6032 ++
 contrib/views/hueambarimigration/pom.xml        |    18 +-
 .../ui/hueambarimigration-view/package.json     |     2 +-
 .../ui/hueambarimigration-view/yarn.lock        |  5553 ++
 contrib/views/jobs/pom.xml                      |    18 +-
 .../views/jobs/src/main/resources/ui/yarn.lock  |  2537 +
 contrib/views/pig/pom.xml                       |    24 +-
 .../pig/src/main/resources/ui/pig-web/yarn.lock |  2376 +
 contrib/views/pom.xml                           |     2 +-
 contrib/views/slider/docs/index.md              |   164 -
 contrib/views/slider/gzip-content.cmd           |    17 -
 contrib/views/slider/gzip-content.ps1           |    81 -
 contrib/views/slider/pom.xml                    |   463 -
 .../apache/ambari/view/slider/AlertField.java   |    62 -
 .../apache/ambari/view/slider/AlertState.java   |    40 -
 .../ambari/view/slider/MetricsHolder.java       |    44 -
 .../apache/ambari/view/slider/SliderApp.java    |   198 -
 .../ambari/view/slider/SliderAppComponent.java  |    62 -
 .../ambari/view/slider/SliderAppType.java       |   107 -
 .../view/slider/SliderAppTypeComponent.java     |   103 -
 .../slider/SliderAppTypesResourceProvider.java  |    94 -
 .../ambari/view/slider/SliderAppsAlerts.java    |   127 -
 .../view/slider/SliderAppsConfiguration.java    |    52 -
 .../view/slider/SliderAppsResourceProvider.java |   124 -
 .../view/slider/SliderAppsViewController.java   |   112 -
 .../slider/SliderAppsViewControllerImpl.java    |  1510 -
 .../apache/ambari/view/slider/TemporalInfo.java |    48 -
 .../apache/ambari/view/slider/ViewStatus.java   |    72 -
 .../view/slider/clients/AmbariClient.java       |    58 -
 .../view/slider/clients/AmbariCluster.java      |    52 -
 .../view/slider/clients/AmbariClusterInfo.java  |    40 -
 .../slider/clients/AmbariHostComponent.java     |    49 -
 .../view/slider/clients/AmbariHostInfo.java     |    32 -
 .../view/slider/clients/AmbariService.java      |    36 -
 .../view/slider/clients/AmbariServiceInfo.java  |    51 -
 .../slider/rest/SliderAppTypesResource.java     |    54 -
 .../view/slider/rest/SliderAppsResource.java    |   163 -
 .../view/slider/rest/ViewStatusResource.java    |    40 -
 .../slider/rest/client/AmbariHttpClient.java    |   233 -
 .../view/slider/rest/client/BaseHttpClient.java |   157 -
 .../slider/rest/client/JMXMetricHolder.java     |    50 -
 .../ambari/view/slider/rest/client/Metric.java  |   158 -
 .../slider/rest/client/SliderAppJmxHelper.java  |   205 -
 .../rest/client/SliderAppMasterClient.java      |   324 -
 .../rest/client/SliderAppMetricsHelper.java     |   159 -
 .../view/slider/rest/client/TimelineMetric.java |   172 -
 .../slider/rest/client/TimelineMetrics.java     |   101 -
 .../rest/client/URLStreamProviderBasicAuth.java |   105 -
 .../slider/src/main/resources/slider.properties |    19 -
 .../slider/src/main/resources/ui/.gitignore     |    31 -
 .../views/slider/src/main/resources/ui/LICENSE  |    21 -
 .../slider/src/main/resources/ui/README.md      |   122 -
 .../src/main/resources/ui/app/assets/404.html   |   175 -
 .../app/assets/apple-touch-icon-precomposed.png |   Bin 1226 -> 0 bytes
 .../resources/ui/app/assets/crossdomain.xml     |    31 -
 .../resources/ui/app/assets/data/apps/apps.json |  1320 -
 .../ui/app/assets/data/apptypes/all_fields.json |   642 -
 .../ui/app/assets/data/metrics/metric.json      |   946 -
 .../ui/app/assets/data/metrics/metric2.json     |  3838 --
 .../ui/app/assets/data/metrics/metric3.json     |  1856 -
 .../ui/app/assets/data/metrics/metric4.json     |   968 -
 .../ui/app/assets/data/resource/empty_json.json |     1 -
 .../data/resource/slider-properties-2.json      |     9 -
 .../assets/data/resource/slider-properties.json |   148 -
 .../app/assets/data/resource/status_false.json  |     8 -
 .../app/assets/data/resource/status_true.json   |     5 -
 .../main/resources/ui/app/assets/favicon.ico    |   Bin 766 -> 0 bytes
 .../ui/app/assets/font/fontawesome-webfont.eot  |   Bin 37405 -> 0 bytes
 .../ui/app/assets/font/fontawesome-webfont.svg  |   399 -
 .../ui/app/assets/font/fontawesome-webfont.ttf  |   Bin 79076 -> 0 bytes
 .../ui/app/assets/font/fontawesome-webfont.woff |   Bin 43572 -> 0 bytes
 .../resources/ui/app/assets/images/.gitkeep     |     0
 .../ui-bg_flat_0_aaaaaa_40x100.png              |   Bin 180 -> 0 bytes
 .../ui-bg_glass_55_fbf9ee_1x400.png             |   Bin 120 -> 0 bytes
 .../ui-bg_glass_65_ffffff_1x400.png             |   Bin 105 -> 0 bytes
 .../ui-bg_glass_75_dadada_1x400.png             |   Bin 111 -> 0 bytes
 .../ui-bg_glass_75_e6e6e6_1x400.png             |   Bin 110 -> 0 bytes
 .../ui-bg_glass_75_ffffff_1x400.png             |   Bin 107 -> 0 bytes
 .../ui-bg_highlight-soft_75_cccccc_1x100.png    |   Bin 101 -> 0 bytes
 .../ui-bg_inset-soft_95_fef1ec_1x100.png        |   Bin 123 -> 0 bytes
 .../ui-icons_222222_256x240.png                 |   Bin 4369 -> 0 bytes
 .../ui-icons_2e83ff_256x240.png                 |   Bin 4369 -> 0 bytes
 .../ui-icons_454545_256x240.png                 |   Bin 4369 -> 0 bytes
 .../ui-icons_888888_256x240.png                 |   Bin 4369 -> 0 bytes
 .../ui-icons_cd0a0a_256x240.png                 |   Bin 4369 -> 0 bytes
 .../ui-icons_f6cf3b_256x240.png                 |   Bin 8884 -> 0 bytes
 .../src/main/resources/ui/app/assets/index.html |    46 -
 .../ui/app/assets/javascripts/ember-qunit.js    |   266 -
 .../ui/app/assets/javascripts/jquery.mockjax.js |   692 -
 .../assets/javascripts/modernizr-2.6.2.min.js   |     4 -
 .../ui/app/assets/javascripts/qunit.js          |  2495 -
 .../ui/app/assets/javascripts/sinon-1.13.0.js   |  5830 --
 .../app/assets/javascripts/sinon-qunit-1.0.0.js |    62 -
 .../ui/app/assets/javascripts/tests.js          |    29 -
 .../ui/app/assets/stylesheets/qunit.css         |   237 -
 .../src/main/resources/ui/app/assets/tests.html |    46 -
 .../main/resources/ui/app/components/.gitkeep   |     0
 .../ui/app/components/configSection.js          |   164 -
 .../src/main/resources/ui/app/config/app.js     |    27 -
 .../src/main/resources/ui/app/config/env.js     |    33 -
 .../src/main/resources/ui/app/config/router.js  |    35 -
 .../src/main/resources/ui/app/config/store.js   |    23 -
 .../main/resources/ui/app/controllers/.gitkeep  |     0
 .../app/controllers/application_controller.js   |    27 -
 .../createAppWizard/step1_controller.js         |   251 -
 .../createAppWizard/step2_controller.js         |   136 -
 .../createAppWizard/step3_controller.js         |   250 -
 .../createAppWizard/step4_controller.js         |   176 -
 .../controllers/create_app_wizard_controller.js |   122 -
 .../slider_app/summary_controller.js            |    27 -
 .../ui/app/controllers/slider_app_controller.js |   472 -
 .../app/controllers/slider_apps_controller.js   |    35 -
 .../ui/app/controllers/slider_controller.js     |   138 -
 .../ui/app/controllers/tooltip_controller.js    |    19 -
 .../src/main/resources/ui/app/helpers/.gitkeep  |     0
 .../src/main/resources/ui/app/helpers/ajax.js   |   388 -
 .../src/main/resources/ui/app/helpers/helper.js |   169 -
 .../resources/ui/app/helpers/string_utils.js    |   163 -
 .../src/main/resources/ui/app/initialize.js     |   171 -
 .../ui/app/mappers/application_type.js          |   162 -
 .../src/main/resources/ui/app/mappers/mapper.js |    56 -
 .../ui/app/mappers/slider_apps_mapper.js        |   292 -
 .../ui/app/mixins/ajax_error_handler.js         |    82 -
 .../resources/ui/app/mixins/run_periodically.js |   109 -
 .../main/resources/ui/app/mixins/with_panels.js |    53 -
 .../src/main/resources/ui/app/models/.gitkeep   |     0
 .../resources/ui/app/models/config_property.js  |    47 -
 .../src/main/resources/ui/app/models/host.js    |    33 -
 .../main/resources/ui/app/models/slider_app.js  |   207 -
 .../resources/ui/app/models/slider_app_alert.js |   149 -
 .../ui/app/models/slider_app_component.js       |    65 -
 .../resources/ui/app/models/slider_app_type.js  |    64 -
 .../ui/app/models/slider_app_type_component.js  |    63 -
 .../resources/ui/app/models/slider_config.js    |    45 -
 .../ui/app/models/slider_quick_link.js          |    33 -
 .../resources/ui/app/models/typed_property.js   |    38 -
 .../ui/app/routes/create_app_wizard.js          |    54 -
 .../src/main/resources/ui/app/routes/main.js    |    75 -
 .../src/main/resources/ui/app/styles/app.less   |   303 -
 .../resources/ui/app/styles/application.less    |    23 -
 .../resources/ui/app/styles/application.styl    |    18 -
 .../resources/ui/app/styles/apps-table.less     |   320 -
 .../main/resources/ui/app/styles/common.less    |   109 -
 .../resources/ui/app/styles/old-bootstrap.less  |   164 -
 .../main/resources/ui/app/styles/wizard.less    |   232 -
 .../resources/ui/app/templates/application.hbs  |    56 -
 .../ui/app/templates/common/ajax_error.hbs      |    24 -
 .../ui/app/templates/common/app_tooltip.hbs     |    24 -
 .../resources/ui/app/templates/common/chart.hbs |    26 -
 .../ui/app/templates/common/config.hbs          |    37 -
 .../ui/app/templates/components/.gitkeep        |     0
 .../app/templates/components/configSection.hbs  |    78 -
 .../ui/app/templates/createAppWizard.hbs        |    43 -
 .../ui/app/templates/createAppWizard/step1.hbs  |   192 -
 .../ui/app/templates/createAppWizard/step2.hbs  |    62 -
 .../ui/app/templates/createAppWizard/step3.hbs  |    37 -
 .../ui/app/templates/createAppWizard/step4.hbs  |    41 -
 .../main/resources/ui/app/templates/index.hbs   |    21 -
 .../resources/ui/app/templates/slider_app.hbs   |    70 -
 .../ui/app/templates/slider_app/configs.hbs     |    40 -
 .../slider_app/destroy/destroy_popup.hbs        |    20 -
 .../slider_app/destroy/destroy_popup_footer.hbs |    28 -
 .../ui/app/templates/slider_app/flex_popup.hbs  |    40 -
 .../ui/app/templates/slider_app/summary.hbs     |   135 -
 .../resources/ui/app/templates/slider_apps.hbs  |    87 -
 .../ui/app/templates/slider_title_tooltip.hbs   |    27 -
 .../ui/app/templates/unavailable_apps.hbs       |    22 -
 .../src/main/resources/ui/app/translations.js   |   169 -
 .../src/main/resources/ui/app/views/.gitkeep    |     0
 .../resources/ui/app/views/application_view.js  |    70 -
 .../resources/ui/app/views/common/chart_view.js |   914 -
 .../ui/app/views/common/config_set_view.js      |    57 -
 .../ui/app/views/common/filter_view.js          |   370 -
 .../resources/ui/app/views/common/sort_view.js  |   206 -
 .../resources/ui/app/views/common/table_view.js |   418 -
 .../ui/app/views/createAppWizard/step1_view.js  |    47 -
 .../ui/app/views/createAppWizard/step2_view.js  |    33 -
 .../ui/app/views/createAppWizard/step3_view.js  |    25 -
 .../ui/app/views/createAppWizard/step4_view.js  |    24 -
 .../ui/app/views/create_app_wizard_view.js      |    80 -
 .../ui/app/views/slider_app/configs_view.js     |    57 -
 .../slider_app/destroy_modal_footer_view.js     |    41 -
 .../app/views/slider_app/destroy_popup_view.js  |    37 -
 .../views/slider_app/metrics/app_metric_view.js |    77 -
 .../views/slider_app/metrics/metric2_view.js    |    63 -
 .../views/slider_app/metrics/metric3_view.js    |    61 -
 .../views/slider_app/metrics/metric4_view.js    |    54 -
 .../app/views/slider_app/metrics/metric_view.js |    70 -
 .../ui/app/views/slider_app/summary_view.js     |   141 -
 .../resources/ui/app/views/slider_app_view.js   |    30 -
 .../resources/ui/app/views/slider_apps_view.js  |   175 -
 .../slider/src/main/resources/ui/config.js      |   123 -
 .../main/resources/ui/envs/development/env.js   |    21 -
 .../main/resources/ui/envs/production/env.js    |    21 -
 .../arraycontroller/arraycontroller.js.hbs      |    23 -
 .../generators/arraycontroller/generator.json   |    10 -
 .../ui/generators/component/component.hbs.hbs   |    19 -
 .../ui/generators/component/component.js.hbs    |    23 -
 .../ui/generators/component/generator.json      |    14 -
 .../ui/generators/controller/controller.js.hbs  |    23 -
 .../ui/generators/controller/generator.json     |    10 -
 .../ui/generators/helper/generator.json         |    10 -
 .../ui/generators/helper/helper.js.hbs          |    24 -
 .../ui/generators/model/generator.json          |    10 -
 .../resources/ui/generators/model/model.js.hbs  |    24 -
 .../ui/generators/route/generator.json          |    10 -
 .../resources/ui/generators/route/route.js.hbs  |    25 -
 .../ui/generators/template/generator.json       |    10 -
 .../ui/generators/template/template.hbs.hbs     |    19 -
 .../resources/ui/generators/view/generator.json |    10 -
 .../resources/ui/generators/view/view.js.hbs    |    23 -
 .../slider/src/main/resources/ui/karma.conf.js  |    94 -
 .../slider/src/main/resources/ui/package.json   |    37 -
 .../slider/src/main/resources/ui/runner.js      |   136 -
 .../views/slider/src/main/resources/ui/setup.js |    78 -
 .../slider/src/main/resources/ui/test/index.md  |    28 -
 .../ui/test/integration/pages/index_test.js     |   127 -
 .../integration/pages/slider_errors_test.js     |    63 -
 .../processes/create_new_app_test.js            |   358 -
 .../createAppWizard/step1_controller_test.js    |   431 -
 .../createAppWizard/step2_controller_test.js    |   403 -
 .../createAppWizard/step3_controller_test.js    |   421 -
 .../createAppWizard/step4_controller_test.js    |   440 -
 .../create_app_wizard_controller_test.js        |   201 -
 .../slider_app/summary_controller_test.js       |    36 -
 .../controllers/slider_app_controller_test.js   |   607 -
 .../controllers/slider_apps_controller_test.js  |    58 -
 .../unit/controllers/slider_controller_test.js  |   140 -
 .../unit/mappers/slider_apps_mapper_test.js     |    85 -
 .../unit/models/slider_app_component_test.js    |    51 -
 .../ui/test/unit/models/slider_app_test.js      |    95 -
 .../test/unit/views/common/table_view_test.js   |    35 -
 .../unit/views/slider_app/summary_view_test.js  |    68 -
 .../ui/vendor/scripts/common/bootstrap.js       |  1951 -
 .../ui/vendor/scripts/common/bs-basic.min.js    |     1 -
 .../ui/vendor/scripts/common/bs-button.min.js   |     1 -
 .../ui/vendor/scripts/common/bs-core.min.js     |     1 -
 .../ui/vendor/scripts/common/bs-modal.min.js    |     1 -
 .../ui/vendor/scripts/common/bs-nav.min.js      |     1 -
 .../ui/vendor/scripts/common/bs-popover.min.js  |     1 -
 .../vendor/scripts/common/console-polyfill.js   |    13 -
 .../ui/vendor/scripts/common/cubism.v1.js       |  1085 -
 .../resources/ui/vendor/scripts/common/d3.v2.js |  7033 ---
 .../vendor/scripts/common/ember-i18n-1.4.1.js   |   199 -
 .../ui/vendor/scripts/common/handlebars.js      |  2746 -
 .../ui/vendor/scripts/common/jquery.js          |  8829 ---
 .../ui/vendor/scripts/common/jquery.timeago.js  |   214 -
 .../ui/vendor/scripts/common/jquery.ui.core.js  |   334 -
 .../ui/vendor/scripts/common/jquery.ui.mouse.js |   175 -
 .../vendor/scripts/common/jquery.ui.sortable.js |  1088 -
 .../vendor/scripts/common/jquery.ui.widget.js   |   276 -
 .../ui/vendor/scripts/common/moment.min.js      |     7 -
 .../ui/vendor/scripts/common/rickshaw.js        |  2659 -
 .../resources/ui/vendor/scripts/common/tv4.js   |  1605 -
 .../ui/vendor/scripts/development/ember-data.js | 10620 ----
 .../ui/vendor/scripts/development/ember.js      | 43235 -------------
 .../ui/vendor/scripts/production/ember-data.js  | 10626 ----
 .../ui/vendor/scripts/production/ember.js       | 41620 ------------
 .../resources/ui/vendor/styles/bootstrap.css    |  5785 --
 .../main/resources/ui/vendor/styles/cubism.css  |    82 -
 .../ui/vendor/styles/font-awesome-ie7.css       |  1203 -
 .../resources/ui/vendor/styles/font-awesome.css |  1479 -
 .../jquery-ui-1.8.16.custom.css                 |  1320 -
 .../resources/ui/vendor/styles/rickshaw.css     |   307 -
 .../src/main/resources/view.log4j.properties    |    27 -
 .../views/slider/src/main/resources/view.xml    |    82 -
 .../ambari/view/slider/SliderClientTest.java    |    31 -
 .../rest/client/SliderAppMasterClientTest.java  |   177 -
 .../org/apache/ambari/storm/ProxyServlet.java   |    12 +-
 .../ambari/storm/StormDetailsServlet.java       |    81 +
 .../storm/src/main/resources/WEB-INF/web.xml    |     8 +
 .../resources/scripts/components/SearchLogs.jsx |    38 +-
 .../src/main/resources/scripts/router/Router.js |     6 +-
 .../src/main/resources/scripts/utils/Utils.js   |    25 -
 contrib/views/storm/src/main/resources/view.xml |     8 +-
 contrib/views/tez/pom.xml                       |     3 +-
 .../view/utils/hdfs/ConfigurationBuilder.java   |     3 +-
 .../ambari/view/utils/hdfs/DirListInfo.java     |    97 +
 .../ambari/view/utils/hdfs/DirStatus.java       |    75 +
 .../apache/ambari/view/utils/hdfs/HdfsApi.java  |   124 +-
 .../ambari/view/utils/hdfs/HdfsApiTest.java     |   201 +
 contrib/views/wfmanager/pom.xml                 |    19 +-
 .../ui/app/components/distcp-action.js          |    15 +-
 .../resources/ui/app/components/drafts-wf.js    |     3 +-
 .../ui/app/components/flow-designer.js          |    28 +-
 .../resources/ui/app/components/hdfs-browser.js |     8 +-
 .../ui/app/components/recent-projects.js        |    11 +-
 .../ui/app/components/search-create-new-bar.js  |    21 +-
 .../ui/app/domain/actionjob_hanlder.js          |     3 +
 .../ui/app/domain/jsplumb-flow-renderer.js      |   194 -
 .../resources/ui/app/domain/layout-manager1.js  |    88 -
 .../resources/ui/app/domain/layout-manager2.js  |    87 -
 .../ui/app/domain/workflow-xml-generator.js     |     3 +
 .../ui/app/services/workspace-manager.js        |     5 +
 .../src/main/resources/ui/app/styles/app.less   |    10 +-
 .../app/templates/components/distcp-action.hbs  |     7 +-
 .../ui/app/templates/components/drafts-wf.hbs   |     4 +-
 .../app/templates/components/flow-designer.hbs  |     9 +-
 .../app/templates/components/hdfs-browser.hbs   |    16 +-
 .../ui/app/templates/components/job-row.hbs     |     4 +-
 .../components/search-create-new-bar.hbs        |     4 +
 .../app/templates/components/search-table.hbs   |     2 +-
 .../app/templates/components/spark-action.hbs   |     7 +-
 .../main/resources/ui/app/utils/constants.js    |     3 +-
 .../main/resources/ui/app/utils/hdfsviewer.js   |     3 +
 .../wfmanager/src/main/resources/ui/bower.json  |     6 +-
 .../src/main/resources/ui/ember-cli-build.js    |     2 +-
 .../addon/components/directory-viewer.js        |   325 +-
 .../hdfs-directory-viewer/addon/styles/app.css  |   190 +
 .../templates/components/directory-viewer.hbs   |   146 +
 .../addon/utils/viewer-config.js                |     3 +
 .../hdfs-directory-viewer/bower.json            |     1 -
 .../hdfs-directory-viewer/index.js              |     3 -
 .../hdfs-directory-viewer/package.json          |     5 +-
 .../src/main/resources/ui/package.json          |     4 +-
 .../wfmanager/src/main/resources/ui/yarn.lock   |  5663 ++
 .../config-utils/diff_stack_properties.py       |   154 +
 docs/pom.xml                                    |    50 +-
 docs/src/site/apt/index.apt                     |     2 +-
 docs/src/site/apt/whats-new.apt                 |     8 +-
 docs/src/site/site.xml                          |     6 +
 pom.xml                                         |    21 +-
 utility/pom.xml                                 |   101 -
 utility/src/main/java/category/AlertTest.java   |    27 -
 .../main/java/category/AmbariUpgradeTest.java   |    27 -
 .../src/main/java/category/BlueprintTest.java   |    27 -
 utility/src/main/java/category/FastTest.java    |    27 -
 .../src/main/java/category/KerberosTest.java    |    27 -
 utility/src/main/java/category/MetricsTest.java |    27 -
 utility/src/main/java/category/SlowTest.java    |    27 -
 .../main/java/category/StackUpgradeTest.java    |    27 -
 ...AvoidTransactionalOnPrivateMethodsCheck.java |    55 -
 .../src/main/resources/checkstyle_packages.xml  |    15 -
 ...dTransactionalOnPrivateMethodsCheckTest.java |    49 -
 .../InputTransactionalOnPrivateMethods.java     |    46 -
 5354 files changed, 364802 insertions(+), 364748 deletions(-)
----------------------------------------------------------------------



[35/50] [abbrv] ambari git commit: AMBARI-22061. Solr Data Manager script should provide non-destructive archive download option (mgergely)

Posted by ao...@apache.org.
AMBARI-22061. Solr Data Manager script should provide non-destructive archive download option (mgergely)

Change-Id: I2fd9ef9e2de840e25649feb5f39b95dd36e7cc7e


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9d802b7c
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9d802b7c
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9d802b7c

Branch: refs/heads/branch-3.0-perf
Commit: 9d802b7c11a62336fd4de8aa2695af02b061c625
Parents: dc419b4
Author: Miklos Gergely <mg...@hortonworks.com>
Authored: Wed Sep 27 11:15:01 2017 +0200
Committer: Miklos Gergely <mg...@hortonworks.com>
Committed: Wed Sep 27 11:15:11 2017 +0200

----------------------------------------------------------------------
 .../src/main/python/solrDataManager.py          | 76 +++++++++++---------
 1 file changed, 43 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/9d802b7c/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py b/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
index e0356bb..2675bd9 100644
--- a/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
+++ b/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
@@ -47,7 +47,7 @@ verbose = False
 def parse_arguments():
   parser = optparse.OptionParser("usage: %prog [options]", version="Solr Data Manager {0}".format(VERSION))
 
-  parser.add_option("-m", "--mode", dest="mode", type="string", help="delete | save")
+  parser.add_option("-m", "--mode", dest="mode", type="string", help="archive | delete | save")
   parser.add_option("-s", "--solr-url", dest="solr_url", type="string", help="the url of the solr server including the port")
   parser.add_option("-c", "--collection", dest="collection", type="string", help="the name of the solr collection")
   parser.add_option("-f", "--filter-field", dest="filter_field", type="string", help="the name of the field to filter on")
@@ -98,14 +98,14 @@ def parse_arguments():
       parser.print_help()
       sys.exit()
   
-  mode_values = ["delete", "save"]
+  mode_values = ["archive", "delete", "save"]
   if options.mode not in mode_values:
     print "mode must be one of {0}".format(" | ".join(mode_values))
     parser.print_help()
     sys.exit()
 
   if options.mode == "delete":
-    for r in ["name", "compression", "hdfs_keytab", "hdfs_principal", "hdfs_user", "hdfs_path", "key_file_path", "bucket", "key_prefix", "local_path"]:
+    for r in ["name", "hdfs_keytab", "hdfs_principal", "hdfs_user", "hdfs_path", "key_file_path", "bucket", "key_prefix", "local_path"]:
       if options.__dict__[r] is not None:
         print "argument '{0}' may not be specified in delete mode".format(r)
         parser.print_help()
@@ -153,7 +153,7 @@ def parse_arguments():
     parser.print_help()
     sys.exit()
 
-  if options.mode == "save":
+  if options.mode in ["archive", "save"]:
     count = (1 if is_any_hdfs_property else 0) + (1 if is_any_s3_property else 0) + \
             (1 if options.__dict__["local_path"] is not None else 0)
     if count != 1:
@@ -171,7 +171,7 @@ def parse_arguments():
   print("  solr-url: " + options.solr_url)
   print("  collection: " + options.collection)
   print("  filter-field: " + options.filter_field)
-  if options.mode == "save":
+  if options.mode in ["archive", "save"]:
     print("  id-field: " + options.id_field)
   if options.__dict__["end"] is not None:
     print("  end: " + options.end)
@@ -182,14 +182,14 @@ def parse_arguments():
     print("  additional-filter: " + str(options.additional_filter))
   if options.__dict__["name"] is not None:
     print("  name: " + str(options.name))
-  if options.mode == "save":
+  if options.mode in ["archive", "save"]:
     print("  read-block-size: " + str(options.read_block_size))
     print("  write-block-size: " + str(options.write_block_size))
     print("  ignore-unfinished-uploading: " + str(options.ignore_unfinished_uploading))
   if (options.__dict__["solr_keytab"] is not None):
     print("  solr-keytab: " + options.solr_keytab)
     print("  solr-principal: " + options.solr_principal)
-  if options.mode == "save":
+  if options.mode in ["archive", "save"]:
     print("  output: " + ("json" if options.json_file else "line-delimited-json"))
     print("  compression: " + options.compression)
   if (options.__dict__["hdfs_keytab"] is not None):
@@ -251,7 +251,7 @@ def delete(solr_url, collection, filter_field, end, solr_keytab, solr_principal)
   
   query_solr(solr_kinit_command, delete_command, "{0} {1}".format(curl_prefix, delete_command), "Deleting")
 
-def save(solr_url, collection, filter_field, id_field, range_end, read_block_size, write_block_size,
+def save(mode, solr_url, collection, filter_field, id_field, range_end, read_block_size, write_block_size,
          ignore_unfinished_uploading, additional_filter, name, solr_keytab, solr_principal, json_file,
          compression, hdfs_keytab, hdfs_principal, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
   solr_kinit_command = None
@@ -269,9 +269,11 @@ def save(solr_url, collection, filter_field, id_field, range_end, read_block_siz
     ensure_hdfs_path(hdfs_kinit_command, hdfs_user, hdfs_path)
 
   working_dir = get_working_dir(solr_url, collection)
-  handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_prefix, working_dir, ignore_unfinished_uploading)
-  save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field, range_end,
-            read_block_size, write_block_size, working_dir, additional_filter, name, json_file, compression,
+  if mode == "archive":
+    handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_prefix, working_dir, ignore_unfinished_uploading)
+  
+  save_data(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
+            range_end, read_block_size, write_block_size, working_dir, additional_filter, name, json_file, compression,
             hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path)
 
 def ensure_hdfs_path(hdfs_kinit_command, hdfs_user, hdfs_path):
@@ -341,7 +343,7 @@ def handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_pre
     
     os.remove(command_json_path)
 
-def save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
+def save_data(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
               range_end, read_block_size, write_block_size, working_dir, additional_filter, name, json_file,
               compression, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
   logger.info("Starting to save data")
@@ -370,9 +372,9 @@ def save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, col
     prev_lot_end_id = results[3]
     
     if records > 0:
-      upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
-                   working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
-                   key_file_path, bucket, key_prefix, local_path, compression)
+      upload_block(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field,
+                   id_field, working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user,
+                   hdfs_path, key_file_path, bucket, key_prefix, local_path, compression)
       total_records += records
       logger.info("A total of %d records are saved", total_records)
 
@@ -441,8 +443,8 @@ def finish_file(tmp_file, json_file):
   if json_file:
     tmp_file.write("\n}")
 
-def upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
-                 working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
+def upload_block(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field,
+                 id_field, working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
                  key_file_path, bucket, key_prefix, local_path, compression):
   if name:
     file_name = "{0}_-_{1}_-_{2}_-_{3}".format(collection, name, prev_lot_end_value, prev_lot_end_id).replace(':', '_')
@@ -451,9 +453,9 @@ def upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url,
   
   upload_file_path = compress_file(working_dir, tmp_file_path, file_name, compression)
   
-  upload_command = create_command_file(True, working_dir, upload_file_path, solr_url, collection, filter_field, id_field,
-                                       prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path, key_file_path, bucket,
-                                       key_prefix, local_path)
+  upload_command = create_command_file(mode, True, working_dir, upload_file_path, solr_url, collection, filter_field,
+                                       id_field, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
+                                       key_file_path, bucket, key_prefix, local_path)
   if hdfs_user:
     upload_file_hdfs(hdfs_kinit_command, upload_command, upload_file_path, hdfs_path, hdfs_user)
   elif key_file_path:
@@ -464,11 +466,12 @@ def upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url,
     logger.warn("Unknown upload destination")
     sys.exit()
   
-  delete_command = create_command_file(False, working_dir, upload_file_path, solr_url, collection, filter_field, id_field,
-                                       prev_lot_end_value, prev_lot_end_id, None, None, None, None, None, None)
-  delete_data(solr_kinit_command, curl_prefix, delete_command, collection, filter_field, id_field, prev_lot_end_value, prev_lot_end_id)
-  
-  os.remove("{0}/command.json".format(working_dir))
+  delete_command = create_command_file(mode, False, working_dir, upload_file_path, solr_url, collection, filter_field,
+                                       id_field, prev_lot_end_value, prev_lot_end_id, None, None, None, None, None, None)
+  if mode == "archive":
+    delete_data(solr_kinit_command, curl_prefix, delete_command, collection, filter_field, id_field, prev_lot_end_value,
+                prev_lot_end_id)
+    os.remove("{0}/command.json".format(working_dir))
 
 def compress_file(working_dir, tmp_file_path, file_name, compression):
   data_file_name = "{0}.json".format(file_name)
@@ -511,8 +514,9 @@ def compress_file(working_dir, tmp_file_path, file_name, compression):
   
   return upload_file_path
 
-def create_command_file(upload, working_dir, upload_file_path, solr_url, collection, filter_field, id_field, prev_lot_end_value,
-                        prev_lot_end_id, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
+def create_command_file(mode, upload, working_dir, upload_file_path, solr_url, collection, filter_field, id_field,
+                        prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix,
+                        local_path):
   commands = {}
   
   if upload:
@@ -551,6 +555,9 @@ def create_command_file(upload, working_dir, upload_file_path, solr_url, collect
     else:
       logger.warn("Unknown upload destination")
       sys.exit()
+    
+    if mode == "save":
+      return upload_command
 
   
   delete_prev = "{0}:[*+TO+\"{1}\"]".format(filter_field, prev_lot_end_value)
@@ -558,6 +565,9 @@ def create_command_file(upload, working_dir, upload_file_path, solr_url, collect
   delete_query = quote("{0}+OR+{1}".format(delete_prev, delete_last), safe="/+\"*")
   delete_command = "{0}/{1}/update?stream.body=<delete><query>{2}</query></delete>&commit=true&wt=json" \
     .format(solr_url, collection, delete_query)
+  if mode == "save":
+    return delete_command
+  
   delete_command_data = {}
   delete_command_data["command"] = delete_command
   delete_command_data["collection"] = collection
@@ -710,12 +720,12 @@ if __name__ == '__main__':
     
     if options.mode == "delete":
       delete(options.solr_url, options.collection, options.filter_field, end, options.solr_keytab, options.solr_principal)
-    elif options.mode == "save":
-      save(options.solr_url, options.collection, options.filter_field, options.id_field, end, options.read_block_size,
-           options.write_block_size, options.ignore_unfinished_uploading, options.additional_filter, options.name,
-           options.solr_keytab, options.solr_principal, options.json_file, options.compression,
-           options.hdfs_keytab, options.hdfs_principal, options.hdfs_user, options.hdfs_path, options.key_file_path,
-           options.bucket, options.key_prefix, options.local_path)
+    elif options.mode in ["archive", "save"]:
+      save(options.mode, options.solr_url, options.collection, options.filter_field, options.id_field, end,
+           options.read_block_size, options.write_block_size, options.ignore_unfinished_uploading,
+           options.additional_filter, options.name, options.solr_keytab, options.solr_principal, options.json_file,
+           options.compression, options.hdfs_keytab, options.hdfs_principal, options.hdfs_user, options.hdfs_path,
+           options.key_file_path, options.bucket, options.key_prefix, options.local_path)
     else:
       logger.warn("Unknown mode: %s", options.mode)
     


[16/50] [abbrv] ambari git commit: AMBARI-22054 Log Search UI: implement 'Capture' functionality. (ababiichuk)

Posted by ao...@apache.org.
AMBARI-22054 Log Search UI: implement 'Capture' functionality. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/653d2f26
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/653d2f26
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/653d2f26

Branch: refs/heads/branch-3.0-perf
Commit: 653d2f260c05ea0e8efa4400b9d5accb5e5b39b7
Parents: 08da961
Author: ababiichuk <ab...@hortonworks.com>
Authored: Mon Sep 25 20:00:41 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Mon Sep 25 20:00:41 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web/src/app/app.module.ts  |  6 +-
 .../queries/audit-logs-query-params.class.ts    |  2 -
 .../dropdown-button.component.spec.ts           | 21 ++++++-
 .../filter-button.component.spec.ts             | 21 ++++++-
 .../filter-dropdown.component.spec.ts           | 26 +++++++-
 .../filters-panel/filters-panel.component.html  | 11 ++--
 .../filters-panel/filters-panel.component.less  |  4 ++
 .../filters-panel.component.spec.ts             |  6 +-
 .../filters-panel/filters-panel.component.ts    |  4 ++
 .../logs-container.component.html               |  5 ++
 .../logs-container.component.less               |  4 ++
 .../logs-container.component.spec.ts            |  4 +-
 .../logs-container/logs-container.component.ts  | 10 ++++
 .../menu-button/menu-button.component.html      |  2 +-
 .../menu-button/menu-button.component.spec.ts   | 22 ++++++-
 .../app/components/modal/modal.component.html   |  2 +-
 .../search-box/search-box.component.html        |  2 +-
 .../time-range-picker.component.html            |  4 +-
 .../time-range-picker.component.ts              | 13 ++--
 .../timezone-picker.component.spec.ts           | 21 ++++++-
 .../components/top-menu/top-menu.component.html |  2 +-
 .../top-menu/top-menu.component.spec.ts         |  2 +
 .../src/app/components/variables.less           |  2 +-
 .../src/app/pipes/timer-seconds.pipe.spec.ts    | 37 ++++++++++++
 .../src/app/pipes/timer-seconds.pipe.ts         | 41 +++++++++++++
 .../services/component-actions.service.spec.ts  | 21 ++++++-
 .../app/services/component-actions.service.ts   | 15 ++++-
 .../src/app/services/filtering.service.ts       | 63 +++++++++++++-------
 .../src/app/services/logs-container.service.ts  |  6 +-
 .../src/app/services/mock-api-data.service.ts   |  4 +-
 .../src/app/services/utils.service.ts           |  6 ++
 .../src/assets/i18n/en.json                     | 10 ++--
 32 files changed, 328 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
index fca68b5..c4dc698 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
@@ -78,8 +78,9 @@ import {TimeRangePickerComponent} from '@app/components/time-range-picker/time-r
 import {DatePickerComponent} from '@app/components/date-picker/date-picker.component';
 
 import {TimeZoneAbbrPipe} from '@app/pipes/timezone-abbr.pipe';
+import {TimerSecondsPipe} from '@app/pipes/timer-seconds.pipe';
 
-export function HttpLoaderFactory(http: Http) {
+export function HttpLoaderFactory(http: Http): TranslateHttpLoader {
   // adding 'static' parameter to step over mock data request
   return new TranslateHttpLoader(http, 'resources/assets/i18n/', '.json?static=true');
 }
@@ -123,7 +124,8 @@ export function getXHRBackend(injector: Injector, browser: BrowserXhr, xsrf: XSR
     SearchBoxComponent,
     TimeRangePickerComponent,
     DatePickerComponent,
-    TimeZoneAbbrPipe
+    TimeZoneAbbrPipe,
+    TimerSecondsPipe
   ],
   imports: [
     BrowserModule,

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/classes/queries/audit-logs-query-params.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/classes/queries/audit-logs-query-params.class.ts b/ambari-logsearch/ambari-logsearch-web/src/app/classes/queries/audit-logs-query-params.class.ts
index d179376..e36bf18 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/classes/queries/audit-logs-query-params.class.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/classes/queries/audit-logs-query-params.class.ts
@@ -36,8 +36,6 @@ export class AuditLogsQueryParams extends QueryParams {
   startIndex: string;
   sortBy?: string;
   sortType?: string;
-  start_time?: string;
-  end_time?: string;
   clusters?: string;
   mustBe?: string;
   mustNot?: string;

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
index 04730ef..f7227b1 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
@@ -25,10 +25,16 @@ import {ClustersService, clusters} from '@app/services/storage/clusters.service'
 import {ComponentsService, components} from '@app/services/storage/components.service';
 import {AppStateService, appState} from '@app/services/storage/app-state.service';
 import {HostsService, hosts} from '@app/services/storage/hosts.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {AuditLogsFieldsService, auditLogsFields} from '@app/services/storage/audit-logs-fields.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {ServiceLogsFieldsService, serviceLogsFields} from '@app/services/storage/service-logs-fields.service';
+import {ServiceLogsHistogramDataService, serviceLogsHistogramData} from '@app/services/storage/service-logs-histogram-data.service';
 import {FilteringService} from '@app/services/filtering.service';
 import {UtilsService} from '@app/services/utils.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {HttpClientService} from '@app/services/http-client.service';
+import {LogsContainerService} from '@app/services/logs-container.service';
 
 import {DropdownButtonComponent} from './dropdown-button.component';
 
@@ -45,7 +51,12 @@ describe('DropdownButtonComponent', () => {
           clusters,
           components,
           appState,
-          hosts
+          hosts,
+          auditLogs,
+          auditLogsFields,
+          serviceLogs,
+          serviceLogsFields,
+          serviceLogsHistogramData
         }),
         ...TranslationModules
       ],
@@ -55,10 +66,16 @@ describe('DropdownButtonComponent', () => {
         ComponentsService,
         AppStateService,
         HostsService,
+        AuditLogsService,
+        AuditLogsFieldsService,
+        ServiceLogsService,
+        ServiceLogsFieldsService,
+        ServiceLogsHistogramDataService,
         FilteringService,
         UtilsService,
         ComponentActionsService,
-        HttpClientService
+        HttpClientService,
+        LogsContainerService
       ],
       schemas: [NO_ERRORS_SCHEMA]
     })

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
index fddf645..a01a3f3 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
@@ -25,10 +25,16 @@ import {ClustersService, clusters} from '@app/services/storage/clusters.service'
 import {ComponentsService, components} from '@app/services/storage/components.service';
 import {AppStateService, appState} from '@app/services/storage/app-state.service';
 import {HostsService, hosts} from '@app/services/storage/hosts.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {AuditLogsFieldsService, auditLogsFields} from '@app/services/storage/audit-logs-fields.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {ServiceLogsFieldsService, serviceLogsFields} from '@app/services/storage/service-logs-fields.service';
+import {ServiceLogsHistogramDataService, serviceLogsHistogramData} from '@app/services/storage/service-logs-histogram-data.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {FilteringService} from '@app/services/filtering.service';
 import {UtilsService} from '@app/services/utils.service';
 import {HttpClientService} from '@app/services/http-client.service';
+import {LogsContainerService} from '@app/services/logs-container.service';
 
 import {FilterButtonComponent} from './filter-button.component';
 
@@ -45,7 +51,12 @@ describe('FilterButtonComponent', () => {
           clusters,
           components,
           appState,
-          hosts
+          hosts,
+          auditLogs,
+          auditLogsFields,
+          serviceLogs,
+          serviceLogsFields,
+          serviceLogsHistogramData
         }),
         ...TranslationModules
       ],
@@ -55,10 +66,16 @@ describe('FilterButtonComponent', () => {
         ComponentsService,
         AppStateService,
         HostsService,
+        AuditLogsService,
+        AuditLogsFieldsService,
+        ServiceLogsService,
+        ServiceLogsFieldsService,
+        ServiceLogsHistogramDataService,
         ComponentActionsService,
         FilteringService,
         UtilsService,
-        HttpClientService
+        HttpClientService,
+        LogsContainerService
       ],
       schemas: [NO_ERRORS_SCHEMA]
     })

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
index 8620607..85e7ecb 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
@@ -20,9 +20,17 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing';
 import {TranslationModules} from '@app/test-config.spec';
 import {StoreModule} from '@ngrx/store';
 import {AppSettingsService, appSettings} from '@app/services/storage/app-settings.service';
+import {AppStateService, appState} from '@app/services/storage/app-state.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {AuditLogsFieldsService, auditLogsFields} from '@app/services/storage/audit-logs-fields.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {ServiceLogsFieldsService, serviceLogsFields} from '@app/services/storage/service-logs-fields.service';
+import {ServiceLogsHistogramDataService, serviceLogsHistogramData} from '@app/services/storage/service-logs-histogram-data.service';
 import {FilteringService} from '@app/services/filtering.service';
 import {UtilsService} from '@app/services/utils.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
+import {LogsContainerService} from '@app/services/logs-container.service';
+import {HttpClientService} from '@app/services/http-client.service';
 
 import {FilterDropdownComponent} from './filter-dropdown.component';
 
@@ -51,18 +59,32 @@ describe('FilterDropdownComponent', () => {
       declarations: [FilterDropdownComponent],
       imports: [
         StoreModule.provideStore({
-          appSettings
+          appSettings,
+          appState,
+          auditLogs,
+          auditLogsFields,
+          serviceLogs,
+          serviceLogsFields,
+          serviceLogsHistogramData
         }),
         ...TranslationModules
       ],
       providers: [
         AppSettingsService,
+        AppStateService,
+        AuditLogsService,
+        AuditLogsFieldsService,
+        ServiceLogsService,
+        ServiceLogsFieldsService,
+        ServiceLogsHistogramDataService,
         {
           provide: FilteringService,
           useValue: filtering
         },
         UtilsService,
-        ComponentActionsService
+        ComponentActionsService,
+        LogsContainerService,
+        HttpClientService
       ],
       schemas: [NO_ERRORS_SCHEMA]
     })

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
index 99dd43d..fc3dac8 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
@@ -33,15 +33,18 @@
   <div class="default-flex col-md-4">
     <dropdown-button [options]="searchBoxItems" iconClass="fa fa-search-minus" label="filter.excluded"
                      [hideCaret]="true" [showSelectedValue]="false" action="proceedWithExclude"></dropdown-button>
-    <filter-button formControlName="hosts" [label]="filters.hosts.label"
+    <filter-button formControlName="hosts" label="{{filters.hosts.label | translate}}"
                    [iconClass]="filters.hosts.iconClass" [subItems]="filters.hosts.options"
                    [isMultipleChoice]="true" [isRightAlign]="true"
                    additionalLabelComponentSetter="getDataForHostsNodeBar"></filter-button>
-    <filter-button formControlName="components" [label]="filters.components.label"
+    <filter-button formControlName="components" label="{{filters.components.label | translate}}"
                    [iconClass]="filters.components.iconClass" [subItems]="filters.components.options"
                    [isMultipleChoice]="true" [isRightAlign]="true"></filter-button>
-    <filter-button formControlName="levels" [label]="filters.levels.label" [iconClass]="filters.levels.iconClass"
+    <filter-button formControlName="levels" label="{{filters.levels.label | translate}}" [iconClass]="filters.levels.iconClass"
                    [subItems]="filters.levels.options" [isMultipleChoice]="true" [isRightAlign]="true"></filter-button>
-    <menu-button label="filter.capture" iconClass="fa fa-caret-right"></menu-button>
+    <menu-button *ngIf="!captureSeconds" label="{{'filter.capture' | translate}}" iconClass="fa fa-caret-right"
+                 action="startCapture"></menu-button>
+    <menu-button *ngIf="captureSeconds" label="{{captureSeconds | timerSeconds}}" iconClass="fa fa-stop stop-icon"
+                 action="stopCapture"></menu-button>
   </div>
 </form>

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.less b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.less
index 9d901ca..4607d34 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.less
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.less
@@ -62,4 +62,8 @@
       }
     }
   }
+
+  /deep/ .stop-icon {
+    color: @error-color;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.spec.ts
index fe2e40a..ae5a4af 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.spec.ts
@@ -34,6 +34,7 @@ import {FilteringService} from '@app/services/filtering.service';
 import {HttpClientService} from '@app/services/http-client.service';
 import {UtilsService} from '@app/services/utils.service';
 import {LogsContainerService} from '@app/services/logs-container.service';
+import {TimerSecondsPipe} from '@app/pipes/timer-seconds.pipe';
 
 import {FiltersPanelComponent} from './filters-panel.component';
 
@@ -51,7 +52,10 @@ describe('FiltersPanelComponent', () => {
       }
     };
     TestBed.configureTestingModule({
-      declarations: [FiltersPanelComponent],
+      declarations: [
+        FiltersPanelComponent,
+        TimerSecondsPipe
+      ],
       imports: [
         StoreModule.provideStore({
           appSettings,

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
index 42056c6..c345c81 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
@@ -89,4 +89,8 @@ export class FiltersPanelComponent {
     return this.filtering.queryParameterAdd;
   }
 
+  get captureSeconds(): number {
+    return this.filtering.captureSeconds;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.html
index a43f6c0..5145b76 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.html
@@ -15,6 +15,11 @@
   limitations under the License.
 -->
 
+<div *ngIf="autoRefreshRemainingSeconds" class="col-md-12">
+  <div class="auto-refresh-message pull-right">
+    {{'filter.capture.triggeringRefresh' | translate: autoRefreshMessageParams}}
+  </div>
+</div>
 <time-histogram class="col-md-12" [data]="histogramData" [customOptions]="histogramOptions"></time-histogram>
 <dropdown-button class="pull-right" label="logs.columns" [options]="availableColumns | async" [isRightAlign]="true"
                  isMultipleChoice="true" action="updateSelectedColumns"

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.less b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.less
index 60082d6..cd28efc 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.less
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.less
@@ -22,4 +22,8 @@
   display: block;
   overflow: hidden;
   padding-top: @block-margin-top;
+
+  .auto-refresh-message {
+    background-color: @filters-panel-background-color;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.spec.ts
index 30c6a33..811c6e6 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.spec.ts
@@ -19,6 +19,7 @@
 import {async, ComponentFixture, TestBed} from '@angular/core/testing';
 import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
 import {StoreModule} from '@ngrx/store';
+import {TranslationModules} from '@app/test-config.spec';
 import {AppSettingsService, appSettings} from '@app/services/storage/app-settings.service';
 import {AppStateService, appState} from '@app/services/storage/app-state.service';
 import {ClustersService, clusters} from '@app/services/storage/clusters.service';
@@ -63,7 +64,8 @@ describe('LogsContainerComponent', () => {
           serviceLogsFields,
           serviceLogsHistogramData,
           hosts
-        })
+        }),
+        ...TranslationModules
       ],
       providers: [
         {

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.ts
index 3e2a6c7..b1fad17 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-container/logs-container.component.ts
@@ -102,4 +102,14 @@ export class LogsContainerComponent implements OnInit {
     return this.filtering.filtersForm;
   }
 
+  get autoRefreshRemainingSeconds(): number {
+    return this.filtering.autoRefreshRemainingSeconds;
+  }
+
+  get autoRefreshMessageParams(): any {
+    return {
+      remainingSeconds: this.autoRefreshRemainingSeconds
+    };
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.html
index 2f05656..ca70927 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.html
@@ -21,7 +21,7 @@
   <a #dropdownToggle class="dropdown-toggle caret" data-toggle="dropdown" *ngIf="hasCaret"></a>
   <br>
   <a *ngIf="label" (mousedown)="onMouseDown($event)" [ngClass]="labelClass" (mouseup)="onMouseUp($event)"
-     (click)="$event.stopPropagation()">{{label | translate}}</a>
+     (click)="$event.stopPropagation()">{{label}}</a>
   <ul data-component="dropdown-list" *ngIf="hasSubItems" [items]="subItems" (selectedItemChange)="updateValue($event)"
       [isMultipleChoice]="isMultipleChoice" [additionalLabelComponentSetter]="additionalLabelComponentSetter"
       [ngClass]="{'dropdown-menu': true, 'dropdown-menu-right': isRightAlign}"></ul>

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
index f736fd5..f92961e 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
@@ -25,10 +25,15 @@ import {AppStateService, appState} from '@app/services/storage/app-state.service
 import {ClustersService, clusters} from '@app/services/storage/clusters.service';
 import {ComponentsService, components} from '@app/services/storage/components.service';
 import {HostsService, hosts} from '@app/services/storage/hosts.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {AuditLogsFieldsService, auditLogsFields} from '@app/services/storage/audit-logs-fields.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {ServiceLogsFieldsService, serviceLogsFields} from '@app/services/storage/service-logs-fields.service';
+import {ServiceLogsHistogramDataService, serviceLogsHistogramData} from '@app/services/storage/service-logs-histogram-data.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {FilteringService} from '@app/services/filtering.service';
 import {HttpClientService} from '@app/services/http-client.service';
-import {ListItem} from "@app/classes/list-item.class";
+import {LogsContainerService} from '@app/services/logs-container.service';
 
 import {MenuButtonComponent} from './menu-button.component';
 
@@ -45,7 +50,12 @@ describe('MenuButtonComponent', () => {
           appState,
           clusters,
           components,
-          hosts
+          hosts,
+          auditLogs,
+          auditLogsFields,
+          serviceLogs,
+          serviceLogsFields,
+          serviceLogsHistogramData
         }),
         ...TranslationModules
       ],
@@ -55,9 +65,15 @@ describe('MenuButtonComponent', () => {
         ClustersService,
         ComponentsService,
         HostsService,
+        AuditLogsService,
+        AuditLogsFieldsService,
+        ServiceLogsService,
+        ServiceLogsFieldsService,
+        ServiceLogsHistogramDataService,
         ComponentActionsService,
         FilteringService,
-        HttpClientService
+        HttpClientService,
+        LogsContainerService
       ],
       schemas: [NO_ERRORS_SCHEMA]
     })

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/modal/modal.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/modal/modal.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/modal/modal.component.html
index abd7bc8..398a429 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/modal/modal.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/modal/modal.component.html
@@ -21,7 +21,7 @@
     <div class="modal-content">
       <div *ngIf="showHeader" class="modal-header">
         <button *ngIf="showCloseButton" type="button" class="close" data-dismiss="modal" (click)="onClose()">
-          <span>&times;</span>
+          <span class="fa fa-times"></span>
         </button>
         <h4 *ngIf="title">{{title}}</h4>
       </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.html
index e88159c..92f9520 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.html
@@ -19,7 +19,7 @@
   <span *ngIf="parameter.isExclude" class="fa fa-search-minus exclude-icon"></span>
   {{parameter.label | translate}}:
   <span class="parameter-value">{{parameter.value}}</span>
-  <span class="remove-parameter" (click)="removeParameter($event, parameter.id)">&times;</span>
+  <span class="fa fa-times remove-parameter" (click)="removeParameter($event, parameter.id)"></span>
 </label>
 <span class="active-parameter-label" *ngIf="isActive && activeItem">{{activeItem.name | translate}}:</span>
 <div [ngClass]="{'search-item-container': true, 'active': isActive, 'value': isValueInput}">

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.html
index 6921b53..973db61 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.html
@@ -20,7 +20,7 @@
 </button>
 <div class="dropdown-menu row col-md-12">
   <div class="col-md-4" (click)="$event.stopPropagation()">
-    <h4>{{'filters.timeRange' | translate}}</h4>
+    <h4>{{'filter.timeRange' | translate}}</h4>
     <date-picker (timeChange)="setStartTime($event)"></date-picker>
     <date-picker (timeChange)="setEndTime($event)"></date-picker>
     <button class="btn btn-success pull-right" type="button" (click)="setCustomTimeRange()"
@@ -29,7 +29,7 @@
     </button>
   </div>
   <div class="col-md-8 row">
-    <h4>{{'filters.timeRange.quick' | translate}}</h4>
+    <h4>{{'filter.timeRange.quick' | translate}}</h4>
     <div *ngFor="let group of quickRanges" [ngClass]="'col-md-' + 12 / quickRanges.length">
       <div *ngFor="let option of group">
         <span class="time-range-name" (click)="setTimeRange(option.value, option.label)">

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.ts
index fc740de..fc0f6ae 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/time-range-picker/time-range-picker.component.ts
@@ -18,6 +18,7 @@
 
 import {Component, OnInit, Input, forwardRef} from '@angular/core';
 import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
+import {Moment} from 'moment';
 import {FilteringService} from '@app/services/filtering.service';
 
 @Component({
@@ -46,9 +47,9 @@ export class TimeRangePickerComponent implements OnInit, ControlValueAccessor {
 
   selectedLabel: string;
 
-  startTime: number;
+  startTime: Moment;
 
-  endTime: number;
+  endTime: Moment;
 
   private onChange: (fn: any) => void;
 
@@ -67,12 +68,12 @@ export class TimeRangePickerComponent implements OnInit, ControlValueAccessor {
     this.onChange(newValue);
   }
 
-  setStartTime(timeStamp: number): void {
-    this.startTime = timeStamp;
+  setStartTime(timeObject: Moment): void {
+    this.startTime = timeObject;
   }
 
-  setEndTime(timeStamp: number): void {
-    this.endTime = timeStamp;
+  setEndTime(timeObject: Moment): void {
+    this.endTime = timeObject;
   }
 
   setTimeRange(value: any, label: string) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
index abbc9ce..7d1e907 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
@@ -24,9 +24,15 @@ import {AppStateService, appState} from '@app/services/storage/app-state.service
 import {ClustersService, clusters} from '@app/services/storage/clusters.service';
 import {ComponentsService, components} from '@app/services/storage/components.service';
 import {HostsService, hosts} from '@app/services/storage/hosts.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {AuditLogsFieldsService, auditLogsFields} from '@app/services/storage/audit-logs-fields.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {ServiceLogsFieldsService, serviceLogsFields} from '@app/services/storage/service-logs-fields.service';
+import {ServiceLogsHistogramDataService, serviceLogsHistogramData} from '@app/services/storage/service-logs-histogram-data.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {FilteringService} from '@app/services/filtering.service';
 import {HttpClientService} from '@app/services/http-client.service';
+import {LogsContainerService} from '@app/services/logs-container.service';
 import {TimeZoneAbbrPipe} from '@app/pipes/timezone-abbr.pipe';
 import {ModalComponent} from '@app/components/modal/modal.component';
 
@@ -49,7 +55,12 @@ describe('TimeZonePickerComponent', () => {
           appState,
           clusters,
           components,
-          hosts
+          hosts,
+          auditLogs,
+          auditLogsFields,
+          serviceLogs,
+          serviceLogsFields,
+          serviceLogsHistogramData
         }),
         ...TranslationModules
       ],
@@ -59,9 +70,15 @@ describe('TimeZonePickerComponent', () => {
         ClustersService,
         ComponentsService,
         HostsService,
+        AuditLogsService,
+        AuditLogsFieldsService,
+        ServiceLogsService,
+        ServiceLogsFieldsService,
+        ServiceLogsHistogramDataService,
         ComponentActionsService,
         FilteringService,
-        HttpClientService
+        HttpClientService,
+        LogsContainerService
       ],
     })
     .compileComponents();

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.html
index 6898354..3af1a69 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.html
@@ -15,7 +15,7 @@
   limitations under the License.
 -->
 
-<menu-button *ngFor="let item of items" [label]="item.label" [action]="item.action"
+<menu-button *ngFor="let item of items" label="{{item.label | translate}}" [action]="item.action"
              [iconClass]="item.iconClass" [labelClass]="item.labelClass"
              [subItems]="item.subItems" [hideCaret]="item.hideCaret">
 </menu-button>

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.spec.ts
index 1649a50..6679ba1 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.spec.ts
@@ -18,6 +18,7 @@
 
 import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
 import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {TranslationModules} from '@app/test-config.spec';
 
 import {TopMenuComponent} from './top-menu.component';
 
@@ -27,6 +28,7 @@ describe('TopMenuComponent', () => {
 
   beforeEach(async(() => {
     TestBed.configureTestingModule({
+      imports: TranslationModules,
       declarations: [TopMenuComponent],
       schemas: [CUSTOM_ELEMENTS_SCHEMA]
     })

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/components/variables.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/variables.less b/ambari-logsearch/ambari-logsearch-web/src/app/components/variables.less
index ab95030..88b0c91 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/variables.less
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/variables.less
@@ -34,7 +34,7 @@
 @filters-panel-padding: 10px 0;
 @list-header-background-color: #F2F2F2;
 @checkbox-top: 4px;
-@dropdown-min-width: 200px;
+@dropdown-min-width: 160px;
 @dropdown-max-height: 500px; // TODO get rid of magic number, base on actual design
 @input-height: 34px;
 @input-padding: 10px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.spec.ts
new file mode 100644
index 0000000..a81e0cc
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.spec.ts
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {TestBed, inject} from '@angular/core/testing';
+import {UtilsService} from '@app/services/utils.service';
+
+import {TimerSecondsPipe} from './timer-seconds.pipe';
+
+describe('TimerSecondsPipe', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [
+        UtilsService
+      ]
+    });
+  });
+
+  it('create an instance', inject([UtilsService], (utils: UtilsService) => {
+    const pipe = new TimerSecondsPipe(utils);
+    expect(pipe).toBeTruthy();
+  }));
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.ts b/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.ts
new file mode 100644
index 0000000..1b9dc76
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/pipes/timer-seconds.pipe.ts
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {Pipe, PipeTransform} from '@angular/core';
+import {UtilsService} from '@app/services/utils.service';
+
+@Pipe({
+  name: 'timerSeconds'
+})
+export class TimerSecondsPipe implements PipeTransform {
+
+  constructor(private utils: UtilsService) {
+  }
+
+  transform(value: number): string {
+    const seconds = value % 60,
+      outputSeconds = this.utils.fitIntegerDigitsCount(seconds),
+      fullMinutes = (value - seconds) / 60,
+      minutes = fullMinutes % 60,
+      outputMinutes = this.utils.fitIntegerDigitsCount(minutes),
+      hours = (fullMinutes - minutes) / 60,
+      outputHours = hours ? `${this.utils.fitIntegerDigitsCount(hours)}:` : '';
+    return `${outputHours}${outputMinutes}:${outputSeconds}`;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
index f961907..e737155 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
@@ -22,8 +22,14 @@ import {AppSettingsService, appSettings} from '@app/services/storage/app-setting
 import {ClustersService, clusters} from '@app/services/storage/clusters.service';
 import {ComponentsService, components} from '@app/services/storage/components.service';
 import {HostsService, hosts} from '@app/services/storage/hosts.service';
+import {AuditLogsService, auditLogs} from '@app/services/storage/audit-logs.service';
+import {ServiceLogsService, serviceLogs} from '@app/services/storage/service-logs.service';
+import {AuditLogsFieldsService, auditLogsFields} from '@app/services/storage/audit-logs-fields.service';
+import {ServiceLogsFieldsService, serviceLogsFields} from '@app/services/storage/service-logs-fields.service';
+import {ServiceLogsHistogramDataService, serviceLogsHistogramData} from '@app/services/storage/service-logs-histogram-data.service';
 import {FilteringService} from '@app/services/filtering.service';
 import {HttpClientService} from '@app/services/http-client.service';
+import {LogsContainerService} from '@app/services/logs-container.service';
 
 import {ComponentActionsService} from './component-actions.service';
 
@@ -44,7 +50,12 @@ describe('ComponentActionsService', () => {
           appSettings,
           clusters,
           components,
-          hosts
+          hosts,
+          auditLogs,
+          serviceLogs,
+          auditLogsFields,
+          serviceLogsFields,
+          serviceLogsHistogramData
         })
       ],
       providers: [
@@ -53,11 +64,17 @@ describe('ComponentActionsService', () => {
         ClustersService,
         ComponentsService,
         HostsService,
+        AuditLogsService,
+        ServiceLogsService,
+        AuditLogsFieldsService,
+        ServiceLogsFieldsService,
+        ServiceLogsHistogramDataService,
         FilteringService,
         {
           provide: HttpClientService,
           useValue: httpClient
-        }
+        },
+        LogsContainerService
       ]
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
index f29705c..dba0f8f 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
@@ -20,11 +20,12 @@ import {Injectable} from '@angular/core';
 import {AppSettingsService} from '@app/services/storage/app-settings.service';
 import {CollectionModelService} from '@app/models/store.model';
 import {FilteringService} from '@app/services/filtering.service';
+import {LogsContainerService} from '@app/services/logs-container.service';
 
 @Injectable()
 export class ComponentActionsService {
 
-  constructor(private appSettings: AppSettingsService, private filtering: FilteringService) {
+  constructor(private appSettings: AppSettingsService, private filtering: FilteringService, private logsContainer: LogsContainerService) {
   }
 
   //TODO implement actions
@@ -35,12 +36,22 @@ export class ComponentActionsService {
   redo() {
   }
 
-  refresh() {
+  refresh(): void {
+    // TODO implement dynamic definition of logs type
+    this.logsContainer.loadLogs('serviceLogs');
   }
 
   openHistory() {
   }
 
+  startCapture(): void {
+    this.filtering.startCaptureTimer();
+  }
+
+  stopCapture(): void {
+    this.filtering.stopCaptureTimer();
+  }
+
   setTimeZone(timeZone: string): void {
     this.appSettings.setParameter('timeZone', timeZone);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
index beaf91c..6697c54 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
@@ -19,6 +19,10 @@
 import {Injectable} from '@angular/core';
 import {FormControl, FormGroup} from '@angular/forms';
 import {Subject} from 'rxjs/Subject';
+import {Observable} from 'rxjs/Observable';
+import 'rxjs/add/observable/timer';
+import 'rxjs/add/operator/takeUntil';
+import {Moment} from 'moment';
 import * as moment from 'moment-timezone';
 import {ListItem} from '@app/classes/list-item.class';
 import {AppSettingsService} from '@app/services/storage/app-settings.service';
@@ -190,16 +194,6 @@ export class FilteringService {
               unit: 'd'
             }
           },
-          // TODO implement time range calculation
-          /*
-          {
-            label: 'filter.timeRange.todaySoFar',
-            value: {
-              type: 'CURRENT',
-              unit: 'd'
-            }
-          },
-          */
           {
             label: 'filter.timeRange.thisWeek',
             value: {
@@ -207,16 +201,6 @@ export class FilteringService {
               unit: 'w'
             }
           },
-          // TODO implement time range calculation
-          /*
-          {
-            label: 'filter.timeRange.thisWeekSoFar',
-            value: {
-              type: 'CURRENT',
-              unit: 'w'
-            }
-          },
-          */
           {
             label: 'filter.timeRange.thisMonth',
             value: {
@@ -406,6 +390,43 @@ export class FilteringService {
 
   queryParameterAdd: Subject<any> = new Subject();
 
+  private stopTimer: Subject<any> = new Subject();
+
+  private stopAutoRefreshCountdown: Subject<any> = new Subject();
+
+  captureSeconds: number = 0;
+
+  private readonly autoRefreshInterval: number = 30000;
+
+  autoRefreshRemainingSeconds: number = 0;
+
+  private startCaptureMoment: Moment;
+
+  private stopCaptureMoment: Moment;
+
+  startCaptureTimer(): void {
+    this.startCaptureMoment = moment();
+    Observable.timer(0, 1000).takeUntil(this.stopTimer).subscribe(seconds => this.captureSeconds = seconds);
+  }
+
+  stopCaptureTimer(): void {
+    const autoRefreshIntervalSeconds = this.autoRefreshInterval / 1000;
+    this.stopCaptureMoment = moment();
+    this.captureSeconds = 0;
+    this.stopTimer.next();
+    Observable.timer(0, 1000).takeUntil(this.stopAutoRefreshCountdown).subscribe(seconds => {
+      this.autoRefreshRemainingSeconds = autoRefreshIntervalSeconds - seconds;
+      if (!this.autoRefreshRemainingSeconds) {
+        this.stopAutoRefreshCountdown.next();
+        this.filtersForm.controls.timeRange.setValue({
+          type: 'CUSTOM',
+          start: this.startCaptureMoment,
+          end: this.stopCaptureMoment
+        });
+      }
+    });
+  }
+
   loadClusters(): void {
     this.httpClient.get('clusters').subscribe(response => {
       const clusterNames = response.json();
@@ -498,8 +519,6 @@ export class FilteringService {
   }
 
   readonly valueGetters = {
-    end_time: this.getEndTime,
-    start_time: this.getStartTime,
     to: this.getEndTime,
     from: this.getStartTime,
     sortType: value => value && value.type,

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/services/logs-container.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/logs-container.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/logs-container.service.ts
index 26d1b6b..bef28cf 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/logs-container.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/logs-container.service.ts
@@ -43,7 +43,7 @@ export class LogsContainerService {
 
   private readonly listFilters = {
     clusters: ['clusters'],
-    timeRange: ['end_time', 'start_time'],
+    timeRange: ['to', 'from'],
     components: ['mustBe'],
     levels: ['level'],
     hosts: ['hostList'],
@@ -111,9 +111,7 @@ export class LogsContainerService {
         let value;
         const valueGetter = this.filtering.valueGetters[paramName];
         if (valueGetter) {
-          if (paramName === 'start_time') {
-            value = valueGetter(inputValue, params['end_time']);
-          } else if (paramName === 'from') {
+          if (paramName === 'from') {
             value = valueGetter(inputValue, params['to']);
           } else {
             value = valueGetter(inputValue);

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/services/mock-api-data.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/mock-api-data.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/mock-api-data.service.ts
index 937fae1..8b157df 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/mock-api-data.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/mock-api-data.service.ts
@@ -52,11 +52,11 @@ export class mockApiDataService implements InMemoryDbService {
           key: 'log_message',
           filterFunction: (value, filterValue) => value.toLowerCase().indexOf(filterValue.toLowerCase()) > -1
         },
-        start_time: {
+        from: {
           key: 'logtime',
           filterFunction: (value, filterValue) => value >= moment(filterValue).valueOf()
         },
-        end_time: {
+        to: {
           key: 'logtime',
           filterFunction: (value, filterValue) => value < moment(filterValue).valueOf()
         },

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/app/services/utils.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/utils.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/utils.service.ts
index 773172b..3448dd4 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/utils.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/utils.service.ts
@@ -54,4 +54,10 @@ export class UtilsService {
     return !momentA.isSame(momentB, 'day');
   }
 
+  fitIntegerDigitsCount(numberToFormat: number, minLength: number = 2): string {
+    return numberToFormat.toLocaleString(undefined, {
+      minimumIntegerDigits: minLength
+    });
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/653d2f26/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
index 8750d64..0d40bc7 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
+++ b/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
@@ -20,14 +20,14 @@
   "filter.clusters": "Clusters",
   "filter.components": "Components",
   "filter.levels": "Levels",
-  "filter.capture": "Capture",
   "filter.excluded": "Excluded",
   "filter.hosts": "Hosts",
 
-  "filters.timeRange": "Time Range",
-  "filters.timeRange.from": "from",
-  "filters.timeRange.to": "to",
-  "filters.timeRange.quick": "Quick Ranges",
+  "filter.capture": "Capture",
+  "filter.capture.triggeringRefresh": "Triggering auto-refresh in {{remainingSeconds}} sec",
+
+  "filter.timeRange": "Time Range",
+  "filter.timeRange.quick": "Quick Ranges",
   "filter.timeRange.7d": "Last 7 days",
   "filter.timeRange.30d": "Last 30 days",
   "filter.timeRange.60d": "Last 60 days",


[31/50] [abbrv] ambari git commit: AMBARI-21998. Ambari upgrade don't delete stale constraints (dlysnichenko)

Posted by ao...@apache.org.
AMBARI-21998. Ambari upgrade don't delete stale constraints (dlysnichenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/439a9ad0
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/439a9ad0
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/439a9ad0

Branch: refs/heads/branch-3.0-perf
Commit: 439a9ad09d360d806befc386c5717ca576c3f221
Parents: a873626
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Tue Sep 26 18:58:22 2017 +0300
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Tue Sep 26 18:58:52 2017 +0300

----------------------------------------------------------------------
 .../server/upgrade/UpgradeCatalog260.java       | 25 ++++++++++++++++++++
 .../server/upgrade/UpgradeCatalog260Test.java   | 14 +++++++++++
 2 files changed, 39 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/439a9ad0/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
index 5003c13..c31469e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
@@ -143,6 +143,12 @@ public class UpgradeCatalog260 extends AbstractUpgradeCatalog {
   public static final String NOT_REQUIRED = "NOT_REQUIRED";
   public static final String CURRENT = "CURRENT";
   public static final String SELECTED = "1";
+  public static final String VIEWURL_TABLE = "viewurl";
+  public static final String PK_VIEWURL = "PK_viewurl";
+  public static final String URL_ID_COLUMN = "url_id";
+  public static final String STALE_POSTGRESS_VIEWURL_PKEY = "viewurl_pkey";
+  public static final String USERS_TABLE = "users";
+  public static final String STALE_POSTGRESS_USERS_LDAP_USER_KEY = "users_ldap_user_key";
 
 
   /**
@@ -189,6 +195,25 @@ public class UpgradeCatalog260 extends AbstractUpgradeCatalog {
     updateRepositoryVersionTable();
     renameServiceDeletedColumn();
     expandUpgradeItemItemTextColumn();
+    addViewUrlPKConstraint();
+    removeStaleConstraints();
+  }
+
+
+  /**
+   * Updates {@value #VIEWURL_TABLE} table.
+   * Adds the {@value #PK_VIEWURL} constraint.
+   */
+  private void addViewUrlPKConstraint() throws SQLException {
+    dbAccessor.dropPKConstraint(VIEWURL_TABLE, STALE_POSTGRESS_VIEWURL_PKEY);
+    dbAccessor.addPKConstraint(VIEWURL_TABLE, PK_VIEWURL, URL_ID_COLUMN);
+  }
+
+  /**
+   * remove stale unnamed constraints
+   */
+  private void removeStaleConstraints() throws SQLException {
+    dbAccessor.dropUniqueConstraint(USERS_TABLE, STALE_POSTGRESS_USERS_LDAP_USER_KEY);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/439a9ad0/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
index d0d5dac..cc58988 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
@@ -201,6 +201,9 @@ public class UpgradeCatalog260Test {
     Capture<DBColumnInfo> unapped = newCapture();
     expectRenameServiceDeletedColumn(unapped);
 
+    expectAddViewUrlPKConstraint();
+    expectRemoveStaleConstraints();
+    
     replay(dbAccessor, configuration, connection, statement, resultSet);
 
     Injector injector = getInjector();
@@ -218,6 +221,17 @@ public class UpgradeCatalog260Test {
     verifyUpdateRepositoryVersionTableTable(repoVersionHiddenColumnCapture, repoVersionResolvedColumnCapture);
   }
 
+  private void expectRemoveStaleConstraints() throws SQLException {
+    dbAccessor.dropUniqueConstraint(eq(UpgradeCatalog260.USERS_TABLE), eq(UpgradeCatalog260.STALE_POSTGRESS_USERS_LDAP_USER_KEY));
+  }
+
+  private void expectAddViewUrlPKConstraint() throws SQLException {
+    dbAccessor.dropPKConstraint(eq(UpgradeCatalog260.VIEWURL_TABLE), eq(UpgradeCatalog260.STALE_POSTGRESS_VIEWURL_PKEY));
+    expectLastCall().once();
+    dbAccessor.addPKConstraint(eq(UpgradeCatalog260.VIEWURL_TABLE), eq(UpgradeCatalog260.PK_VIEWURL), eq(UpgradeCatalog260.URL_ID_COLUMN));
+    expectLastCall().once();
+  }
+
   public void expectDropStaleTables() throws SQLException {
     dbAccessor.dropTable(eq(UpgradeCatalog260.CLUSTER_CONFIG_MAPPING_TABLE));
     expectLastCall().once();


[23/50] [abbrv] ambari git commit: AMBARI-22044 : Rate metrics should not have negative values whenever the underlying counter metric has been reset.(avijayan)

Posted by ao...@apache.org.
AMBARI-22044 : Rate metrics should not have negative values whenever the underlying counter metric has been reset.(avijayan)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ced70f7d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ced70f7d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ced70f7d

Branch: refs/heads/branch-3.0-perf
Commit: ced70f7db01384e11b1a7f52fa0f64924eea0ab8
Parents: 84fed85
Author: Aravindan Vijayan <av...@hortonworks.com>
Authored: Mon Sep 25 22:16:20 2017 -0700
Committer: Aravindan Vijayan <av...@hortonworks.com>
Committed: Mon Sep 25 22:16:20 2017 -0700

----------------------------------------------------------------------
 .../timeline/HBaseTimelineMetricStore.java      |  8 +++--
 .../timeline/HBaseTimelineMetricStoreTest.java  | 36 +++++++++++---------
 2 files changed, 26 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ced70f7d/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStore.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStore.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStore.java
index ad1fd67..2342bd8 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStore.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStore.java
@@ -312,8 +312,12 @@ public class HBaseTimelineMetricStore extends AbstractService implements Timelin
       if (prevTime != null) {
         step = currTime - prevTime;
         diff = currVal - prevVal;
-        Double rate = isDiff ? diff : (diff / TimeUnit.MILLISECONDS.toSeconds(step));
-        timeValueEntry.setValue(rate);
+        if (diff < 0) {
+          it.remove(); //Discard calculating rate when the metric counter has been reset.
+        } else {
+          Double rate = isDiff ? diff : (diff / TimeUnit.MILLISECONDS.toSeconds(step));
+          timeValueEntry.setValue(rate);
+        }
       } else {
         it.remove();
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/ced70f7d/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStoreTest.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStoreTest.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStoreTest.java
index aae1d4b..70dd583 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStoreTest.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricStoreTest.java
@@ -95,22 +95,26 @@ public class HBaseTimelineMetricStoreTest {
   @Test
   public void testRateCalculationOnMetricsWithEqualValues() throws Exception {
     Map<Long, Double> metricValues = new TreeMap<>();
-    metricValues.put(1454016368371L, 1011.25);
-    metricValues.put(1454016428371L, 1011.25);
-    metricValues.put(1454016488371L, 1011.25);
-    metricValues.put(1454016548371L, 1011.25);
-    metricValues.put(1454016608371L, 1011.25);
-    metricValues.put(1454016668371L, 1011.25);
-    metricValues.put(1454016728371L, 1011.25);
+    metricValues.put(1454000000000L, 1.0);
+    metricValues.put(1454000001000L, 6.0);
+    metricValues.put(1454000002000L, 0.0);
+    metricValues.put(1454000003000L, 3.0);
+    metricValues.put(1454000004000L, 4.0);
+    metricValues.put(1454000005000L, 7.0);
 
     // Calculate rate
     Map<Long, Double> rates = HBaseTimelineMetricStore.updateValuesAsRate(new TreeMap<>(metricValues), false);
 
     // Make sure rate is zero
-    for (Map.Entry<Long, Double> rateEntry : rates.entrySet()) {
-      Assert.assertEquals("Rate should be zero, key = " + rateEntry.getKey()
-          + ", value = " + rateEntry.getValue(), 0.0, rateEntry.getValue());
-    }
+    Assert.assertTrue(rates.size() == 4);
+
+    Assert.assertFalse(rates.containsKey(1454000000000L));
+    Assert.assertFalse(rates.containsKey(1454000002000L));
+
+    Assert.assertEquals(rates.get(1454000001000L), 5.0);
+    Assert.assertEquals(rates.get(1454000003000L), 3.0);
+    Assert.assertEquals(rates.get(1454000004000L), 1.0);
+    Assert.assertEquals(rates.get(1454000005000L), 3.0);
   }
 
   @Test
@@ -119,14 +123,14 @@ public class HBaseTimelineMetricStoreTest {
     metricValues.put(1454016368371L, 1011.25);
     metricValues.put(1454016428371L, 1010.25);
     metricValues.put(1454016488371L, 1012.25);
-    metricValues.put(1454016548371L, 1010.25);
-    metricValues.put(1454016608371L, 1010.25);
+    metricValues.put(1454016548371L, 1015.25);
+    metricValues.put(1454016608371L, 1020.25);
 
     Map<Long, Double> rates = HBaseTimelineMetricStore.updateValuesAsRate(new TreeMap<>(metricValues), true);
 
-    Assert.assertTrue(rates.size()==4);
-    Assert.assertTrue(rates.containsValue(-1.0));
+    Assert.assertTrue(rates.size() == 3);
     Assert.assertTrue(rates.containsValue(2.0));
-    Assert.assertTrue(rates.containsValue(0.0));
+    Assert.assertTrue(rates.containsValue(3.0));
+    Assert.assertTrue(rates.containsValue(5.0));
   }
 }


[17/50] [abbrv] ambari git commit: AMBARI-22045. Infra Solr client cleanup: make infra-solr-client script usable with symlinks (oleewere)

Posted by ao...@apache.org.
AMBARI-22045. Infra Solr client cleanup: make infra-solr-client script usable with symlinks (oleewere)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/520d8fcc
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/520d8fcc
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/520d8fcc

Branch: refs/heads/branch-3.0-perf
Commit: 520d8fcce38e9c2edf8d972625d5a9aa4663c04b
Parents: 653d2f2
Author: Oliver Szabo <ol...@gmail.com>
Authored: Sun Sep 24 01:08:11 2017 +0200
Committer: Oliver Szabo <ol...@gmail.com>
Committed: Mon Sep 25 20:18:02 2017 +0200

----------------------------------------------------------------------
 .../apache/ambari/infra/solr/AmbariSolrCloudCLI.java  | 12 ++++++------
 .../src/main/resources/log4j.properties               |  6 +++++-
 .../src/main/resources/solrCloudCli.sh                |  8 +++++++-
 .../src/main/resources/solrIndexHelper.sh             | 14 ++++++++++----
 .../0.1.0/properties/solr-client-log4j.properties.j2  |  4 ++++
 5 files changed, 32 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/520d8fcc/ambari-infra/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java b/ambari-infra/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
index 70bc232..95708d7 100644
--- a/ambari-infra/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
+++ b/ambari-infra/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
@@ -66,7 +66,7 @@ public class AmbariSolrCloudCLI {
       + "\n./solrCloudCli.sh --secure-znode -z host1:2181,host2:2181 -zn /ambari-solr -su logsearch,atlas,ranger --jaas-file /etc/myconf/jaas_file"
       + "\n./solrCloudCli.sh --unsecure-znode -z host1:2181,host2:2181 -zn /ambari-solr --jaas-file /etc/myconf/jaas_file"
       + "\n./solrCloudCli.sh --secure-solr-znode -z host1:2181,host2:2181 -zn /ambari-solr -su logsearch,atlas,ranger --jaas-file /etc/myconf/jaas_file"
-      + "\n./solrCloudCli.sh --setup-kerberos-plugin -z host1:2181,host2:2181 -zn /ambari-solr --security-json-location /etc/infra-solr/conf/security.json\n";
+      + "\n./solrCloudCli.sh --setup-kerberos-plugin -z host1:2181,host2:2181 -zn /ambari-solr --security-json-location /etc/infra-solr/conf/security.json\n ";
 
   public static void main(String[] args) {
     Options options = new Options();
@@ -126,22 +126,22 @@ public class AmbariSolrCloudCLI {
 
     final Option secureSolrZnodeOption = Option.builder("ssz")
       .longOpt(SECURE_SOLR_ZNODE_COMMAND)
-      .desc("Set acls for solr znode")
+      .desc("Set acls for solr znode (command)")
       .build();
 
     final Option secureZnodeOption = Option.builder("sz")
       .longOpt(SECURE_ZNODE_COMMAND)
-      .desc("Set acls for znode")
+      .desc("Set acls for znode (command)")
       .build();
 
     final Option unsecureZnodeOption = Option.builder("uz")
       .longOpt(UNSECURE_ZNODE_COMMAND)
-      .desc("Disable security for znode")
+      .desc("Disable security for znode (command)")
       .build();
 
     final Option removeAdminHandlerOption = Option.builder("rah")
       .longOpt(REMOVE_ADMIN_HANDLERS)
-      .desc("Remove AdminHandlers request handler from solrconfig.xml")
+      .desc("Remove AdminHandlers request handler from solrconfig.xml (command)")
       .build();
 
     final Option shardNameOption = Option.builder("sn")
@@ -428,7 +428,7 @@ public class AmbariSolrCloudCLI {
       } else {
         List<String> commands = Arrays.asList(CREATE_COLLECTION_COMMAND, CREATE_SHARD_COMMAND, UPLOAD_CONFIG_COMMAND,
           DOWNLOAD_CONFIG_COMMAND, CONFIG_CHECK_COMMAND, SET_CLUSTER_PROP, CREATE_ZNODE, SECURE_ZNODE_COMMAND, UNSECURE_ZNODE_COMMAND,
-          SECURE_SOLR_ZNODE_COMMAND, CHECK_ZNODE, SETUP_KERBEROS_PLUGIN);
+          SECURE_SOLR_ZNODE_COMMAND, CHECK_ZNODE, SETUP_KERBEROS_PLUGIN, REMOVE_ADMIN_HANDLERS);
         helpFormatter.printHelp(CMD_LINE_SYNTAX, options);
         exit(1, String.format("One of the supported commands is required (%s)", StringUtils.join(commands, "|")));
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/520d8fcc/ambari-infra/ambari-infra-solr-client/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-solr-client/src/main/resources/log4j.properties b/ambari-infra/ambari-infra-solr-client/src/main/resources/log4j.properties
index e8dca12..4779596 100644
--- a/ambari-infra/ambari-infra-solr-client/src/main/resources/log4j.properties
+++ b/ambari-infra/ambari-infra-solr-client/src/main/resources/log4j.properties
@@ -23,9 +23,13 @@ log4j.appender.stdout.Threshold=INFO
 log4j.appender.stdout.Target=System.out
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%m%n
+log4j.appender.stdout.filter.lvlRangeFilter=org.apache.log4j.varia.LevelRangeFilter
+log4j.appender.stdout.filter.lvlRangeFilter.LevelMax=WARN
 
 log4j.appender.stderr=org.apache.log4j.ConsoleAppender
 log4j.appender.stderr.Threshold=ERROR
 log4j.appender.stderr.Target=System.err
 log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
-log4j.appender.stderr.layout.ConversionPattern=%m%n
\ No newline at end of file
+log4j.appender.stderr.layout.ConversionPattern=%m%n
+log4j.appender.stderr.filter.lvlRangeFilter=org.apache.log4j.varia.LevelRangeFilter
+log4j.appender.stderr.filter.lvlRangeFilter.LevelMin=ERROR
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/520d8fcc/ambari-infra/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh b/ambari-infra/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh
index 7bfa864..ac7d59f 100644
--- a/ambari-infra/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh
+++ b/ambari-infra/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh
@@ -16,5 +16,11 @@
 
 JVM="java"
 sdir="`dirname \"$0\"`"
+ldir="`dirname "$(readlink -f "$0")"`"
 
-PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$sdir:$sdir/libs/*" org.apache.ambari.infra.solr.AmbariSolrCloudCLI ${1+"$@"}
\ No newline at end of file
+DIR="$sdir"
+if [ "$sdir" != "$ldir" ]; then
+  DIR="$ldir"
+fi
+
+PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR:$DIR/libs/*" org.apache.ambari.infra.solr.AmbariSolrCloudCLI ${1+"$@"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/520d8fcc/ambari-infra/ambari-infra-solr-client/src/main/resources/solrIndexHelper.sh
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-solr-client/src/main/resources/solrIndexHelper.sh b/ambari-infra/ambari-infra-solr-client/src/main/resources/solrIndexHelper.sh
index 12e6a77..1d219d6 100755
--- a/ambari-infra/ambari-infra-solr-client/src/main/resources/solrIndexHelper.sh
+++ b/ambari-infra/ambari-infra-solr-client/src/main/resources/solrIndexHelper.sh
@@ -16,6 +16,12 @@
 
 JVM="java"
 sdir="`dirname \"$0\"`"
+ldir="`dirname "$(readlink -f "$0")"`"
+
+DIR="$sdir"
+if [ "$sdir" != "$ldir" ]; then
+  DIR="$ldir"
+fi
 : ${JAVA_HOME:?"Please set the JAVA_HOME for lucene index migration!"}
 
 function print_help() {
@@ -48,7 +54,7 @@ function upgrade_core() {
   for coll in $SOLR_CORE_FILTER_ARR; do
     if [[ "$1" == *"$coll"* ]]; then
       echo "Core '$1' dir name contains $coll (core filter)'";
-      version=$(PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$sdir/libs/lucene-core-6.6.0.jar:$sdir/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.CheckIndex -fast $1|grep "   version="|sed -e 's/.*=//g'|head -1)
+      version=$(PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/libs/lucene-core-6.6.0.jar:$DIR/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.CheckIndex -fast $1|grep "   version="|sed -e 's/.*=//g'|head -1)
       if [ -z $version ] ; then
         echo "Core '$1' - Empty index?"
         return
@@ -58,7 +64,7 @@ function upgrade_core() {
         echo "Core '$1' - Already on version $version, not upgrading. Use -f or --force option to run upgrade anyway."
       else
         echo "Core '$1' - Index version is $version, upgrading ..."
-        PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$sdir/libs/lucene-core-6.6.0.jar:$sdir/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.IndexUpgrader -delete-prior-commits $1
+        PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/libs/lucene-core-6.6.0.jar:$DIR/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.IndexUpgrader -delete-prior-commits $1
         echo "Upgrading core '$1' has finished"
       fi
     fi
@@ -125,11 +131,11 @@ function upgrade_index() {
 
 function upgrade_index_tool() {
   # see: https://cwiki.apache.org/confluence/display/solr/IndexUpgrader+Tool
-  PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$sdir/libs/lucene-core-6.6.0.jar:$sdir/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.IndexUpgrader ${@}
+  PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/libs/lucene-core-6.6.0.jar:$DIR/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.IndexUpgrader ${@}
 }
 
 function check_index_tool() {
-  PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$sdir/libs/lucene-core-6.6.0.jar:$sdir/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.CheckIndex ${@}
+  PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$DIR/libs/lucene-core-6.6.0.jar:$DIR/libs/lucene-backward-codecs-6.6.0.jar" org.apache.lucene.index.CheckIndex ${@}
 }
 
 function main() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/520d8fcc/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/properties/solr-client-log4j.properties.j2
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/properties/solr-client-log4j.properties.j2 b/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/properties/solr-client-log4j.properties.j2
index 0d0adc3..df77961 100644
--- a/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/properties/solr-client-log4j.properties.j2
+++ b/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/properties/solr-client-log4j.properties.j2
@@ -30,9 +30,13 @@ log4j.appender.stdout.Threshold=INFO
 log4j.appender.stdout.Target=System.out
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%m%n
+log4j.appender.stdout.filter.lvlRangeFilter=org.apache.log4j.varia.LevelRangeFilter
+log4j.appender.stdout.filter.lvlRangeFilter.LevelMax=WARN
 
 log4j.appender.stderr=org.apache.log4j.ConsoleAppender
 log4j.appender.stderr.Threshold=ERROR
 log4j.appender.stderr.Target=System.err
 log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
 log4j.appender.stderr.layout.ConversionPattern=%m%n
+log4j.appender.stderr.filter.lvlRangeFilter=org.apache.log4j.varia.LevelRangeFilter
+log4j.appender.stderr.filter.lvlRangeFilter.LevelMin=ERROR


[09/50] [abbrv] ambari git commit: AMBARI-22042 Final Properties filter does not work for Config Groups. (atkach)

Posted by ao...@apache.org.
AMBARI-22042 Final Properties filter does not work for Config Groups. (atkach)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/eb5bcef3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/eb5bcef3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/eb5bcef3

Branch: refs/heads/branch-3.0-perf
Commit: eb5bcef3d4382ae059e572c45c799969c6cb7dde
Parents: 06d21bb
Author: Andrii Tkach <at...@apache.org>
Authored: Mon Sep 25 13:50:49 2017 +0300
Committer: Andrii Tkach <at...@apache.org>
Committed: Mon Sep 25 13:57:17 2017 +0300

----------------------------------------------------------------------
 ambari-web/app/views/common/configs/service_config_view.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/eb5bcef3/ambari-web/app/views/common/configs/service_config_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/service_config_view.js b/ambari-web/app/views/common/configs/service_config_view.js
index a53f6cd..fe45c79 100644
--- a/ambari-web/app/views/common/configs/service_config_view.js
+++ b/ambari-web/app/views/common/configs/service_config_view.js
@@ -272,7 +272,8 @@ App.ServiceConfigView = Em.View.extend({
         var passesFilters = true;
 
         selectedFilters.forEach(function (filter) {
-          if (config.get(filter.attributeName) !== filter.attributeValue) {
+          if (config.get(filter.attributeName) !== filter.attributeValue &&
+            !(config.get('overrides') && config.get('overrides').someProperty(filter.attributeName, filter.attributeValue))) {
             passesFilters = false;
           }
         });


[22/50] [abbrv] ambari git commit: AMBARI-19135 : AMS build artifacts are not uploaded to maven central. (avijayan)

Posted by ao...@apache.org.
AMBARI-19135 : AMS build artifacts are not uploaded to maven central. (avijayan)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/84fed85a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/84fed85a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/84fed85a

Branch: refs/heads/branch-3.0-perf
Commit: 84fed85ac9019a9b72d3db1619c7dbdf18e1d078
Parents: 12c9ca7
Author: Aravindan Vijayan <av...@hortonworks.com>
Authored: Mon Sep 25 16:26:28 2017 -0700
Committer: Aravindan Vijayan <av...@hortonworks.com>
Committed: Mon Sep 25 16:26:28 2017 -0700

----------------------------------------------------------------------
 ambari-metrics/pom.xml | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/84fed85a/ambari-metrics/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-metrics/pom.xml b/ambari-metrics/pom.xml
index 560ef11..a14b8fd 100644
--- a/ambari-metrics/pom.xml
+++ b/ambari-metrics/pom.xml
@@ -317,5 +317,32 @@
         </dependency>
       </dependencies>
     </profile>
+    <profile>
+      <id>sign-artifacts</id>
+      <activation>
+        <property>
+          <name>performRelease</name>
+          <value>true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-gpg-plugin</artifactId>
+            <version>1.6</version>
+            <executions>
+              <execution>
+                <id>sign-artifacts</id>
+                <phase>verify</phase>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
   </profiles>
 </project>


[42/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
index fd49b94,614af1e..e7359a7
--- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
@@@ -153,6 -154,8 +154,7 @@@ CREATE TABLE repo_version 
    display_name VARCHAR(128) NOT NULL,
    repositories VARCHAR(3000) NOT NULL,
    repo_type VARCHAR(255) DEFAULT 'STANDARD' NOT NULL,
+   hidden SMALLINT NOT NULL DEFAULT 0,
 -  resolved SMALLINT NOT NULL DEFAULT 0,
    version_url VARCHAR(1024),
    version_xml CLOB,
    version_xsd VARCHAR(512),

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index 310208d,02f6e3e..c0b2f0c
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@@ -154,6 -155,8 +155,7 @@@ CREATE TABLE repo_version 
    display_name VARCHAR2(128) NOT NULL,
    repositories CLOB NOT NULL,
    repo_type VARCHAR2(255) DEFAULT 'STANDARD' NOT NULL,
+   hidden NUMBER(1) DEFAULT 0 NOT NULL,
 -  resolved NUMBER(1) DEFAULT 0 NOT NULL,
    version_url VARCHAR(1024),
    version_xml CLOB,
    version_xsd VARCHAR(512),

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
index 5a58ef8,f64ff80..7f39535
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
@@@ -152,6 -153,8 +153,7 @@@ CREATE TABLE repo_version 
    display_name VARCHAR(128) NOT NULL,
    repositories TEXT NOT NULL,
    repo_type VARCHAR(255) DEFAULT 'STANDARD' NOT NULL,
+   hidden SMALLINT NOT NULL DEFAULT 0,
 -  resolved BIT NOT NULL DEFAULT 0,
    version_url VARCHAR(1024),
    version_xml TEXT,
    version_xsd VARCHAR(512),

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
index 8c7a31d,7a3feaf..aa06c4d
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@@ -166,6 -167,8 +167,7 @@@ CREATE TABLE repo_version 
    display_name VARCHAR(128) NOT NULL,
    repositories VARCHAR(MAX) NOT NULL,
    repo_type VARCHAR(255) DEFAULT 'STANDARD' NOT NULL,
+   hidden SMALLINT NOT NULL DEFAULT 0,
 -  resolved BIT NOT NULL DEFAULT 0,
    version_url VARCHAR(1024),
    version_xml VARCHAR(MAX),
    version_xsd VARCHAR(512),

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/params.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/templates/input.config-accumulo.json.j2
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/templates/input.config-accumulo.json.j2
index d093732,d093732..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/templates/input.config-accumulo.json.j2
+++ /dev/null
@@@ -1,92 -1,92 +1,0 @@@
--{#
-- # Licensed to the Apache Software Foundation (ASF) under one
-- # or more contributor license agreements.  See the NOTICE file
-- # distributed with this work for additional information
-- # regarding copyright ownership.  The ASF licenses this file
-- # to you under the Apache License, Version 2.0 (the
-- # "License"); you may not use this file except in compliance
-- # with the License.  You may obtain a copy of the License at
-- #
-- #   http://www.apache.org/licenses/LICENSE-2.0
-- #
-- # Unless required by applicable law or agreed to in writing, software
-- # distributed under the License is distributed on an "AS IS" BASIS,
-- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- # See the License for the specific language governing permissions and
-- # limitations under the License.
-- #}
--{
--  "input":[
--    {
--      "type":"accumulo_gc",
--      "rowtype":"service",
--      "path":"{{default('/configurations/accumulo-env/accumulo_log_dir', '/var/log/accumulo')}}/gc_*.log"
--    },
--    {
--      "type":"accumulo_master",
--      "rowtype":"service",
--      "path":"{{default('/configurations/accumulo-env/accumulo_log_dir', '/var/log/accumulo')}}/master_*.log"
--    },
--    {
--      "type":"accumulo_monitor",
--      "rowtype":"service",
--      "path":"{{default('/configurations/accumulo-env/accumulo_log_dir', '/var/log/accumulo')}}/monitor_*.log"
--    },
--    {
--      "type":"accumulo_tracer",
--      "rowtype":"service",
--      "path":"{{default('/configurations/accumulo-env/accumulo_log_dir', '/var/log/accumulo')}}/tracer_*.log"
--    },
--    {
--      "type":"accumulo_tserver",
--      "rowtype":"service",
--      "path":"{{default('/configurations/accumulo-env/accumulo_log_dir', '/var/log/accumulo')}}/tserver_*.log"
--    }
--  ],
--  "filter":[
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "accumulo_master"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} [%-8c{2}] %-5p: %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}\\[%{JAVACLASS:logger_name}\\]%{SPACE}%{LOGLEVEL:level}:%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    },
--    {
--      "filter":"grok",
--      "comment":"This one has one extra space after LEVEL",
--      "conditions":{
--        "fields":{
--          "type":[
--            "accumulo_gc",
--            "accumulo_monitor",
--            "accumulo_tracer",
--            "accumulo_tserver"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} [%-8c{2}] %-5p: %X{application} %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}\\[%{JAVACLASS:logger_name}\\]%{SPACE}%{LOGLEVEL:level}%{SPACE}:%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    }
--  ]
--}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/package/scripts/params.py
index 53981ef,eba1db9..e039606
--- a/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/AMBARI_INFRA/0.1.0/package/scripts/params.py
@@@ -59,9 -62,11 +62,11 @@@ user_group = config['configurations']['
  fetch_nonlocal_groups = config['configurations']['cluster-env']["fetch_nonlocal_groups"]
  
  # shared configs
- java64_home = config['ambariLevelParams']['java_home']
 -java_home = config['hostLevelParams']['java_home']
 -ambari_java_home = default("/commandParams/ambari_java_home", None)
++java_home = config['ambariLevelParams']['java_home']
++ambari_java_home = default("/ambariLevelParams/ambari_java_home", None)
+ java64_home = ambari_java_home if ambari_java_home is not None else java_home
  java_exec = format("{java64_home}/bin/java")
 -zookeeper_hosts_list = config['clusterHostInfo']['zookeeper_hosts']
 +zookeeper_hosts_list = config['clusterHostInfo']['zookeeper_server_hosts']
  zookeeper_hosts_list.sort()
  # get comma separated list of zookeeper hosts from clusterHostInfo
  zookeeper_hosts = ",".join(zookeeper_hosts_list)

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py
index cd5b0f5,0242b73..3e86347
--- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py
@@@ -95,14 -100,18 +100,18 @@@ else
  metric_truststore_path= default("/configurations/ams-ssl-client/ssl.client.truststore.location", "")
  metric_truststore_type= default("/configurations/ams-ssl-client/ssl.client.truststore.type", "")
  metric_truststore_password= default("/configurations/ams-ssl-client/ssl.client.truststore.password", "")
- metric_truststore_alias = default("/configurations/ams-ssl-client/ssl.client.truststore.alias", None)
- if not metric_truststore_alias:
-   metric_truststore_alias = metric_collector_host
  metric_truststore_ca_certs='ca.pem'
  
+ metric_truststore_alias_list = []
+ for host in ams_collector_hosts.split(","):
+   metric_truststore_alias = default("/configurations/ams-ssl-client/{host}.ssl.client.truststore.alias", None)
+   if not metric_truststore_alias:
+     metric_truststore_alias = host
+   metric_truststore_alias_list.append(metric_truststore_alias)
+ 
 -agent_cache_dir = config['hostLevelParams']['agentCacheDir']
 -service_package_folder = config['commandParams']['service_package_folder']
 -stack_name = default("/hostLevelParams/stack_name", None)
 +agent_cache_dir = config['agentLevelParams']['agentCacheDir']
 +service_package_folder = config['serviceLevelParams']['service_package_folder']
 +stack_name = default("/clusterLevelParams/stack_name", None)
  dashboards_dirs = []
  # Stack specific
  dashboards_dirs.append(os.path.join(agent_cache_dir, service_package_folder,
@@@ -198,9 -207,15 +207,15 @@@ security_enabled = False if not is_hbas
  # this is "hadoop-metrics.properties" for 1.x stacks
  metric_prop_file_name = "hadoop-metrics2-hbase.properties"
  
+ java_home = config['hostLevelParams']['java_home']
 -ambari_java_home = default("/commandParams/ambari_java_home", None)
++ambari_java_home = default("/ambariLevelParams/ambari_java_home", None)
  # not supporting 32 bit jdk.
- java64_home = config['ambariLevelParams']['java_home']
- java_version = expect("/ambariLevelParams/java_version", int)
+ java64_home = ambari_java_home if ambari_java_home is not None else java_home
 -ambari_java_version = default("/commandParams/ambari_java_version", None)
++ambari_java_version = default("/ambariLevelParams/ambari_java_version", None)
+ if ambari_java_version:
 -  java_version = expect("/commandParams/ambari_java_version", int)
++  java_version = expect("/ambariLevelParams/ambari_java_version", int)
+ else :
 -  java_version = expect("/hostLevelParams/java_version", int)
++  java_version = expect("/ambariLevelParams/java_version", int)
  
  metrics_collector_heapsize = default('/configurations/ams-env/metrics_collector_heapsize', "512")
  metrics_report_interval = default("/configurations/ams-site/timeline.metrics.sink.report.interval", 60)
@@@ -288,12 -308,17 +308,17 @@@ service_check_data = functions.get_uniq
  user_group = config['configurations']['cluster-env']["user_group"]
  hadoop_user = "hadoop"
  
+ kinit_path_local = functions.get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
  kinit_cmd = ""
+ klist_path_local = functions.get_klist_path(default('/configurations/kerberos-env/executable_search_paths', None))
+ klist_cmd = ""
  
  if security_enabled:
 -  _hostname_lowercase = config['hostname'].lower()
 +  _hostname_lowercase = config['agentLevelParams']['hostname'].lower()
    client_jaas_config_file = format("{hbase_conf_dir}/hbase_client_jaas.conf")
    smoke_user_keytab = config['configurations']['cluster-env']['smokeuser_keytab']
+   smoke_user_princ = config['configurations']['cluster-env']['smokeuser_principal_name']
+   smoke_user = config['configurations']['cluster-env']['smokeuser']
    hbase_user_keytab = config['configurations']['ams-hbase-env']['hbase_user_keytab']
  
    ams_collector_jaas_config_file = format("{hbase_conf_dir}/ams_collector_jaas.conf")

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/templates/input.config-ambari-metrics.json.j2
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/templates/input.config-ambari-metrics.json.j2
index ef823b2,ef823b2..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/templates/input.config-ambari-metrics.json.j2
+++ /dev/null
@@@ -1,169 -1,169 +1,0 @@@
--{#
-- # Licensed to the Apache Software Foundation (ASF) under one
-- # or more contributor license agreements.  See the NOTICE file
-- # distributed with this work for additional information
-- # regarding copyright ownership.  The ASF licenses this file
-- # to you under the Apache License, Version 2.0 (the
-- # "License"); you may not use this file except in compliance
-- # with the License.  You may obtain a copy of the License at
-- #
-- #   http://www.apache.org/licenses/LICENSE-2.0
-- #
-- # Unless required by applicable law or agreed to in writing, software
-- # distributed under the License is distributed on an "AS IS" BASIS,
-- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- # See the License for the specific language governing permissions and
-- # limitations under the License.
-- #}
--{
--  "input":[
--    {
--      "type":"ams_hbase_master",
--      "rowtype":"service",
--      "path":"{{default('/configurations/ams-env/metrics_collector_log_dir', '/var/log/ambari-metrics-collector')}}/hbase-ams-master-*.log"
--    },
--    {
--      "type":"ams_hbase_regionserver",
--      "rowtype":"service",
--      "path":"{{default('/configurations/ams-env/metrics_collector_log_dir', '/var/log/ambari-metrics-collector')}}/hbase-ams-regionserver-*.log"
--    },
--    {
--      "type":"ams_collector",
--      "rowtype":"service",
--      "path":"{{default('/configurations/ams-env/metrics_collector_log_dir', '/var/log/ambari-metrics-collector')}}/ambari-metrics-collector.log"
--    },
--    {
--      "type":"ams_monitor",
--      "rowtype":"service",
--      "path":"{{default('/configurations/ams-env/metrics_monitor_log_dir', '/var/log/ambari-metrics-monitor')}}/ambari-metrics-monitor.out"
--    },
--    {
--      "type":"ams_grafana",
--      "rowtype":"service",
--      "path":"{{default('/configurations/ams-grafana-env/metrics_grafana_log_dir', '/var/log/ambari-metrics-grafana')}}/grafana.log"
--    }
--  ],
--  "filter":[
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "ams_collector"
--          ]
--         }
--      },
--      "log4j_format":"%d{ISO8601} %p %c: %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}:%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    },
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "ams_hbase_master",
--            "ams_hbase_regionserver"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} %-5p [%t] %c{2}: %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOGLEVEL:level}%{SPACE}\\[%{DATA:thread_name}\\]%{SPACE}%{JAVACLASS:logger_name}:%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    },
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "ams_grafana"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} %-5p [%t] %c{2}: %m%n",
--      "multiline_pattern":"^(%{DATESTAMP:logtime})",
--      "message_pattern":"(?m)^%{DATESTAMP:logtime}%{SPACE}\\[%{WORD:level}\\]%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy/MM/dd HH:mm:ss"
--          }
--        },
--        "level":[
--          {
--            "map_fieldvalue":{
--              "pre_value":"I",
--              "post_value":"INFO"
--            }
--          },
--          {
--            "map_fieldvalue":{
--              "pre_value":"W",
--              "post_value":"WARN"
--            }
--          },
--          {
--            "map_fieldvalue":{
--              "pre_value":"D",
--              "post_value":"DEBUG"
--            }
--          },
--          {
--            "map_fieldvalue":{
--              "pre_value":"E",
--              "post_value":"ERROR"
--            }
--          },
--          {
--            "map_fieldvalue":{
--              "pre_value":"F",
--              "post_value":"FATAL"
--            }
--          }
--        ]
--      }
--    },
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "ams_monitor"
--          ]
--        }
--      },
--      "log4j_format":"",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}\\[%{LOGLEVEL:level}\\]%{SPACE}%{JAVAFILE:file}:%{INT:line_number}%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      },
--      "level":[
--        {
--          "map_fieldvalue":{
--            "pre_value":"WARNING",
--            "post_value":"WARN"
--          }
--        }
--      ]
--    }
--  ]
-- }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
index a53487f,968ceed..97d1b62
--- a/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
@@@ -100,9 -101,10 +101,10 @@@ if security_enabled
  
  # New Cluster Stack Version that is defined during the RESTART of a Stack Upgrade
  version = default("/commandParams/version", None)
+ version_for_stack_feature_checks = get_stack_feature_version(config)
  
  # stack version
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
  
  metadata_home = format('{stack_root}/current/atlas-server')
@@@ -125,7 -127,8 +127,8 @@@ atlas_jaas_file = format("{conf_dir}/at
  user_group = config['configurations']['cluster-env']['user_group']
  
  # metadata env
 -java64_home = config['hostLevelParams']['java_home']
 -ambari_java_home = default("/commandParams/ambari_java_home", java64_home)
 +java64_home = config['ambariLevelParams']['java_home']
++ambari_java_home = default("/ambariLevelParams/ambari_java_home", java64_home)
  java_exec = format("{java64_home}/bin/java")
  env_sh_template = config['configurations']['atlas-env']['content']
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/DRUID/0.9.2/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/DRUID/0.9.2/package/scripts/params.py
index fc96821,fd1cde6..8430ced
--- a/ambari-server/src/main/resources/common-services/DRUID/0.9.2/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/DRUID/0.9.2/package/scripts/params.py
@@@ -50,10 -52,14 +52,14 @@@ stack_name = default("/clusterLevelPara
  # stack version
  stack_version = default("/commandParams/version", None)
  
+ # un-formatted stack version
 -stack_version_unformatted = str(config['hostLevelParams']['stack_version'])
++stack_version_unformatted = str(config['clusterLevelParams']['stack_version'])
+ 
  # default role to coordinator needed for service checks
  component_directory = Script.get_component_from_role(SERVER_ROLE_DIRECTORY_MAP, "DRUID_COORDINATOR")
  
 -hostname = config['hostname']
 +hostname = config['agentLevelParams']['hostname']
+ sudo = AMBARI_SUDO_BINARY
  
  # default druid parameters
  druid_home = format("{stack_root}/current/{component_directory}")
@@@ -185,47 -192,9 +192,9 @@@ if has_metric_collector
          metric_collector_protocol = 'http'
      pass
  
- superset_home_dir = format("{stack_root}/current/druid-superset")
- superset_bin_dir = format("{superset_home_dir}/bin")
- superset_log_dir = default("/configurations/druid-superset-env/superset_log_dir", '/var/log/superset')
- superset_pid_dir = status_params.superset_pid_dir
- superset_config_dir = '/etc/superset/conf'
- superset_admin_user = config['configurations']['druid-superset-env']['superset_admin_user']
- superset_admin_password = config['configurations']['druid-superset-env']['superset_admin_password']
- superset_admin_firstname = config['configurations']['druid-superset-env']['superset_admin_firstname']
- superset_admin_lastname = config['configurations']['druid-superset-env']['superset_admin_lastname']
- superset_admin_email = config['configurations']['druid-superset-env']['superset_admin_email']
- superset_env_sh_template = config['configurations']['druid-superset-env']['content']
- superset_protocol = "http"
- superset_webserver_address=config['configurations']['druid-superset']['SUPERSET_WEBSERVER_ADDRESS']
- superset_webserver_port = config['configurations']['druid-superset']['SUPERSET_WEBSERVER_PORT']
- superset_timeout = config['configurations']['druid-superset']['SUPERSET_TIMEOUT']
- superset_workers =  config['configurations']['druid-superset']['SUPERSET_WORKERS']
- superset_hosts = default('/clusterHostInfo/superset_hosts', None)
- 
- # superset database configs
- superset_db_type = config['configurations']['druid-superset']['SUPERSET_DATABASE_TYPE']
- superset_db_name = config['configurations']['druid-superset']['SUPERSET_DATABASE_NAME']
- superset_db_password = config['configurations']['druid-superset']['SUPERSET_DATABASE_PASSWORD']
- superset_db_user = config['configurations']['druid-superset']['SUPERSET_DATABASE_USER']
- superset_db_port = config['configurations']['druid-superset']['SUPERSET_DATABASE_PORT']
- superset_db_host = config['configurations']['druid-superset']['SUPERSET_DATABASE_HOSTNAME']
- 
- superset_db_uri = None
- if superset_db_type == "sqlite":
-   superset_db_uri = format("sqlite:///{superset_config_dir}/{superset_db_name}.db")
- elif superset_db_type == "postgresql":
-   superset_db_uri = format("postgresql+pygresql://{superset_db_user}:{superset_db_password}@{superset_db_host}:{superset_db_port}/{superset_db_name}")
- elif superset_db_type == "mysql":
-   superset_db_uri = format("mysql+pymysql://{superset_db_user}:{superset_db_password}@{superset_db_host}:{superset_db_port}/{superset_db_name}")
- 
- druid_coordinator_hosts = default("/clusterHostInfo/druid_coordinator_hosts", [])
- druid_coordinator_host = ""
- if not len(druid_coordinator_hosts) == 0:
-   druid_coordinator_host = druid_coordinator_hosts[0]
- druid_router_hosts = default("/clusterHostInfo/druid_router_hosts", [])
- druid_router_host = ""
- if not len(druid_router_hosts) == 0:
-   druid_router_host = druid_router_hosts[0]
- druid_coordinator_port = config['configurations']['druid-coordinator']['druid.port']
- druid_router_port = config['configurations']['druid-router']['druid.port']
+ # Create current Hadoop Clients  Libs
 -stack_version_unformatted = str(config['hostLevelParams']['stack_version'])
++stack_version_unformatted = str(config['clusterLevelParams']['stack_version'])
+ io_compression_codecs = default("/configurations/core-site/io.compression.codecs", None)
+ lzo_enabled = io_compression_codecs is not None and "com.hadoop.compression.lzo" in io_compression_codecs.lower()
+ lzo_packages = get_lzo_packages(stack_version_unformatted)
+ hadoop_lib_home = stack_root + '/' + stack_version + '/hadoop/lib'

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_linux.py
index 3031e1b,b8e709a..858e6ab
--- a/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_linux.py
@@@ -36,20 -35,16 +35,16 @@@ config = Script.get_config(
  stack_root = status_params.stack_root
  stack_name = status_params.stack_name
  
 -agent_stack_retry_on_unavailability = config['hostLevelParams']['agent_stack_retry_on_unavailability']
 -agent_stack_retry_count = expect("/hostLevelParams/agent_stack_retry_count", int)
 +agent_stack_retry_on_unavailability = config['ambariLevelParams']['agent_stack_retry_on_unavailability']
 +agent_stack_retry_count = expect("/ambariLevelParams/agent_stack_retry_count", int)
  
- # New Cluster Stack Version that is defined during the RESTART of a Rolling Upgrade
- version = default("/commandParams/version", None)
+ version = stack_features.get_stack_feature_version(config)
  
  stack_version_unformatted = status_params.stack_version_unformatted
  stack_version_formatted = status_params.stack_version_formatted
  upgrade_direction = default("/commandParams/upgrade_direction", None)
 -jdk_location = config['hostLevelParams']['jdk_location']
 +jdk_location = config['ambariLevelParams']['jdk_location']
  
- # current host stack version
- current_version = default("/hostLevelParams/current_version", None)
- current_version_formatted = format_stack_version(current_version)
  
  etc_prefix_dir = "/etc/falcon"
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py
index 509d9de,0e0c9aa..afbbb5f
--- a/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py
@@@ -88,9 -88,18 +88,18 @@@ if 0 != len(ganglia_server_hosts)
  
  hostname = None
  if config.has_key('hostname'):
 -  hostname = config['hostname']
 +  hostname = config['agentLevelParams']['hostname']
  
- ams_collector_hosts = ",".join(default("/clusterHostInfo/metrics_collector_hosts", []))
+ set_instanceId = "false"
+ cluster_name = config["clusterName"]
+ 
+ if 'cluster-env' in config['configurations'] and \
+         'metrics_collector_external_hosts' in config['configurations']['cluster-env']:
+   ams_collector_hosts = config['configurations']['cluster-env']['metrics_collector_external_hosts']
+   set_instanceId = "true"
+ else:
+   ams_collector_hosts = ",".join(default("/clusterHostInfo/metrics_collector_hosts", []))
+ 
  has_metric_collector = not len(ams_collector_hosts) == 0
  metric_collector_port = None
  if has_metric_collector:

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
index 7814f1c,3a16c5e..58b44c4
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
@@@ -176,11 -191,14 +191,14 @@@ if has_metric_collector
  metrics_report_interval = default("/configurations/ams-site/timeline.metrics.sink.report.interval", 60)
  metrics_collection_period = default("/configurations/ams-site/timeline.metrics.sink.collection.period", 10)
  
+ host_in_memory_aggregation = default("/configurations/ams-site/timeline.metrics.host.inmemory.aggregation", True)
+ host_in_memory_aggregation_port = default("/configurations/ams-site/timeline.metrics.host.inmemory.aggregation.port", 61888)
+ 
  # if hbase is selected the hbase_rs_hosts, should not be empty, but still default just in case
  if 'slave_hosts' in config['clusterHostInfo']:
-   rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/datanode_hosts') #if hbase_rs_hosts not given it is assumed that region servers on same nodes as slaves
 -  rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/slave_hosts') #if hbase_rs_hosts not given it is assumed that region servers on same nodes as slaves
++  rs_hosts = default('/clusterHostInfo/hbase_regionserver_hosts', '/clusterHostInfo/datanode_hosts') #if hbase_rs_hosts not given it is assumed that region servers on same nodes as slaves
  else:
--  rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/all_hosts') 
++  rs_hosts = default('/clusterHostInfo/hbase_regionserver_hosts', '/clusterHostInfo/all_hosts')
  
  smoke_test_user = config['configurations']['cluster-env']['smokeuser']
  smokeuser_principal =  config['configurations']['cluster-env']['smokeuser_principal_name']
@@@ -226,9 -244,10 +244,10 @@@ else
  hbase_env_sh_template = config['configurations']['hbase-env']['content']
  
  hbase_hdfs_root_dir = config['configurations']['hbase-site']['hbase.rootdir']
+ hbase_hdfs_root_dir_protocol = urlparse(hbase_hdfs_root_dir).scheme
  hbase_staging_dir = "/apps/hbase/staging"
  #for create_hdfs_directory
 -hostname = config["hostname"]
 +hostname = config['agentLevelParams']['hostname']
  hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab']
  hdfs_user = config['configurations']['hadoop-env']['hdfs_user']
  hdfs_principal_name = config['configurations']['hadoop-env']['hdfs_principal_name']

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HBASE/2.0.0.3.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/HBASE/2.0.0.3.0/package/scripts/params_linux.py
index 4371753,b7e2b89..afab8f5
--- a/ambari-server/src/main/resources/common-services/HBASE/2.0.0.3.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/2.0.0.3.0/package/scripts/params_linux.py
@@@ -173,9 -173,9 +173,9 @@@ metrics_collection_period = default("/c
  
  # if hbase is selected the hbase_rs_hosts, should not be empty, but still default just in case
  if 'slave_hosts' in config['clusterHostInfo']:
-   rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/datanode_hosts') #if hbase_rs_hosts not given it is assumed that region servers on same nodes as slaves
 -  rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/slave_hosts') #if hbase_rs_hosts not given it is assumed that region servers on same nodes as slaves
++  rs_hosts = default('/clusterHostInfo/hbase_regionserver_hosts', '/clusterHostInfo/datanode_hosts') #if hbase_rs_hosts not given it is assumed that region servers on same nodes as slaves
  else:
--  rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/all_hosts') 
++  rs_hosts = default('/clusterHostInfo/hbase_regionserver_hosts', '/clusterHostInfo/all_hosts')
  
  smoke_test_user = config['configurations']['cluster-env']['smokeuser']
  smokeuser_principal =  config['configurations']['cluster-env']['smokeuser_principal_name']

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
index f805e57,76b430b..3b4ab30
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
@@@ -54,10 -54,13 +54,13 @@@ architecture = get_architecture(
  stack_name = status_params.stack_name
  stack_root = Script.get_stack_root()
  upgrade_direction = default("/commandParams/upgrade_direction", None)
+ rolling_restart = default("/commandParams/rolling_restart", False)
+ rolling_restart_safemode_exit_timeout = default("/configurations/cluster-env/namenode_rolling_restart_safemode_exit_timeout", None)
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
 -agent_stack_retry_on_unavailability = config['hostLevelParams']['agent_stack_retry_on_unavailability']
 -agent_stack_retry_count = expect("/hostLevelParams/agent_stack_retry_count", int)
 +agent_stack_retry_on_unavailability = config['ambariLevelParams']['agent_stack_retry_on_unavailability']
 +agent_stack_retry_count = expect("/ambariLevelParams/agent_stack_retry_count", int)
  
  # there is a stack upgrade which has not yet been finalized; it's currently suspended
  upgrade_suspended = default("roleParams/upgrade_suspended", False)
@@@ -161,15 -164,21 +164,21 @@@ falcon_user = config['configurations'][
  #exclude file
  hdfs_exclude_file = default("/clusterHostInfo/decom_dn_hosts", [])
  exclude_file_path = config['configurations']['hdfs-site']['dfs.hosts.exclude']
- update_exclude_file_only = default("/commandParams/update_exclude_file_only",False)
 -slave_hosts = default("/clusterHostInfo/slave_hosts", [])
++slave_hosts = default("/clusterHostInfo/datanode_hosts", [])
+ include_file_path = default("/configurations/hdfs-site/dfs.hosts", None)
+ hdfs_include_file = None
+ manage_include_files = default("/configurations/hdfs-site/manage.include.files", False)
+ if include_file_path and manage_include_files:
+   hdfs_include_file = slave_hosts
+ update_files_only = default("/commandParams/update_files_only",False)
  command_phase = default("/commandParams/phase","")
  
  klist_path_local = get_klist_path(default('/configurations/kerberos-env/executable_search_paths', None))
  kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
  #hosts
 -hostname = config["hostname"]
 +hostname = config['agentLevelParams']['hostname']
 +rm_host = default("/clusterHostInfo/resourcemanager_hosts", [])
- slave_hosts = default("/clusterHostInfo/datanode_hosts", [])
+ public_hostname = config["public_hostname"]
 -rm_host = default("/clusterHostInfo/rm_host", [])
  oozie_servers = default("/clusterHostInfo/oozie_server", [])
  hcat_server_hosts = default("/clusterHostInfo/webhcat_server_host", [])
  hive_server_host =  default("/clusterHostInfo/hive_server_host", [])

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_windows.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/templates/input.config-hdfs.json.j2
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/templates/input.config-hdfs.json.j2
index ed7abf6,ed7abf6..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/templates/input.config-hdfs.json.j2
+++ /dev/null
@@@ -1,216 -1,216 +1,0 @@@
--{#
-- # Licensed to the Apache Software Foundation (ASF) under one
-- # or more contributor license agreements.  See the NOTICE file
-- # distributed with this work for additional information
-- # regarding copyright ownership.  The ASF licenses this file
-- # to you under the Apache License, Version 2.0 (the
-- # "License"); you may not use this file except in compliance
-- # with the License.  You may obtain a copy of the License at
-- #
-- #   http://www.apache.org/licenses/LICENSE-2.0
-- #
-- # Unless required by applicable law or agreed to in writing, software
-- # distributed under the License is distributed on an "AS IS" BASIS,
-- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- # See the License for the specific language governing permissions and
-- # limitations under the License.
-- #}
--{
--  "input":[
--    {
--      "type":"hdfs_datanode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-datanode-*.log"
--    },
--    {
--      "type":"hdfs_namenode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-namenode-*.log"
--    },
--    {
--      "type":"hdfs_journalnode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-journalnode-*.log"
--    },
--    {
--      "type":"hdfs_secondarynamenode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-secondarynamenode-*.log"
--    },
--    {
--      "type":"hdfs_zkfc",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-zkfc-*.log"
--    },
--    {
--      "type":"hdfs_nfs3",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-nfs3-*.log"
--    },
--    {
--      "type":"hdfs_audit",
--      "rowtype":"audit",
--      "is_enabled":"true",
--      "add_fields":{
--        "logType":"HDFSAudit",
--        "enforcer":"hadoop-acl",
--        "repoType":"1",
--        "repo":"hdfs"
--      },
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hdfs-audit.log"
--    }
--  ],
--  "filter":[
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_datanode",
--            "hdfs_journalnode",
--            "hdfs_secondarynamenode",
--            "hdfs_namenode",
--            "hdfs_zkfc",
--            "hdfs_nfs3"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}%{SPACE}\\(%{JAVAFILE:file}:%{JAVAMETHOD:method}\\(%{INT:line_number}\\)\\)%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    },
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_audit"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:evtTime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:evtTime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}:%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "evtTime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    },
--    {
--      "filter":"keyvalue",
--      "sort_order":1,
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_audit"
--          ]
--        }
--      },
--      "source_field":"log_message",
--      "value_split":"=",
--      "field_split":"\t",
--      "post_map_values":{
--        "src":{
--          "map_fieldname":{
--            "new_fieldname":"resource"
--          }
--        },
--        "ip":{
--          "map_fieldname":{
--            "new_fieldname":"cliIP"
--          }
--        },
--        "allowed":[
--          {
--            "map_fieldvalue":{
--              "pre_value":"true",
--              "post_value":"1"
--            }
--          },
--          {
--            "map_fieldvalue":{
--              "pre_value":"false",
--              "post_value":"0"
--            }
--          },
--          {
--            "map_fieldname":{
--              "new_fieldname":"result"
--            }
--          }
--        ],
--        "cmd":{
--          "map_fieldname":{
--            "new_fieldname":"action"
--          }
--        },
--        "proto":{
--          "map_fieldname":{
--            "new_fieldname":"cliType"
--          }
--        },
--        "callerContext":{
--          "map_fieldname":{
--            "new_fieldname":"req_caller_id"
--          }
--        }
--      }
--    },
--    {
--      "filter":"grok",
--      "sort_order":2,
--      "source_field":"ugi",
--      "remove_source_field":"false",
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_audit"
--          ]
--        }
--      },
--      "message_pattern":"%{USERNAME:p_user}.+auth:%{USERNAME:p_authType}.+via %{USERNAME:k_user}.+auth:%{USERNAME:k_authType}|%{USERNAME:user}.+auth:%{USERNAME:authType}|%{USERNAME:x_user}",
--      "post_map_values":{
--        "user":{
--          "map_fieldname":{
--            "new_fieldname":"reqUser"
--          }
--        },
--        "x_user":{
--          "map_fieldname":{
--            "new_fieldname":"reqUser"
--          }
--        },
--        "p_user":{
--          "map_fieldname":{
--            "new_fieldname":"reqUser"
--          }
--        },
--        "k_user":{
--          "map_fieldname":{
--            "new_fieldname":"proxyUsers"
--          }
--        },
--        "p_authType":{
--          "map_fieldname":{
--            "new_fieldname":"authType"
--          }
--        },
--        "k_authType":{
--          "map_fieldname":{
--            "new_fieldname":"proxyAuthType"
--          }
--        }
--      }
--    }
--  ]
--}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HDFS/3.0.0.3.0/package/scripts/hdfs.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HDFS/3.0.0.3.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/HDFS/3.0.0.3.0/package/scripts/params_linux.py
index f4d25ad,de735f4..fff1167
--- a/ambari-server/src/main/resources/common-services/HDFS/3.0.0.3.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/3.0.0.3.0/package/scripts/params_linux.py
@@@ -51,10 -51,12 +51,12 @@@ tmp_dir = Script.get_tmp_dir(
  stack_name = status_params.stack_name
  stack_root = Script.get_stack_root()
  upgrade_direction = default("/commandParams/upgrade_direction", None)
+ rolling_restart = default("/commandParams/rolling_restart", False)
+ rolling_restart_safemode_exit_timeout = default("/configurations/cluster-env/namenode_rolling_restart_safemode_exit_timeout", None)
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
 -agent_stack_retry_on_unavailability = config['hostLevelParams']['agent_stack_retry_on_unavailability']
 -agent_stack_retry_count = expect("/hostLevelParams/agent_stack_retry_count", int)
 +agent_stack_retry_on_unavailability = config['ambariLevelParams']['agent_stack_retry_on_unavailability']
 +agent_stack_retry_count = expect("/ambariLevelParams/agent_stack_retry_count", int)
  
  # there is a stack upgrade which has not yet been finalized; it's currently suspended
  upgrade_suspended = default("roleParams/upgrade_suspended", False)
@@@ -156,15 -158,21 +158,20 @@@ falcon_user = config['configurations'][
  #exclude file
  hdfs_exclude_file = default("/clusterHostInfo/decom_dn_hosts", [])
  exclude_file_path = config['configurations']['hdfs-site']['dfs.hosts.exclude']
- update_exclude_file_only = default("/commandParams/update_exclude_file_only",False)
 -slave_hosts = default("/clusterHostInfo/slave_hosts", [])
++slave_hosts = default("/clusterHostInfo/datanode_hosts", [])
+ include_file_path = default("/configurations/hdfs-site/dfs.hosts", None)
+ hdfs_include_file = None
+ manage_include_files = default("/configurations/hdfs-site/manage.include.files", False)
+ if include_file_path and manage_include_files:
+   hdfs_include_file = slave_hosts
+ update_files_only = default("/commandParams/update_files_only", False)
  command_phase = default("/commandParams/phase","")
  
  klist_path_local = get_klist_path(default('/configurations/kerberos-env/executable_search_paths', None))
  kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
  #hosts
 -hostname = config["hostname"]
 -rm_host = default("/clusterHostInfo/rm_host", [])
 -slave_hosts = default("/clusterHostInfo/slave_hosts", [])
 +hostname = config['agentLevelParams']['hostname']
 +rm_host = default("/clusterHostInfo/resourcemanager_hosts", [])
- slave_hosts = default("/clusterHostInfo/datanode_hosts", [])
  oozie_servers = default("/clusterHostInfo/oozie_server", [])
  hcat_server_hosts = default("/clusterHostInfo/webhcat_server_host", [])
  hive_server_host =  default("/clusterHostInfo/hive_server_host", [])
@@@ -511,10 -519,10 +518,6 @@@ if enable_ranger_hdfs
      'assetType': '1'
    }
  
--  custom_ranger_service_config = generate_ranger_service_config(ranger_plugin_properties)
--  if len(custom_ranger_service_config) > 0:
--    hdfs_ranger_plugin_config.update(custom_ranger_service_config)
--
    if stack_supports_ranger_kerberos and security_enabled:
      hdfs_ranger_plugin_config['policy.download.auth.users'] = hdfs_user
      hdfs_ranger_plugin_config['tag.download.auth.users'] = hdfs_user

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HDFS/3.0.0.3.0/package/scripts/params_windows.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HIVE/2.1.0.3.0/package/scripts/hive.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/HIVE/2.1.0.3.0/package/scripts/params_linux.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py
index 0f5e3eb,a62265b..e46ce78
--- a/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py
@@@ -46,11 -46,7 +46,7 @@@ retryAble = default("/commandParams/com
  # Version being upgraded/downgraded to
  version = default("/commandParams/version", None)
  
- # Version that is CURRENT.
- current_version = default("/hostLevelParams/current_version", None)
- 
- 
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
  upgrade_direction = default("/commandParams/upgrade_direction", None)
  
@@@ -61,11 -57,7 +57,7 @@@ stack_supports_ranger_kerberos = check_
  stack_supports_ranger_audit_db = check_stack_feature(StackFeature.RANGER_AUDIT_DB_SUPPORT, version_for_stack_feature_checks)
  stack_supports_core_site_for_ranger_plugin = check_stack_feature(StackFeature.CORE_SITE_FOR_RANGER_PLUGINS_SUPPORT, version_for_stack_feature_checks)
  
- # When downgrading the 'version' and 'current_version' are both pointing to the downgrade-target version
- # downgrade_from_version provides the source-version the downgrade is happening from
- downgrade_from_version = default("/commandParams/downgrade_from_version", None)
- 
 -hostname = config['hostname']
 +hostname = config['agentLevelParams']['hostname']
  
  # default kafka parameters
  kafka_home = '/usr/lib/kafka'

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/properties/krb5_conf.j2
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/properties/krb5_conf.j2
index 612751b,612751b..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/properties/krb5_conf.j2
+++ /dev/null
@@@ -1,60 -1,60 +1,0 @@@
--{#
--# Licensed to the Apache Software Foundation (ASF) under one
--# or more contributor license agreements.  See the NOTICE file
--# distributed with this work for additional information
--# regarding copyright ownership.  The ASF licenses this file
--# to you under the Apache License, Version 2.0 (the
--# "License"); you may not use this file except in compliance
--# with the License.  You may obtain a copy of the License at
--#
--#   http://www.apache.org/licenses/LICENSE-2.0
--#
--# Unless required by applicable law or agreed to in writing, software
--# distributed under the License is distributed on an "AS IS" BASIS,
--# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--# See the License for the specific language governing permissions and
--# limitations under the License.
--#}
--[libdefaults]
--  renew_lifetime = 7d
--  forwardable = true
--  default_realm = {{realm}}
--  ticket_lifetime = 24h
--  dns_lookup_realm = false
--  dns_lookup_kdc = false
--  default_ccache_name = /tmp/krb5cc_%{uid}
--  #default_tgs_enctypes = {{encryption_types}}
--  #default_tkt_enctypes = {{encryption_types}}
--{% if domains %}
--[domain_realm]
--{%- for domain in domains.split(',') %}
--  {{domain|trim()}} = {{realm}}
--{%- endfor %}
--{% endif %}
--[logging]
--  default = FILE:/var/log/krb5kdc.log
--  admin_server = FILE:/var/log/kadmind.log
--  kdc = FILE:/var/log/krb5kdc.log
--
--[realms]
--  {{realm}} = {
--{%- if master_kdc %}
--    master_kdc = {{master_kdc|trim()}}
--{%- endif -%}
--{%- if kdc_hosts > 0 -%}
--{%- set kdc_host_list = kdc_hosts.split(',')  -%}
--{%- if kdc_host_list and kdc_host_list|length > 0 %}
--    admin_server = {{admin_server_host|default(kdc_host_list[0]|trim(), True)}}
--{%- if kdc_host_list -%}
--{%- if master_kdc and (master_kdc not in kdc_host_list) %}
--    kdc = {{master_kdc|trim()}}
--{%- endif -%}
--{% for kdc_host in kdc_host_list %}
--    kdc = {{kdc_host|trim()}}
--{%- endfor -%}
--{% endif %}
--{%- endif %}
--{%- endif %}
--  }
--
--{# Append additional realm declarations below #}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py
index 544f0ca,5f470ec..16c59ca
--- a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py
@@@ -179,7 -194,14 +194,14 @@@ else
    webhdfs_service_urls = buildUrlElement("http", namenode_host, namenode_http_port, "/webhdfs")
  
  
+ yarn_http_policy = default('/configurations/yarn-site/yarn.http.policy', None )
+ yarn_https_on = False
+ yarn_scheme = 'http'
+ if yarn_http_policy !=  None :
+    yarn_https_on = ( yarn_http_policy.upper() == 'HTTPS_ONLY')
+    yarn_scheme = 'http' if not yarn_https_on else 'https'
 -   
 -rm_hosts = default("/clusterHostInfo/rm_host", None)
++
 +rm_hosts = default("/clusterHostInfo/resourcemanager_hosts", None)
  if type(rm_hosts) is list:
    rm_host = rm_hosts[0]
  else:
@@@ -228,7 -263,83 +263,83 @@@ has_oozie = not oozie_server_host == No
  
  if has_oozie:
    oozie_server_port = get_port_from_url(config['configurations']['oozie-site']['oozie.base.url'])
+   oozie_https_port = default("/configurations/oozie-site/oozie.https.port", None)
+ 
+ if oozie_https_port is not None:
+   oozie_scheme = 'https'
+   oozie_server_port = oozie_https_port
+ 
+ #
+ # Falcon
+ #
+ falcon_server_hosts = default("/clusterHostInfo/falcon_server_hosts", None)
+ if type(falcon_server_hosts) is list:
+   falcon_server_host = falcon_server_hosts[0]
+ else:
+   falcon_server_host = falcon_server_hosts
+ 
+ falcon_scheme = 'http'
+ has_falcon = not falcon_server_host == None
+ falcon_server_port = "15000"
+ 
+ if has_falcon:
+   falcon_server_port = config['configurations']['falcon-env']['falcon_port']
+ 
+ #
+ # Solr
+ #
+ solr_scheme='http'
+ solr_server_hosts  = default("/clusterHostInfo/solr_hosts", None)
+ if type(solr_server_hosts ) is list:
+   solr_host = solr_server_hosts[0]
+ else:
+   solr_host = solr_server_hosts
+ solr_port=default("/configuration/solr/solr-env/solr_port","8983")
+ 
+ #
+ # Spark
 -# 
++#
+ spark_scheme = 'http'
+ spark_historyserver_hosts = default("/clusterHostInfo/spark_jobhistoryserver_hosts", None)
+ if type(spark_historyserver_hosts) is list:
+   spark_historyserver_host = spark_historyserver_hosts[0]
 -else: 
++else:
+   spark_historyserver_host = spark_historyserver_hosts
+ spark_historyserver_ui_port = default("/configurations/spark-defaults/spark.history.ui.port", "18080")
+ 
+ 
+ #
+ # JobHistory mapreduce
+ #
+ mr_scheme='http'
 -mr_historyserver_address = default("/configurations/mapred-site/mapreduce.jobhistory.webapp.address", None) 
++mr_historyserver_address = default("/configurations/mapred-site/mapreduce.jobhistory.webapp.address", None)
+ 
+ #
+ # Yarn nodemanager
+ #
+ nodeui_scheme= 'http'
+ nodeui_port = "8042"
 -nm_hosts = default("/clusterHostInfo/nm_hosts", None)
++nm_hosts = default("/clusterHostInfo/nodemanager_hosts", None)
+ if type(nm_hosts) is list:
+   nm_host = nm_hosts[0]
+ else:
+   nm_host = nm_hosts
+ 
+ has_yarn = default("/configurations/yarn-site", None )
+ if has_yarn and 'yarn.nodemanager.webapp.address' in config['configurations']['yarn-site']:
+   nodeui_port = get_port_from_url(config['configurations']['yarn-site']['yarn.nodemanager.webapp.address'])
+ 
+ 
+ #
+ # Spark Thrift UI
+ #
+ spark_thriftserver_scheme = 'http'
+ spark_thriftserver_ui_port = 4039
+ spark_thriftserver_hosts = default("/clusterHostInfo/spark_thriftserver_hosts", None)
+ if type(spark_thriftserver_hosts) is list:
+   spark_thriftserver_host = spark_thriftserver_hosts[0]
+ else:
+   spark_thriftserver_host = spark_thriftserver_hosts
  
  # Knox managed properties
  knox_managed_pid_symlink= format('{stack_root}/current/knox-server/pids')

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
index 5a54a21,884d32a..8c8275a
--- a/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
@@@ -75,7 -74,9 +74,9 @@@ logfeeder_pid_file = status_params.logf
  user_group = config['configurations']['cluster-env']['user_group']
  
  # shared configs
- java64_home = config['ambariLevelParams']['java_home']
 -java_home = config['hostLevelParams']['java_home']
 -ambari_java_home = default("/commandParams/ambari_java_home", None)
++java_home = config['ambariLevelParams']['java_home']
++ambari_java_home = default("/ambariLevelParams/ambari_java_home", None)
+ java64_home = ambari_java_home if ambari_java_home is not None else java_home
  cluster_name = str(config['clusterName'])
  
  configurations = config['configurations'] # need reference inside logfeeder jinja templates

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_client.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
index 797640c,b66e157..a06f1fa
--- a/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
@@@ -52,20 -57,33 +57,33 @@@ architecture = get_architecture(
  
  # Needed since this writes out the Atlas Hive Hook config file.
  cluster_name = config['clusterName']
+ serviceName = config['serviceName']
+ role = config['role']
  
 -hostname = config["hostname"]
 +hostname = config['agentLevelParams']['hostname']
  
  # New Cluster Stack Version that is defined during the RESTART of a Rolling Upgrade
  version = default("/commandParams/version", None)
  stack_name = status_params.stack_name
  stack_name_uppercase = stack_name.upper()
  upgrade_direction = default("/commandParams/upgrade_direction", None)
 -agent_stack_retry_on_unavailability = config['hostLevelParams']['agent_stack_retry_on_unavailability']
 -agent_stack_retry_count = expect("/hostLevelParams/agent_stack_retry_count", int)
 +agent_stack_retry_on_unavailability = config['ambariLevelParams']['agent_stack_retry_on_unavailability']
 +agent_stack_retry_count = expect("/ambariLevelParams/agent_stack_retry_count", int)
  
  stack_root = status_params.stack_root
+ 
+ # The source stack will be present during a cross-stack upgrade.
+ # E.g., BigInsights-4.2.5 or HDP-2.6
+ source_stack = default("/commandParams/source_stack", None)
+ if source_stack is None:
+   source_stack = upgrade_summary.get_source_stack("OOZIE")
+ 
+ # This variable name is important, do not change
+ source_stack_name = get_stack_name(source_stack)
+ 
  stack_version_unformatted =  status_params.stack_version_unformatted
  stack_version_formatted =  status_params.stack_version_formatted
+ major_stack_version = get_major_version(stack_version_formatted)
  version_for_stack_feature_checks = get_stack_feature_version(config)
  
  hadoop_conf_dir = conf_select.get_hadoop_conf_dir()

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/PIG/0.16.1.3.0/configuration/pig-env.xml
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/PIG/0.16.1.3.0/configuration/pig-env.xml
index 5eafd9e,5eafd9e..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/common-services/PIG/0.16.1.3.0/configuration/pig-env.xml
+++ /dev/null
@@@ -1,41 -1,41 +1,0 @@@
--<?xml version="1.0"?>
--<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
--<!--
--/**
-- * Licensed to the Apache Software Foundation (ASF) under one
-- * or more contributor license agreements.  See the NOTICE file
-- * distributed with this work for additional information
-- * regarding copyright ownership.  The ASF licenses this file
-- * to you under the Apache License, Version 2.0 (the
-- * "License"); you may not use this file except in compliance
-- * with the License.  You may obtain a copy of the License at
-- *
-- *     http://www.apache.org/licenses/LICENSE-2.0
-- *
-- * Unless required by applicable law or agreed to in writing, software
-- * distributed under the License is distributed on an "AS IS" BASIS,
-- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- * See the License for the specific language governing permissions and
-- * limitations under the License.
-- */
---->
--<configuration supports_adding_forbidden="true">
--  <!-- pig-env.sh -->
--  <property>
--    <name>content</name>
--    <display-name>pig-env template</display-name>
--    <description>This is the jinja template for pig-env.sh file</description>
--    <value>
--JAVA_HOME={{java64_home}}
--HADOOP_HOME=${HADOOP_HOME:-{{hadoop_home}}}
--
--if [ -d "/usr/lib/tez" ]; then
--  PIG_OPTS="$PIG_OPTS -Dmapreduce.framework.name=yarn"
--fi
--    </value>
--    <value-attributes>
--      <type>content</type>
--    </value-attributes>
--    <on-ambari-upgrade add="false"/>
--  </property>
--</configuration>

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/PXF/3.0.0/configuration/pxf-profiles.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py
index 6dd5c7f,5731e6c..75247eb
--- a/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py
@@@ -44,11 -45,12 +45,12 @@@ config  = Script.get_config(
  tmp_dir = Script.get_tmp_dir()
  stack_root = Script.get_stack_root()
  
 -stack_name = default("/hostLevelParams/stack_name", None)
 +stack_name = default("/clusterLevelParams/stack_name", None)
  version = default("/commandParams/version", None)
  
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
  
  upgrade_marker_file = format("{tmp_dir}/rangeradmin_ru.inprogress")
  
@@@ -122,7 -123,8 +123,8 @@@ if stack_supports_ranger_tagsync
  
  usersync_services_file = format('{stack_root}/current/ranger-usersync/ranger-usersync-services.sh')
  
 -java_home = config['hostLevelParams']['java_home']
 -ambari_java_home = default("/commandParams/ambari_java_home", java_home)
 +java_home = config['ambariLevelParams']['java_home']
++ambari_java_home = default("/ambariLevelParams/ambari_java_home", java_home)
  unix_user  = config['configurations']['ranger-env']['ranger_user']
  unix_group = config['configurations']['ranger-env']['ranger_group']
  ranger_pid_dir = default("/configurations/ranger-env/ranger_pid_dir", "/var/run/ranger")
@@@ -286,6 -289,17 +289,17 @@@ has_namenode = len(namenode_hosts) > 
  ugsync_policymgr_alias = config["configurations"]["ranger-ugsync-site"]["ranger.usersync.policymgr.alias"]
  ugsync_policymgr_keystore = config["configurations"]["ranger-ugsync-site"]["ranger.usersync.policymgr.keystore"]
  
+ # get comma separated list of zookeeper hosts
+ zookeeper_port = default('/configurations/zoo.cfg/clientPort', None)
 -zookeeper_hosts = default("/clusterHostInfo/zookeeper_hosts", [])
++zookeeper_hosts = default("/clusterHostInfo/zookeeper_server_hosts", [])
+ index = 0
+ zookeeper_quorum = ""
+ for host in zookeeper_hosts:
+   zookeeper_quorum += host + ":" + str(zookeeper_port)
+   index += 1
+   if index < len(zookeeper_hosts):
+     zookeeper_quorum += ","
+ 
  # ranger solr
  audit_solr_enabled = default('/configurations/ranger-env/xasecure.audit.destination.solr', False)
  ranger_solr_config_set = config['configurations']['ranger-env']['ranger_solr_config_set']

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py
index 4152dfb,56003ad..f398be0
--- a/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py
@@@ -38,8 -42,9 +42,9 @@@ stack_name = default("/clusterLevelPara
  version = default("/commandParams/version", None)
  upgrade_direction = default("/commandParams/upgrade_direction", None)
  
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
  
  # get the correct version to use for checking stack features
  version_for_stack_feature_checks = get_stack_feature_version(config)
@@@ -293,7 -300,36 +300,36 @@@ ranger_kms_ssl_passwd = config['configu
  ranger_kms_ssl_enabled = config['configurations']['ranger-kms-site']['ranger.service.https.attrib.ssl.enabled']
  
  xa_audit_hdfs_is_enabled = default("/configurations/ranger-kms-audit/xasecure.audit.destination.hdfs", False)
 -namenode_host = default("/clusterHostInfo/namenode_host", [])
 +namenode_host = default("/clusterHostInfo/namenode_hosts", [])
  
  # need this to capture cluster name from where ranger kms plugin is enabled
- cluster_name = config['clusterName']
+ cluster_name = config['clusterName']
+ 
+ has_namenode = len(namenode_host) > 0
+ 
+ hdfs_user = default("/configurations/hadoop-env/hdfs_user", None)
+ hdfs_user_keytab = default("/configurations/hadoop-env/hdfs_user_keytab", None)
+ hdfs_principal_name = default("/configurations/hadoop-env/hdfs_principal_name", None)
+ default_fs = default("/configurations/core-site/fs.defaultFS", None)
+ hdfs_site = config['configurations']['hdfs-site'] if has_namenode else None
+ hadoop_bin_dir = stack_select.get_hadoop_dir("bin") if has_namenode else None
+ kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
+ 
+ import functools
+ # create partial functions with common arguments for every HdfsResource call
+ # to create/delete hdfs directory/file/copyfromlocal we need to call params.HdfsResource in code
+ HdfsResource = functools.partial(
+   HdfsResource,
+   user=hdfs_user,
+   security_enabled = security_enabled,
+   keytab = hdfs_user_keytab,
+   kinit_path_local = kinit_path_local,
+   hadoop_bin_dir = hadoop_bin_dir,
+   hadoop_conf_dir = hadoop_conf_dir,
+   principal_name = hdfs_principal_name,
+   hdfs_site = hdfs_site,
+   default_fs = default_fs
+ )
+ 
+ local_component_list = default("/localComponents", [])
+ has_hdfs_client_on_node = 'HDFS_CLIENT' in local_component_list

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py
index a960b95,691ca2c..63cee09
--- a/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py
@@@ -52,14 -53,16 +53,16 @@@ component_directory = Script.get_compon
  config = Script.get_config()
  tmp_dir = Script.get_tmp_dir()
  
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
++stack_version_unformatted = config['clusterLevelParams']['stack_version']
+ stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
+ 
  upgrade_direction = default("/commandParams/upgrade_direction", None)
 -java_home = config['hostLevelParams']['java_home']
 +java_home = config['ambariLevelParams']['java_home']
  stack_name = status_params.stack_name
  stack_root = Script.get_stack_root()
- stack_version_unformatted = config['clusterLevelParams']['stack_version']
- if upgrade_direction == Direction.DOWNGRADE:
-   stack_version_unformatted = config['commandParams']['original_stack'].split("-")[1]
- stack_version_formatted = format_stack_version(stack_version_unformatted)
+ 
+ version_for_stack_feature_checks = get_stack_feature_version(config)
  
  sysprep_skip_copy_tarballs_hdfs = get_sysprep_skip_copy_tarballs_hdfs()
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/SPARK/2.2.0/package/scripts/status_params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/SPARK/2.2.0/package/scripts/status_params.py
index 0000000,07dcc47..e9e0553
mode 000000,100644..100644
--- a/ambari-server/src/main/resources/common-services/SPARK/2.2.0/package/scripts/status_params.py
+++ b/ambari-server/src/main/resources/common-services/SPARK/2.2.0/package/scripts/status_params.py
@@@ -1,0 -1,45 +1,45 @@@
+ #!/usr/bin/env python
+ """
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+     http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ 
+ """
+ 
+ from resource_management.libraries.functions.format import format
+ from resource_management.libraries.script.script import Script
+ from resource_management.libraries.functions.default import default
+ 
+ config = Script.get_config()
+ 
+ spark_user = config['configurations']['spark-env']['spark_user']
+ spark_group = config['configurations']['spark-env']['spark_group']
+ user_group = config['configurations']['cluster-env']['user_group']
+ 
+ if 'hive-env' in config['configurations']:
+   hive_user = config['configurations']['hive-env']['hive_user']
+ else:
+   hive_user = "hive"
+ 
+ spark_pid_dir = config['configurations']['spark-env']['spark_pid_dir']
+ spark_history_server_pid_file = format("{spark_pid_dir}/spark-{spark_user}-org.apache.spark.deploy.history.HistoryServer-1.pid")
+ spark_thrift_server_pid_file = format("{spark_pid_dir}/spark-{hive_user}-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1.pid")
 -stack_name = default("/hostLevelParams/stack_name", None)
++stack_name = default("/clusterLevelParams/stack_name", None)
+ 
+ if "livy-env" in config['configurations']:
+   livy_user = config['configurations']['livy-env']['livy_user']
+   livy_group = config['configurations']['livy-env']['livy_group']
+   livy_pid_dir = config['configurations']['livy-env']['livy_pid_dir']
+   livy_server_pid_file = format("{livy_pid_dir}/livy-{livy_user}-server.pid")

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py
index 6fe2293,3cf1082..2d6469c
--- a/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py
@@@ -51,8 -51,9 +51,9 @@@ tmp_dir = Script.get_tmp_dir(
  
  stack_name = status_params.stack_name
  stack_root = Script.get_stack_root()
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
  
  sysprep_skip_copy_tarballs_hdfs = get_sysprep_skip_copy_tarballs_hdfs()
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py
index b7a64c7,664c582..003c06c
--- a/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py
@@@ -383,11 -391,9 +391,9 @@@ if enable_ranger_storm
  
  # ranger storm plugin end section
  
 -namenode_hosts = default("/clusterHostInfo/namenode_host", [])
 +namenode_hosts = default("/clusterHostInfo/namenode_hosts", [])
  has_namenode = not len(namenode_hosts) == 0
  
- availableServices = config['availableServices']
- 
  hdfs_user = config['configurations']['hadoop-env']['hdfs_user'] if has_namenode else None
  hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab'] if has_namenode else None
  hdfs_principal_name = config['configurations']['hadoop-env']['hdfs_principal_name'] if has_namenode else None

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez_client.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/TEZ/0.9.0.3.0/package/scripts/tez_client.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
index 2d929c8,2ab779f..d60f102
--- a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py
@@@ -66,13 -66,17 +66,17 @@@ tarball_map = default("/configurations/
  config_path = os.path.join(stack_root, "current/hadoop-client/conf")
  config_dir = os.path.realpath(config_path)
  
+ # get the correct version to use for checking stack features
+ version_for_stack_feature_checks = get_stack_feature_version(config)
+ 
  # This is expected to be of the form #.#.#.#
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted_major = format_stack_version(stack_version_unformatted)
  stack_version_formatted = functions.get_stack_version('hadoop-yarn-resourcemanager')
+ major_stack_version = get_major_version(stack_version_formatted_major)
  
- stack_supports_ru = stack_version_formatted_major and check_stack_feature(StackFeature.ROLLING_UPGRADE, stack_version_formatted_major)
- stack_supports_timeline_state_store = stack_version_formatted_major and check_stack_feature(StackFeature.TIMELINE_STATE_STORE, stack_version_formatted_major)
+ stack_supports_ru = check_stack_feature(StackFeature.ROLLING_UPGRADE, version_for_stack_feature_checks)
+ stack_supports_timeline_state_store = check_stack_feature(StackFeature.TIMELINE_STATE_STORE, version_for_stack_feature_checks)
  
  # New Cluster Stack Version that is defined during the RESTART of a Stack Upgrade.
  # It cannot be used during the initial Cluser Install because the version is not yet known.
@@@ -240,6 -238,16 +241,16 @@@ user_group = config['configurations']['
  #exclude file
  exclude_hosts = default("/clusterHostInfo/decom_nm_hosts", [])
  exclude_file_path = default("/configurations/yarn-site/yarn.resourcemanager.nodes.exclude-path","/etc/hadoop/conf/yarn.exclude")
+ rm_nodes_exclude_dir = os.path.dirname(exclude_file_path)
+ 
 -nm_hosts = default("/clusterHostInfo/nm_hosts", [])
++nm_hosts = default("/clusterHostInfo/nodemanager_hosts", [])
+ #incude file
+ include_file_path = default("/configurations/yarn-site/yarn.resourcemanager.nodes.include-path", None)
+ include_hosts = None
+ manage_include_files = default("/configurations/yarn-site/manage.include.files", False)
+ if include_file_path and manage_include_files:
+   rm_nodes_include_dir = os.path.dirname(include_file_path)
+   include_hosts = list(set(nm_hosts) - set(exclude_hosts))
  
  ats_host = set(default("/clusterHostInfo/app_timeline_server_hosts", []))
  has_ats = not len(ats_host) == 0
@@@ -247,8 -255,9 +258,9 @@@
  # don't using len(nm_hosts) here, because check can take too much time on large clusters
  number_of_nm = 1
  
 -hs_host = default("/clusterHostInfo/hs_host", [])
++hs_host = default("/clusterHostInfo/historyserver_hosts", [])
+ has_hs = not len(hs_host) == 0
+ 
  # default kinit commands
  rm_kinit_cmd = ""
  yarn_timelineservice_kinit_cmd = ""

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_windows.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/templates/input.config-yarn.json.j2
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/templates/input.config-yarn.json.j2
index bf1dd37,bf1dd37..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/templates/input.config-yarn.json.j2
+++ /dev/null
@@@ -1,72 -1,72 +1,0 @@@
--{#
-- # Licensed to the Apache Software Foundation (ASF) under one
-- # or more contributor license agreements.  See the NOTICE file
-- # distributed with this work for additional information
-- # regarding copyright ownership.  The ASF licenses this file
-- # to you under the Apache License, Version 2.0 (the
-- # "License"); you may not use this file except in compliance
-- # with the License.  You may obtain a copy of the License at
-- #
-- #   http://www.apache.org/licenses/LICENSE-2.0
-- #
-- # Unless required by applicable law or agreed to in writing, software
-- # distributed under the License is distributed on an "AS IS" BASIS,
-- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- # See the License for the specific language governing permissions and
-- # limitations under the License.
-- #}
--{
--  "input":[
--    {
--      "type":"yarn_nodemanager",
--      "rowtype":"service",
--      "path":"{{default('/configurations/yarn-env/yarn_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/yarn-env/yarn_user', 'yarn')}}/yarn-{{default('configurations/yarn-env/yarn_user', 'yarn')}}-nodemanager-*.log"
--    },
--    {
--      "type":"yarn_resourcemanager",
--      "rowtype":"service",
--      "path":"{{default('/configurations/yarn-env/yarn_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/yarn-env/yarn_user', 'yarn')}}/yarn-{{default('configurations/yarn-env/yarn_user', 'yarn')}}-resourcemanager-*.log"
--    },
--    {
--      "type":"yarn_timelineserver",
--      "rowtype":"service",
--      "path":"{{default('/configurations/yarn-env/yarn_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/yarn-env/yarn_user', 'yarn')}}/yarn-{{default('configurations/yarn-env/yarn_user', 'yarn')}}-timelineserver-*.log"
--    },
--    {
--      "type":"yarn_historyserver",
--      "rowtype":"service",
--      "path":"{{default('/configurations/yarn-env/yarn_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/yarn-env/yarn_user', 'yarn')}}/yarn-{{default('configurations/yarn-env/yarn_user', 'yarn')}}-historyserver-*.log"
--    },
--    {
--      "type":"yarn_jobsummary",
--      "rowtype":"service",
--      "path":"{{default('/configurations/yarn-env/yarn_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/yarn-env/yarn_user', 'yarn')}}/hadoop-mapreduce.jobsummary.log"
--    }
--  ],
--  "filter":[
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "yarn_historyserver",
--            "yarn_jobsummary",
--            "yarn_nodemanager",
--            "yarn_resourcemanager",
--            "yarn_timelineserver"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}%{SPACE}\\(%{JAVAFILE:file}:%{JAVAMETHOD:method}\\(%{INT:line_number}\\)\\)%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    }
--  ]
--}


[30/50] [abbrv] ambari git commit: AMBARI-22056. Solr Data Manager script should use gzip compression type (mgergely)

Posted by ao...@apache.org.
AMBARI-22056. Solr Data Manager script should use gzip compression type (mgergely)

Change-Id: Ib61f1a03a885a2c81c11b32e5952c3c328a4064f


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a8736260
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a8736260
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a8736260

Branch: refs/heads/branch-3.0-perf
Commit: a8736260897c937bab1318ea4991d1edd1aae1eb
Parents: 7af3152
Author: Miklos Gergely <mg...@hortonworks.com>
Authored: Tue Sep 26 16:41:43 2017 +0200
Committer: Miklos Gergely <mg...@hortonworks.com>
Committed: Tue Sep 26 16:41:59 2017 +0200

----------------------------------------------------------------------
 .../src/main/python/solrDataManager.py          | 35 +++++++++++++-------
 1 file changed, 23 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a8736260/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py b/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
index 18a4da7..e0356bb 100644
--- a/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
+++ b/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
@@ -32,6 +32,8 @@ from subprocess import call, Popen, PIPE
 from urllib import quote, unquote
 from zipfile import ZipFile, ZIP_DEFLATED
 import tarfile
+import gzip
+import shutil
 
 VERSION = "1.0"
 
@@ -69,7 +71,7 @@ def parse_arguments():
   parser.add_option("-g", "--ignore-unfinished-uploading", dest="ignore_unfinished_uploading", action="store_true", default=False)
   
   parser.add_option("--json-file", dest="json_file", help="create a json file instead of line delimited json", action="store_true", default=False)
-  parser.add_option("-z", "--compression", dest="compression", help="none | tar.gz | tar.bz2 | zip", default="tar.gz")
+  parser.add_option("-z", "--compression", dest="compression", help="none | tar.gz | tar.bz2 | zip | gz", default="gz")
   
   parser.add_option("-k", "--solr-keytab", dest="solr_keytab", type="string", help="the keytab for a kerberized solr")
   parser.add_option("-n", "--solr-principal", dest="solr_principal", type="string", help="the principal for a kerberized solr")
@@ -122,7 +124,7 @@ def parse_arguments():
     parser.print_help()
     sys.exit()
 
-  compression_values = ["none", "tar.gz", "tar.bz2", "zip"]
+  compression_values = ["none", "tar.gz", "tar.bz2", "zip", "gz"]
   if options.compression not in compression_values:
     print "compression must be one of {0}".format(" | ".join(compression_values))
     parser.print_help()
@@ -469,35 +471,44 @@ def upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url,
   os.remove("{0}/command.json".format(working_dir))
 
 def compress_file(working_dir, tmp_file_path, file_name, compression):
+  data_file_name = "{0}.json".format(file_name)
   if compression == "none":
     upload_file_path = "{0}/{1}.json".format(working_dir, file_name)
     os.rename(tmp_file_path, upload_file_path)
   elif compression == "tar.gz":
-    upload_file_path = "{0}/{1}.tar.gz".format(working_dir, file_name)
-    zipped_file_name = "{0}.json".format(file_name)
+    upload_file_path = "{0}/{1}.json.tar.gz".format(working_dir, file_name)
     tar = tarfile.open(upload_file_path, mode="w:gz")
     try:
-      tar.add(tmp_file_path, arcname=zipped_file_name)
+      tar.add(tmp_file_path, arcname=data_file_name)
     finally:
       tar.close()
   elif compression == "tar.bz2":
-    upload_file_path = "{0}/{1}.tar.bz2".format(working_dir, file_name)
-    zipped_file_name = "{0}.json".format(file_name)
+    upload_file_path = "{0}/{1}.json.tar.bz2".format(working_dir, file_name)
     tar = tarfile.open(upload_file_path, mode="w:bz2")
     try:
-      tar.add(tmp_file_path, arcname=zipped_file_name)
+      tar.add(tmp_file_path, arcname=data_file_name)
     finally:
       tar.close()
   elif compression == "zip":
-    upload_file_path = "{0}/{1}.zip".format(working_dir, file_name)
-    zipped_file_name = "{0}.json".format(file_name)
+    upload_file_path = "{0}/{1}.json.zip".format(working_dir, file_name)
     zip = ZipFile(upload_file_path, 'w')
-    zip.write(tmp_file_path, zipped_file_name, ZIP_DEFLATED)
-    logger.info("Created file %s", zipped_file_name)
+    zip.write(tmp_file_path, data_file_name, ZIP_DEFLATED)
+  elif compression == "gz":
+    upload_file_path = "{0}/{1}.json.gz".format(working_dir, file_name)
+    gz = gzip.open(upload_file_path, mode="wb")
+    f = open(tmp_file_path)
+    try:
+      shutil.copyfileobj(f, gz)
+    finally:
+      gz.close()
+      f.close()
   else:
     logger.warn("Unknown compression type")
     sys.exit()
   
+  logger.info("Created data file %s", data_file_name)
+
+  
   return upload_file_path
 
 def create_command_file(upload, working_dir, upload_file_path, solr_url, collection, filter_field, id_field, prev_lot_end_value,


[34/50] [abbrv] ambari git commit: AMBARI-22062. Stack selection page does not load the HDP stacks (Redux) (ncole)

Posted by ao...@apache.org.
AMBARI-22062. Stack selection page does not load the HDP stacks (Redux) (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/dc419b4a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/dc419b4a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/dc419b4a

Branch: refs/heads/branch-3.0-perf
Commit: dc419b4a3940d514d714b27c06e641e69b586760
Parents: cb27cee
Author: Nate Cole <nc...@hortonworks.com>
Authored: Tue Sep 26 15:19:57 2017 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Tue Sep 26 15:20:02 2017 -0400

----------------------------------------------------------------------
 .../ambari/server/api/services/AmbariMetaInfo.java   |  2 +-
 .../org/apache/ambari/server/stack/StackContext.java | 15 ++++++++++++---
 2 files changed, 13 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/dc419b4a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index aad35a9..de84965 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -1348,7 +1348,7 @@ public class AmbariMetaInfo {
   /**
    * Ensures that the map of version definition files is populated
    */
-  private void ensureVersionDefinitions() {
+  private synchronized void ensureVersionDefinitions() {
     if (null != versionDefinitions) {
       return;
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/dc419b4a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
index d430bb7..2992027 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
@@ -61,7 +61,7 @@ public class StackContext {
   private LatestRepoQueryExecutor repoUpdateExecutor;
 
   private final static Logger LOG = LoggerFactory.getLogger(StackContext.class);
-  private static final int THREAD_COUNT = 5;
+  private static final int THREAD_COUNT = 10;
 
 
   /**
@@ -167,7 +167,7 @@ public class StackContext {
      */
     public void execute() {
 
-      long l = System.nanoTime();
+      long currentTime = System.nanoTime();
       List<Future<Map<StackModule, RepoUrlInfoResult>>> results = new ArrayList<>();
 
       // !!! first, load the *_urlinfo.json files and block for completion
@@ -177,7 +177,7 @@ public class StackContext {
         LOG.warn("Could not load urlinfo as the executor was interrupted", e);
         return;
       } finally {
-        LOG.info("Loaded urlinfo in " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - l) + "ms");
+        LOG.info("Loaded urlinfo in " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - currentTime) + "ms");
       }
 
       List<Map<StackModule, RepoUrlInfoResult>> urlInfoResults = new ArrayList<>();
@@ -190,6 +190,7 @@ public class StackContext {
         }
       }
 
+      currentTime = System.nanoTime();
       for (Map<StackModule, RepoUrlInfoResult> urlInfoResult : urlInfoResults) {
         for (Entry<StackModule, RepoUrlInfoResult> entry : urlInfoResult.entrySet()) {
           StackModule stackModule = entry.getKey();
@@ -212,6 +213,14 @@ public class StackContext {
       }
 
       executor.shutdown();
+
+      try {
+        executor.awaitTermination(2,  TimeUnit.MINUTES);
+      } catch (InterruptedException e) {
+        LOG.warn("Loading all VDF was interrupted", e.getCause());
+      } finally {
+        LOG.info("Loaded all VDF in " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - currentTime) + "ms");
+      }
     }
 
     /**


[10/50] [abbrv] ambari git commit: AMBARI-22007 - Addition of service component after patching a service still keeps the component at base version (part2) (jonathanhurley)

Posted by ao...@apache.org.
AMBARI-22007 - Addition of service component after patching a service still keeps the component at base version (part2) (jonathanhurley)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/311c7bbd
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/311c7bbd
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/311c7bbd

Branch: refs/heads/branch-3.0-perf
Commit: 311c7bbd8ee94b8964a7f1769b41efc40ecdcdc6
Parents: eb5bcef
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Mon Sep 25 08:45:58 2017 -0400
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Mon Sep 25 08:51:38 2017 -0400

----------------------------------------------------------------------
 .../libraries/functions/version_select_util.py  |  7 ++--
 .../libraries/script/script.py                  | 36 ++++++++++++++++----
 .../src/test/python/TestVersionSelectUtil.py    |  4 +--
 3 files changed, 35 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/311c7bbd/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py b/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
index 9fbb42b..73b5dc1 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
@@ -28,10 +28,11 @@ from resource_management.core import shell
 from resource_management.libraries.functions import stack_tools
 
 
-def get_component_version(stack_name, component_name):
+def get_component_version_from_symlink(stack_name, component_name):
   """
-  For any stack name, returns the version currently installed for a given component.
-  Because each stack name may have different logic, the input is a generic dictionary.
+  Gets the version of the specified component by invoking the stack-select tool to query for the
+  version which is referenced by the symlink.
+
   :param stack_name: one of HDP, HDPWIN, BIGTOP, PHD, etc. usually retrieved from
   the command-#.json file's ["hostLevelParams"]["stack_name"]
   :param component_name: Component name as a string necessary to get the version

http://git-wip-us.apache.org/repos/asf/ambari/blob/311c7bbd/ambari-common/src/main/python/resource_management/libraries/script/script.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/script/script.py b/ambari-common/src/main/python/resource_management/libraries/script/script.py
index 303b640..e612638 100644
--- a/ambari-common/src/main/python/resource_management/libraries/script/script.py
+++ b/ambari-common/src/main/python/resource_management/libraries/script/script.py
@@ -47,7 +47,7 @@ from resource_management.core.environment import Environment
 from resource_management.core.logger import Logger
 from resource_management.core.exceptions import Fail, ClientComponentHasNoStatus, ComponentIsNotRunning
 from resource_management.core.resources.packaging import Package
-from resource_management.libraries.functions.version_select_util import get_component_version
+from resource_management.libraries.functions.version_select_util import get_component_version_from_symlink
 from resource_management.libraries.functions.version import compare_versions
 from resource_management.libraries.functions.version import format_stack_version
 from resource_management.libraries.functions import stack_tools
@@ -207,18 +207,40 @@ class Script(object):
       return os.path.realpath(config_path)
     return None
 
-  def save_component_version_to_structured_out(self):
+  def save_component_version_to_structured_out(self, command_name):
     """
-    :param stack_name: One of HDP, HDPWIN, PHD, BIGTOP.
-    :return: Append the version number to the structured out.
+    Saves the version of the component for this command to the structured out file. If the
+    command is an install command and the repository is trusted, then it will use the version of
+    the repository. Otherwise, it will consult the stack-select tool to read the symlink version.
+    :param command_name: command name
+    :return: None
     """
+    from resource_management.libraries.functions.default import default
     from resource_management.libraries.functions import stack_select
 
+    repository_resolved = default("repositoryFile/resolved", False)
+    repository_version = default("repositoryFile/repoVersion", None)
+    is_install_command = command_name is not None and command_name.lower() == "install"
+
+    # start out with no version
+    component_version = None
+
+    # install command + trusted repo means use the repo version and don't consult stack-select
+    # this is needed in cases where an existing symlink is on the system and stack-select can't
+    # change it on installation (because it's scared to in order to support parallel installs)
+    if is_install_command and repository_resolved and repository_version is not None:
+      Logger.info("The repository with version {0} for this command has been marked as resolved."\
+        " It will be used to report the version of the component which was installed".format(repository_version))
+
+      component_version = repository_version
+
     stack_name = Script.get_stack_name()
     stack_select_package_name = stack_select.get_package_name()
 
     if stack_select_package_name and stack_name:
-      component_version = get_component_version(stack_name, stack_select_package_name)
+      # only query for the component version from stack-select if we can't trust the repository yet
+      if component_version is None:
+        component_version = get_component_version_from_symlink(stack_name, stack_select_package_name)
 
       if component_version:
         self.put_structured_out({"version": component_version})
@@ -336,7 +358,7 @@ class Script(object):
       raise
     finally:
       if self.should_expose_component_version(self.command_name):
-        self.save_component_version_to_structured_out()
+        self.save_component_version_to_structured_out(self.command_name)
 
   def execute_prefix_function(self, command_name, afix, env):
     """
@@ -938,7 +960,7 @@ class Script(object):
           self.post_rolling_restart(env)
 
     if self.should_expose_component_version("restart"):
-      self.save_component_version_to_structured_out()
+      self.save_component_version_to_structured_out("restart")
 
 
   # TODO, remove after all services have switched to post_upgrade_restart

http://git-wip-us.apache.org/repos/asf/ambari/blob/311c7bbd/ambari-server/src/test/python/TestVersionSelectUtil.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestVersionSelectUtil.py b/ambari-server/src/test/python/TestVersionSelectUtil.py
index 5195dca..82985fa 100644
--- a/ambari-server/src/test/python/TestVersionSelectUtil.py
+++ b/ambari-server/src/test/python/TestVersionSelectUtil.py
@@ -133,7 +133,7 @@ class TestVersionSelectUtil(TestCase):
     call_mock.side_effect = [(0, "value will come from MagicFile"), ] * 2
 
     # Pass
-    version = self.module.get_component_version("HDP", "hive-server2")
+    version = self.module.get_component_version_from_symlink("HDP", "hive-server2")
     self.assertEquals(version, stack_expected_version)
-    version = self.module.get_component_version("HDP", "zookeeper-server")
+    version = self.module.get_component_version_from_symlink("HDP", "zookeeper-server")
     self.assertEquals(version, stack_expected_version)


[03/50] [abbrv] ambari git commit: AMBARI-21910 Ranger Usersync config to support nested group evaluation for LDAP Sync source property (mugdha)

Posted by ao...@apache.org.
AMBARI-21910 Ranger Usersync config to support nested group evaluation for LDAP Sync source property (mugdha)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ea892443
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ea892443
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ea892443

Branch: refs/heads/branch-3.0-perf
Commit: ea892443513fa730dad2ef3af06069ef618e0225
Parents: f067ec8
Author: Mugdha Varadkar <mu...@apache.org>
Authored: Fri Sep 22 18:03:25 2017 +0530
Committer: Mugdha Varadkar <mu...@apache.org>
Committed: Fri Sep 22 18:14:00 2017 +0530

----------------------------------------------------------------------
 .../RangerUsersyncConfigCalculation.java        |  96 ++++++++++++++
 .../RANGER/0.7.0/configuration/ranger-env.xml   |  23 ++++
 .../0.7.0/configuration/ranger-ugsync-site.xml  |   7 ++
 .../RANGER/0.7.0/themes/theme_version_5.json    |  40 ++++++
 .../1.0.0.3.0/configuration/ranger-env.xml      |  23 ++++
 .../configuration/ranger-ugsync-site.xml        |   7 ++
 .../1.0.0.3.0/themes/theme_version_1.json       |  40 ++++++
 .../HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml |   7 ++
 .../stacks/HDP/2.6/upgrades/upgrade-2.6.xml     |   8 ++
 .../RangerUsersyncConfigCalculationTest.java    | 126 +++++++++++++++++++
 10 files changed, 377 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculation.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculation.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculation.java
new file mode 100644
index 0000000..3573748
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculation.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.serveraction.upgrades;
+
+import java.text.MessageFormat;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.agent.CommandReport;
+import org.apache.ambari.server.serveraction.AbstractServerAction;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+
+import com.google.inject.Inject;
+
+/**
+ * Computes Ranger Usersync ldap grouphierarchylevels property. This class is only used when upgrading from
+ * HDP-2.6.x to HDP-2.6.y.
+ */
+
+public class RangerUsersyncConfigCalculation extends AbstractServerAction {
+  private static final String RANGER_USERSYNC_CONFIG_TYPE = "ranger-ugsync-site";
+  private static final String RANGER_ENV_CONFIG_TYPE = "ranger-env";
+
+  @Inject
+  private Clusters m_clusters;
+
+  @Override
+  public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext) throws AmbariException, InterruptedException {
+
+  String clusterName = getExecutionCommand().getClusterName();
+  Cluster cluster = m_clusters.getCluster(clusterName);
+  String outputMsg = "";
+
+  Config rangerUsersyncConfig = cluster.getDesiredConfigByType(RANGER_USERSYNC_CONFIG_TYPE);
+
+  if (null == rangerUsersyncConfig) {
+    return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
+      MessageFormat.format("Config type {0} not found, skipping updating property in same.", RANGER_USERSYNC_CONFIG_TYPE), "");
+  }
+
+  String ldapGroupHierarchy = "0";
+
+  if (rangerUsersyncConfig.getProperties().containsKey("ranger.usersync.ldap.grouphierarchylevels")) {
+    ldapGroupHierarchy = rangerUsersyncConfig.getProperties().get("ranger.usersync.ldap.grouphierarchylevels");
+  } else {
+    Map<String, String> targetRangerUsersyncConfig = rangerUsersyncConfig.getProperties();
+    targetRangerUsersyncConfig.put("ranger.usersync.ldap.grouphierarchylevels", ldapGroupHierarchy);
+    rangerUsersyncConfig.setProperties(targetRangerUsersyncConfig);
+    rangerUsersyncConfig.save();
+
+    outputMsg = outputMsg + MessageFormat.format("Successfully updated {0} config type.\n", RANGER_USERSYNC_CONFIG_TYPE);
+  }
+
+  Config rangerEnvConfig = cluster.getDesiredConfigByType(RANGER_ENV_CONFIG_TYPE);
+
+  if (null == rangerEnvConfig) {
+    return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
+      MessageFormat.format("Config type {0} not found, skipping updating property in same.", RANGER_ENV_CONFIG_TYPE), "");
+  }
+
+  String enableSyncNestedGroup = "false";
+
+  if (!ldapGroupHierarchy.equals("0") ) {
+    enableSyncNestedGroup = "true";
+  }
+
+  Map<String, String> targetRangerEnvConfig = rangerEnvConfig.getProperties();
+  targetRangerEnvConfig.put("is_nested_groupsync_enabled", enableSyncNestedGroup);
+  rangerEnvConfig.setProperties(targetRangerEnvConfig);
+  rangerEnvConfig.save();
+
+  outputMsg = outputMsg + MessageFormat.format("Successfully updated {0} config type.\n", RANGER_ENV_CONFIG_TYPE);
+
+  return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", outputMsg, "");
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-env.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-env.xml b/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-env.xml
index 627216e..dfc9ca9 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-env.xml
+++ b/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-env.xml
@@ -47,4 +47,27 @@
     </value-attributes>
     <on-ambari-upgrade add="true"/>
   </property>
+  <property>
+    <name>is_nested_groupsync_enabled</name>
+    <display-name>Sync Nested Groups</display-name>
+    <description/>
+    <value>false</value>
+    <value-attributes>
+      <type>value-list</type>
+      <overridable>false</overridable>
+      <entries>
+        <entry>
+          <value>true</value>
+          <label>Yes</label>
+        </entry>
+        <entry>
+          <value>false</value>
+          <label>No</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1</selection-cardinality>
+      <empty-value-valid>true</empty-value-valid>
+    </value-attributes>
+    <on-ambari-upgrade add="false"/>
+  </property>
 </configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-ugsync-site.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-ugsync-site.xml b/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-ugsync-site.xml
index a994856..6c244f2 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-ugsync-site.xml
+++ b/ambari-server/src/main/resources/common-services/RANGER/0.7.0/configuration/ranger-ugsync-site.xml
@@ -72,4 +72,11 @@
     </depends-on>
     <on-ambari-upgrade add="true"/>
   </property>
+  <property>
+    <name>ranger.usersync.ldap.grouphierarchylevels</name>
+    <display-name>Group Hierarchy Levels</display-name>
+    <value>0</value>
+    <description/>
+    <on-ambari-upgrade add="false"/>
+  </property>
 </configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/common-services/RANGER/0.7.0/themes/theme_version_5.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/0.7.0/themes/theme_version_5.json b/ambari-server/src/main/resources/common-services/RANGER/0.7.0/themes/theme_version_5.json
index 8068a38..ed073b4 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/0.7.0/themes/theme_version_5.json
+++ b/ambari-server/src/main/resources/common-services/RANGER/0.7.0/themes/theme_version_5.json
@@ -9,6 +9,34 @@
           "subsection-tab-name": "ldap-common-configs"
         },
         {
+          "config": "ranger-env/is_nested_groupsync_enabled",
+          "subsection-name": "subsection-ranger-user-row2-col1",
+          "subsection-tab-name": "ldap-group-configs"
+        },
+        {
+          "config": "ranger-ugsync-site/ranger.usersync.ldap.grouphierarchylevels",
+          "subsection-name": "subsection-ranger-user-row2-col1",
+          "subsection-tab-name": "ldap-group-configs",
+          "depends-on": [
+            {
+              "configs":[
+                "ranger-env/is_nested_groupsync_enabled"
+              ],
+              "if": "${ranger-env/is_nested_groupsync_enabled}",
+              "then": {
+                "property_value_attributes": {
+                  "visible": true
+                }
+              },
+              "else": {
+                "property_value_attributes": {
+                  "visible": false
+                }
+              }
+            }
+          ]
+        },
+        {
           "config": "ranger-env/ranger-nifi-plugin-enabled",
           "subsection-name": "section-ranger-plugin-row1-col1",
           "depends-on": [
@@ -38,6 +66,18 @@
         }
       },
       {
+        "config": "ranger-env/is_nested_groupsync_enabled",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "ranger-ugsync-site/ranger.usersync.ldap.grouphierarchylevels",
+        "widget": {
+          "type": "text-field"
+        }
+      },
+      {
         "config": "ranger-env/ranger-nifi-plugin-enabled",
         "widget": {
           "type": "toggle"

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-env.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-env.xml b/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-env.xml
index ff44901..764e73e 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-env.xml
+++ b/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-env.xml
@@ -500,4 +500,27 @@
     </value-attributes>
     <on-ambari-upgrade add="false"/>
   </property>
+  <property>
+    <name>is_nested_groupsync_enabled</name>
+    <display-name>Sync Nested Groups</display-name>
+    <description/>
+    <value>false</value>
+    <value-attributes>
+      <type>value-list</type>
+      <overridable>false</overridable>
+      <entries>
+        <entry>
+          <value>true</value>
+          <label>Yes</label>
+        </entry>
+        <entry>
+          <value>false</value>
+          <label>No</label>
+        </entry>
+      </entries>
+      <selection-cardinality>1</selection-cardinality>
+      <empty-value-valid>true</empty-value-valid>
+    </value-attributes>
+    <on-ambari-upgrade add="false"/>
+  </property>
 </configuration>

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-ugsync-site.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-ugsync-site.xml b/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-ugsync-site.xml
index 80babd6..0d3ad26 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-ugsync-site.xml
+++ b/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/configuration/ranger-ugsync-site.xml
@@ -568,4 +568,11 @@
     <description/>
     <on-ambari-upgrade add="false"/>
   </property>
+  <property>
+    <name>ranger.usersync.ldap.grouphierarchylevels</name>
+    <display-name>Group Hierarchy Levels</display-name>
+    <value>0</value>
+    <description/>
+    <on-ambari-upgrade add="false"/>
+  </property>
 </configuration>

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/themes/theme_version_1.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/themes/theme_version_1.json b/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/themes/theme_version_1.json
index a307f56..679ee3d 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/themes/theme_version_1.json
+++ b/ambari-server/src/main/resources/common-services/RANGER/1.0.0.3.0/themes/theme_version_1.json
@@ -842,6 +842,34 @@
           ]
         },
         {
+          "config": "ranger-env/is_nested_groupsync_enabled",
+          "subsection-name": "subsection-ranger-user-row2-col1",
+          "subsection-tab-name": "ldap-group-configs"
+        },
+        {
+          "config": "ranger-ugsync-site/ranger.usersync.ldap.grouphierarchylevels",
+          "subsection-name": "subsection-ranger-user-row2-col1",
+          "subsection-tab-name": "ldap-group-configs",
+          "depends-on": [
+            {
+              "configs":[
+                "ranger-env/is_nested_groupsync_enabled"
+              ],
+              "if": "${ranger-env/is_nested_groupsync_enabled}",
+              "then": {
+                "property_value_attributes": {
+                  "visible": true
+                }
+              },
+              "else": {
+                "property_value_attributes": {
+                  "visible": false
+                }
+              }
+            }
+          ]
+        },
+        {
           "config": "ranger-env/ranger-hdfs-plugin-enabled",
           "subsection-name": "section-ranger-plugin-row1-col1",
           "depends-on": [
@@ -1643,6 +1671,18 @@
         }
       },
       {
+        "config": "ranger-env/is_nested_groupsync_enabled",
+        "widget": {
+          "type": "toggle"
+        }
+      },
+      {
+        "config": "ranger-ugsync-site/ranger.usersync.ldap.grouphierarchylevels",
+        "widget": {
+          "type": "text-field"
+        }
+      },
+      {
         "config": "ranger-env/ranger-hdfs-plugin-enabled",
         "widget": {
           "type": "toggle"

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
index bce1e86..ebb81d9 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
@@ -391,6 +391,13 @@
         <task xsi:type="configure" id="hdp_2_6_0_0_spark2_thriftserver"/>
       </execute-stage>
 
+      <!-- RANGER -->
+      <execute-stage service="RANGER" component="RANGER_USERSYNC" title="Enabling Nested Group Sync for Ranger">
+        <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.RangerUsersyncConfigCalculation">
+          <summary>Enabling Nested Group Sync for Ranger</summary>
+        </task>
+      </execute-stage>
+
     </group>
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
index d5f2324..ae5972e 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
@@ -555,6 +555,14 @@
       </component>
 
       <component name="RANGER_USERSYNC">
+        <pre-upgrade>
+          <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.RangerUsersyncConfigCalculation">
+            <summary>Enabling Nested Group Sync for Ranger</summary>
+          </task>
+        </pre-upgrade>
+
+        <pre-downgrade /> <!--  no-op to prevent config changes on downgrade -->
+
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/ea892443/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java
new file mode 100644
index 0000000..427fb33
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/RangerUsersyncConfigCalculationTest.java
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.serveraction.upgrades;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper;
+import org.apache.ambari.server.actionmanager.HostRoleCommand;
+import org.apache.ambari.server.agent.CommandReport;
+import org.apache.ambari.server.agent.ExecutionCommand;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.inject.Injector;
+
+public class RangerUsersyncConfigCalculationTest {
+
+  private Injector m_injector;
+  private Clusters m_clusters;
+  private Field m_clusterField;
+
+  @Before
+  public void setup() throws Exception {
+    m_injector = createMock(Injector.class);
+    m_clusters = createMock(Clusters.class);
+    Cluster cluster = createMock(Cluster.class);
+
+    Map<String, String> mockRangerUsersyncProperties = new HashMap<String, String>() {
+      {
+        put("ranger.usersync.ldap.grouphierarchylevels", "2");
+      }
+    };
+
+    Map<String, String> mockRangerEnvProperties = new HashMap<String, String>();
+
+    Config rangerUsersyncConfig = createMock(Config.class);
+    expect(rangerUsersyncConfig.getType()).andReturn("ranger-ugsync-site").anyTimes();
+    expect(rangerUsersyncConfig.getProperties()).andReturn(mockRangerUsersyncProperties).anyTimes();
+
+    Config rangerEnvConfig = createMock(Config.class);
+    expect(rangerEnvConfig.getType()).andReturn("ranger-env").anyTimes();
+    expect(rangerEnvConfig.getProperties()).andReturn(mockRangerEnvProperties).anyTimes();
+
+    rangerEnvConfig.setProperties(anyObject(Map.class));
+    expectLastCall().atLeastOnce();
+
+    rangerEnvConfig.save();
+    expectLastCall().atLeastOnce();
+
+    expect(cluster.getDesiredConfigByType("ranger-ugsync-site")).andReturn(rangerUsersyncConfig).atLeastOnce();
+    expect(cluster.getDesiredConfigByType("ranger-env")).andReturn(rangerEnvConfig).atLeastOnce();
+    expect(m_clusters.getCluster((String) anyObject())).andReturn(cluster).anyTimes();
+    expect(m_injector.getInstance(Clusters.class)).andReturn(m_clusters).atLeastOnce();
+
+    replay(m_injector, m_clusters, cluster, rangerUsersyncConfig, rangerEnvConfig);
+
+    m_clusterField = RangerUsersyncConfigCalculation.class.getDeclaredField("m_clusters");
+    m_clusterField.setAccessible(true);
+
+  }
+
+  @Test
+  public void testAction() throws Exception {
+
+    Map<String, String> commandParams = new HashMap<String, String>();
+    commandParams.put("clusterName", "cl1");
+
+    ExecutionCommand executionCommand = new ExecutionCommand();
+    executionCommand.setCommandParams(commandParams);
+    executionCommand.setClusterName("cl1");
+
+    HostRoleCommand hrc = createMock(HostRoleCommand.class);
+    expect(hrc.getRequestId()).andReturn(1L).anyTimes();
+    expect(hrc.getStageId()).andReturn(2L).anyTimes();
+    expect(hrc.getExecutionCommandWrapper()).andReturn(new ExecutionCommandWrapper(executionCommand)).anyTimes();
+    replay(hrc);
+
+    RangerUsersyncConfigCalculation action = new RangerUsersyncConfigCalculation();
+    m_clusterField.set(action, m_clusters);
+
+    action.setExecutionCommand(executionCommand);
+    action.setHostRoleCommand(hrc);
+
+    CommandReport report = action.execute(null);
+    Assert.assertNotNull(report);
+
+    Cluster cl = m_clusters.getCluster("cl1");
+    Config config = cl.getDesiredConfigByType("ranger-env");
+
+    Map<String, String> map = config.getProperties();
+
+    Assert.assertTrue(map.containsKey("is_nested_groupsync_enabled"));
+    Assert.assertEquals("true", map.get("is_nested_groupsync_enabled"));
+
+    report = action.execute(null);
+    Assert.assertNotNull(report);
+
+  }
+}
\ No newline at end of file


[29/50] [abbrv] ambari git commit: AMBARI-22058 Dashboard heatmaps tab loading stuck (dsen)

Posted by ao...@apache.org.
AMBARI-22058 Dashboard heatmaps tab loading stuck (dsen)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7af3152c
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7af3152c
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7af3152c

Branch: refs/heads/branch-3.0-perf
Commit: 7af3152c5baf440bfc6d48f783e7133b41d434f9
Parents: fe7a8e4
Author: Dmytro Sen <ds...@apache.org>
Authored: Tue Sep 26 17:13:55 2017 +0300
Committer: Dmytro Sen <ds...@apache.org>
Committed: Tue Sep 26 17:13:55 2017 +0300

----------------------------------------------------------------------
 .../internal/ServiceResourceProvider.java       |  8 ++
 .../AmbariManagementControllerTest.java         | 11 +++
 .../resources/stacks/OTHER/1.0/widgets.json     | 95 ++++++++++++++++++++
 3 files changed, 114 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/7af3152c/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
index e65693b..76a4547 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
@@ -423,6 +423,8 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
     // do all validation checks
     validateCreateRequests(requests, clusters);
 
+    Set<Cluster> clustersSetFromRequests = new HashSet<>();
+
     for (ServiceRequest request : requests) {
       Cluster cluster = clusters.getCluster(request.getClusterName());
 
@@ -478,6 +480,12 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
 
       // Initialize service widgets
       getManagementController().initializeWidgetsAndLayouts(cluster, s);
+      clustersSetFromRequests.add(cluster);
+    }
+
+    // Create cluster widgets and layouts
+    for (Cluster cluster : clustersSetFromRequests) {
+      getManagementController().initializeWidgetsAndLayouts(cluster, null);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/7af3152c/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 07ba786..b370829 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -10423,6 +10423,17 @@ public class AmbariManagementControllerTest {
     Assert.assertEquals("FILES_LOCAL", layoutUserWidgetEntities.get(2).getWidget().getWidgetName());
     Assert.assertEquals("UPDATED_BLOCKED_TIME", layoutUserWidgetEntities.get(3).getWidget().getWidgetName());
     Assert.assertEquals("HBASE_SUMMARY", layoutUserWidgetEntities.get(0).getWidget().getDefaultSectionName());
+
+    candidateLayoutEntity = null;
+    for (WidgetLayoutEntity entity : layoutEntities) {
+      if (entity.getLayoutName().equals("default_system_heatmap")) {
+        candidateLayoutEntity = entity;
+        break;
+      }
+    }
+    Assert.assertNotNull(candidateLayoutEntity);
+    Assert.assertEquals("ambari", candidateVisibleEntity.getAuthor());
+    Assert.assertEquals("CLUSTER", candidateVisibleEntity.getScope());
   }
 
   // this is a temporary measure as a result of moving updateHostComponents from AmbariManagementController

http://git-wip-us.apache.org/repos/asf/ambari/blob/7af3152c/ambari-server/src/test/resources/stacks/OTHER/1.0/widgets.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/OTHER/1.0/widgets.json b/ambari-server/src/test/resources/stacks/OTHER/1.0/widgets.json
new file mode 100644
index 0000000..3176354
--- /dev/null
+++ b/ambari-server/src/test/resources/stacks/OTHER/1.0/widgets.json
@@ -0,0 +1,95 @@
+{
+  "layouts": [
+    {
+      "layout_name": "default_system_heatmap",
+      "display_name": "Heatmaps",
+      "section_name": "SYSTEM_HEATMAPS",
+      "widgetLayoutInfo": [
+        {
+          "widget_name": "Host Disk Space Used %",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "disk_free",
+              "metric_path": "metrics/disk/disk_free",
+              "service_name": "STACK"
+            },
+            {
+              "name": "disk_total",
+              "metric_path": "metrics/disk/disk_total",
+              "service_name": "STACK"
+            }
+          ],
+          "values": [
+            {
+              "name": "Host Disk Space Used %",
+              "value": "${((disk_total-disk_free)/disk_total)*100}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%",
+            "max_limit": "100"
+          }
+        },
+        {
+          "widget_name": "Host Memory Used %",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "mem_total",
+              "metric_path": "metrics/memory/mem_total",
+              "service_name": "STACK"
+            },
+            {
+              "name": "mem_free",
+              "metric_path": "metrics/memory/mem_free",
+              "service_name": "STACK"
+            },
+            {
+              "name": "mem_cached",
+              "metric_path": "metrics/memory/mem_cached",
+              "service_name": "STACK"
+            }
+          ],
+          "values": [
+            {
+              "name": "Host Memory Used %",
+              "value": "${((mem_total-mem_free-mem_cached)/mem_total)*100}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%",
+            "max_limit": "100"
+          }
+        },
+        {
+          "widget_name": "Host CPU Wait IO %",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "cpu_wio",
+              "metric_path": "metrics/cpu/cpu_wio",
+              "service_name": "STACK"
+            }
+          ],
+          "values": [
+            {
+              "name": "Host Memory Used %",
+              "value": "${cpu_wio*100}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%",
+            "max_limit": "100"
+          }
+        }
+      ]
+    }
+  ]
+}


[15/50] [abbrv] ambari git commit: AMBARI-22051 - VDFs Which Are Correct Never Get Resolved (jonathanhurley)

Posted by ao...@apache.org.
AMBARI-22051 -  VDFs Which Are Correct Never Get Resolved (jonathanhurley)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/08da9611
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/08da9611
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/08da9611

Branch: refs/heads/branch-3.0-perf
Commit: 08da9611188d9c4c246ee6d77894da5edf317860
Parents: 4b59ba8
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Mon Sep 25 10:11:52 2017 -0400
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Mon Sep 25 12:36:44 2017 -0400

----------------------------------------------------------------------
 .../DistributeRepositoriesActionListener.java   |  7 ++++
 .../listeners/upgrade/StackVersionListener.java |  7 ++++
 .../upgrade/StackVersionListenerTest.java       | 41 ++++++++++++++++++++
 3 files changed, 55 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/08da9611/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
index 376e20d..1944761 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
@@ -127,6 +127,13 @@ public class DistributeRepositoriesActionListener {
             repoVersion.setResolved(true);
             repoVersionDAO.merge(repoVersion);
             repositoryVersion = actualVersion;
+          } else {
+            // the reported versions are the same - we should ensure that the
+            // repo is resolved
+            if (!repoVersion.isResolved()) {
+              repoVersion.setResolved(true);
+              repoVersionDAO.merge(repoVersion);
+            }
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/08da9611/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
index 0ce64bf..e5298dc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
@@ -101,6 +101,13 @@ public class StackVersionListener {
           rve.setVersion(newVersion);
           rve.setResolved(true);
           repositoryVersionDAO.merge(rve);
+        } else {
+          // the reported versions are the same - we should ensure that the repo
+          // is resolved
+          if (!rve.isResolved()) {
+            rve.setResolved(true);
+            repositoryVersionDAO.merge(rve);
+          }
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/08da9611/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java
index 68d9c56..5e12cdf 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListenerTest.java
@@ -330,6 +330,47 @@ public class StackVersionListenerTest extends EasyMockSupport {
   }
 
   /**
+   * Tests that if a component advertises a version and the repository already
+   * matches, that we ensure that it is marked as resolved.
+   *
+   * @throws Exception
+   */
+  @Test
+  public void testRepositoryResolvedWhenVersionsMatch() throws Exception {
+    String version = "2.4.0.0";
+
+    expect(sch.getVersion()).andReturn(version);
+    expect(componentInfo.isVersionAdvertised()).andReturn(true).once();
+
+    RepositoryVersionDAO dao = createNiceMock(RepositoryVersionDAO.class);
+    RepositoryVersionEntity entity = createNiceMock(RepositoryVersionEntity.class);
+    expect(entity.getVersion()).andReturn(version).once();
+    expect(entity.isResolved()).andReturn(false).once();
+
+    // when the version gets reported back, we set this repo to resolved
+    entity.setResolved(true);
+    expectLastCall().once();
+
+    expect(dao.findByPK(1L)).andReturn(entity).once();
+    expect(dao.merge(entity)).andReturn(entity).once();
+
+    replayAll();
+
+    String newVersion = version;
+
+    HostComponentVersionAdvertisedEvent event = new HostComponentVersionAdvertisedEvent(cluster, sch, newVersion, 1L);
+    
+    // !!! avoid injector for test class
+    Field field = StackVersionListener.class.getDeclaredField("repositoryVersionDAO");
+    field.setAccessible(true);
+    field.set(listener, dao);
+
+    listener.onAmbariEvent(event);
+
+    verifyAll();
+  }
+
+  /**
    * Tests that the {@link RepositoryVersionEntity} is not updated if there is
    * an upgrade, even if the repo ID is passed back and the versions don't
    * match.


[08/50] [abbrv] ambari git commit: AMBARI-22047. Cannot upgrade stack due to 'Version XXXXX does not contain services that are installed' (alexantonenko)

Posted by ao...@apache.org.
AMBARI-22047. Cannot upgrade stack due to 'Version XXXXX does not contain services that are installed' (alexantonenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/06d21bb3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/06d21bb3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/06d21bb3

Branch: refs/heads/branch-3.0-perf
Commit: 06d21bb3850d2f8257c08064ab9d695d2a4c07c1
Parents: 12abba0
Author: Alex Antonenko <aa...@hortonworks.com>
Authored: Mon Sep 25 13:55:39 2017 +0300
Committer: Alex Antonenko <aa...@hortonworks.com>
Committed: Mon Sep 25 13:55:39 2017 +0300

----------------------------------------------------------------------
 .../main/admin/stack_and_upgrade_controller.js  |  2 +-
 .../admin/stack_and_upgrade_controller_test.js  | 24 +++++++++++++++++---
 2 files changed, 22 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/06d21bb3/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
index 6d7560b..90a4db9 100644
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
@@ -1513,7 +1513,7 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     var availableServices = repo.get('stackServices').filter(function(service) {
       return App.Service.find(service.get('name')).get('isLoaded') && service.get('isAvailable') && service.get('isUpgradable');
     }, this);
-    if (!availableServices.length){
+    if (!availableServices.length && !repo.get('isStandard')){
       return App.showAlertPopup( Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title'), Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.noAvailableServices').format(repo.get('displayName')) );
     }
     var self = this;

http://git-wip-us.apache.org/repos/asf/ambari/blob/06d21bb3/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
index d0671f9..1b04b17 100644
--- a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
@@ -1170,18 +1170,36 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   describe("#installRepoVersionPopup()", function () {
     before(function () {
       sinon.stub(controller, 'installRepoVersion', Em.K);
-      sinon.stub(App.Service, 'find').returns({});
+      sinon.stub(App.Service, 'find').returns(Em.Object.create({
+        isLoaded: true
+      }));
     });
     after(function () {
       controller.installRepoVersion.restore();
       App.Service.find.restore();
     });
-    it("show popup", function () {
-      var repo = Em.Object.create({'displayName': 'HDP-2.2', stackServices: []});
+    it("show confirmation popup for non standart and available services", function () {
+      var repo = Em.Object.create({'displayName': 'HDP-2.2', isStandard: false, stackServices: [Em.Object.create({
+        name: 'HDFS',
+        isUpgradable: true,
+        isAvailable: true
+      })]});
+      var popup = controller.installRepoVersionPopup(repo);
+      popup.onPrimary();
+      expect(controller.installRepoVersion.calledWith(repo)).to.be.true;
+    });
+    it("show pre-check popup for non standard and empty available services", function () {
+      var repo = Em.Object.create({'displayName': 'HDP-2.2', isStandard: false, stackServices: []});
       var popup = controller.installRepoVersionPopup(repo);
       popup.onPrimary();
       expect(controller.installRepoVersion.calledWith(repo)).to.be.false;
     });
+    it("show confirmation popup for standart", function () {
+      var repo = Em.Object.create({'displayName': 'HDP-2.2', isStandard: true, stackServices: []});
+      var popup = controller.installRepoVersionPopup(repo);
+      popup.onPrimary();
+      expect(controller.installRepoVersion.calledWith(repo)).to.be.true;
+    });
   });
 
   describe("#installRepoVersion()", function () {


[14/50] [abbrv] ambari git commit: AMBARI-22029. Download Client Configs fails. (mpapirkovskyy)

Posted by ao...@apache.org.
AMBARI-22029. Download Client Configs fails. (mpapirkovskyy)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4b59ba82
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4b59ba82
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4b59ba82

Branch: refs/heads/branch-3.0-perf
Commit: 4b59ba8203abf46d2c5bfa766bbf968ab964cff4
Parents: 0393451
Author: Myroslav Papirkovskyi <mp...@hortonworks.com>
Authored: Mon Sep 25 19:09:44 2017 +0300
Committer: Myroslav Papirkovskyi <mp...@hortonworks.com>
Committed: Mon Sep 25 19:10:33 2017 +0300

----------------------------------------------------------------------
 .../server/controller/internal/ClientConfigResourceProvider.java   | 2 ++
 .../OOZIE/4.0.0.2.0/package/scripts/params_linux.py                | 2 ++
 2 files changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/4b59ba82/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
index 166fc5f..9f4a4a0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
@@ -445,6 +445,8 @@ public class ClientConfigResourceProvider extends AbstractControllerResourceProv
         jsonContent.put("hostname", hostName);
         jsonContent.put("public_hostname", publicHostName);
         jsonContent.put("clusterName", cluster.getClusterName());
+        jsonContent.put("serviceName", serviceName);
+        jsonContent.put("role", componentName);
         jsonConfigurations = gson.toJson(jsonContent);
 
         File tmpDirectory = new File(TMP_PATH);

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b59ba82/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py b/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
index e856c01..b66e157 100644
--- a/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py
@@ -57,6 +57,8 @@ architecture = get_architecture()
 
 # Needed since this writes out the Atlas Hive Hook config file.
 cluster_name = config['clusterName']
+serviceName = config['serviceName']
+role = config['role']
 
 hostname = config["hostname"]
 


[48/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
index fcf32f0,53cceb0..00d469f
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
@@@ -233,30 -266,10 +235,30 @@@ public class HeartBeatHandler 
      return response;
    }
  
 +  public void handleComponentReportStatus(List<ComponentStatus> componentStatuses, String hostname) throws AmbariException {
 +    heartbeatProcessor.processStatusReports(componentStatuses, hostname);
 +    heartbeatProcessor.processHostStatus(componentStatuses, null, hostname);
 +  }
  
 +  public void handleCommandReportStatus(List<CommandReport> reports, String hostname) throws AmbariException {
 +    heartbeatProcessor.processCommandReports(reports, hostname, System.currentTimeMillis());
 +    heartbeatProcessor.processHostStatus(null, reports, hostname);
 +  }
 +
 +  public void handleHostReportStatus(HostStatusReport hostStatusReport, String hostname) throws AmbariException {
 +    Host host = clusterFsm.getHost(hostname);
 +    try {
 +      host.handleEvent(new HostHealthyHeartbeatEvent(hostname, System.currentTimeMillis(),
 +          hostStatusReport.getAgentEnv(), hostStatusReport.getMounts()));
 +    } catch (InvalidStateTransitionException ex) {
 +      LOG.warn("Asking agent to re-register due to " + ex.getMessage(), ex);
 +      host.setState(HostState.INIT);
 +      agentSessionManager.unregisterByHost(hostname);
 +    }
 +  }
  
    protected void processRecoveryReport(RecoveryReport recoveryReport, String hostname) throws AmbariException {
-     LOG.debug("Received recovery report: " + recoveryReport.toString());
+     LOG.debug("Received recovery report: {}", recoveryReport);
      Host host = clusterFsm.getHost(hostname);
      host.setRecoveryReport(recoveryReport);
    }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
index 43470cf,2690008..ef9b0f2
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
@@@ -55,9 -59,7 +59,8 @@@ import org.apache.ambari.server.state.C
  import org.apache.ambari.server.state.ComponentInfo;
  import org.apache.ambari.server.state.Host;
  import org.apache.ambari.server.state.HostHealthStatus;
 +import org.apache.ambari.server.state.HostState;
  import org.apache.ambari.server.state.MaintenanceState;
- import org.apache.ambari.server.state.SecurityState;
  import org.apache.ambari.server.state.Service;
  import org.apache.ambari.server.state.ServiceComponent;
  import org.apache.ambari.server.state.ServiceComponentHost;
@@@ -300,13 -297,13 +303,12 @@@ public class HeartbeatProcessor extend
          int slaveCount = 0;
          int slavesRunning = 0;
  
-         StackId stackId;
 -        Cluster cluster = clusterFsm.getCluster(clusterName);
 -
 +        Cluster cluster = clusterFsm.getCluster(clusterId);
-         stackId = cluster.getDesiredStackVersion();
- 
  
 -        List<ServiceComponentHost> scHosts = cluster.getServiceComponentHosts(heartbeat.getHostname());
 +        List<ServiceComponentHost> scHosts = cluster.getServiceComponentHosts(hostName);
          for (ServiceComponentHost scHost : scHosts) {
+           StackId stackId = scHost.getDesiredStackId();
+ 
            ComponentInfo componentInfo =
                ambariMetaInfo.getComponent(stackId.getStackName(),
                    stackId.getStackVersion(), scHost.getServiceName(),
@@@ -372,13 -368,22 +374,14 @@@
  
      for (CommandReport report : reports) {
  
 -      Long clusterId = null;
 -      if (report.getClusterName() != null) {
 -        try {
 -          Cluster cluster = clusterFsm.getCluster(report.getClusterName());
 -          clusterId = cluster.getClusterId();
 -        } catch (AmbariException e) {
 -          // null clusterId reported and handled by the listener (DistributeRepositoriesActionListener)
 -        }
 -      }
 +      Long clusterId = Long.parseLong(report.getClusterId());
  
-       LOG.debug("Received command report: " + report);
+       LOG.debug("Received command report: {}", report);
+ 
+       // get this locally; don't touch the database
 -      Host host = clusterFsm.getHost(hostname);
 +      Host host = clusterFsm.getHost(hostName);
- //      HostEntity hostEntity = hostDAO.findByName(hostname); //don't touch database
        if (host == null) {
 -        LOG.error("Received a command report and was unable to retrieve Host for hostname = " + hostname);
 +        LOG.error("Received a command report and was unable to retrieve Host for hostname = " + hostName);
          continue;
        }
  
@@@ -444,6 -449,12 +447,12 @@@
                }
              }
            }
+         } else if (CHECK_KEYTABS.equalsIgnoreCase(customCommand)) {
+           ListKeytabsStructuredOut structuredOut = gson.fromJson(report.getStructuredOut(), ListKeytabsStructuredOut.class);
+           for (MissingKeytab each : structuredOut.missingKeytabs){
 -            LOG.info("Missing keytab: {} on host: {} principal: {}", each.keytabFilePath, hostname, each.principal);
++            LOG.info("Missing keytab: {} on host: {} principal: {}", each.keytabFilePath, hostName, each.principal);
+             kerberosPrincipalHostDAO.remove(each.principal, host.getHostId());
+           }
          }
        }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/HostInfo.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/HostStatus.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryConfig.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryConfigHelper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryReport.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/Register.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentReportsController.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentReportsController.java
index 4d2b9d6,0000000..5599254
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentReportsController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentReportsController.java
@@@ -1,109 -1,0 +1,105 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +package org.apache.ambari.server.agent.stomp;
 +
 +import java.util.ArrayList;
 +import java.util.Arrays;
 +import java.util.List;
 +import java.util.Map;
 +
 +import javax.ws.rs.WebApplicationException;
 +
 +import org.apache.ambari.server.AmbariException;
 +import org.apache.ambari.server.agent.AgentSessionManager;
 +import org.apache.ambari.server.agent.CommandReport;
 +import org.apache.ambari.server.agent.ComponentStatus;
 +import org.apache.ambari.server.agent.HeartBeatHandler;
 +import org.apache.ambari.server.agent.stomp.dto.CommandStatusReports;
 +import org.apache.ambari.server.agent.stomp.dto.ComponentStatusReport;
 +import org.apache.ambari.server.agent.stomp.dto.ComponentStatusReports;
 +import org.apache.ambari.server.agent.stomp.dto.HostStatusReport;
 +import org.apache.ambari.server.state.Alert;
 +import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
 +import org.springframework.messaging.handler.annotation.Header;
 +import org.springframework.messaging.handler.annotation.MessageMapping;
 +import org.springframework.messaging.simp.annotation.SendToUser;
 +import org.springframework.messaging.simp.annotation.SubscribeMapping;
 +import org.springframework.stereotype.Controller;
 +
 +import com.google.inject.Injector;
 +
 +@Controller
 +@SendToUser("/")
 +@MessageMapping("/reports")
 +public class AgentReportsController {
 +  private static final Logger LOG = LoggerFactory.getLogger(AgentReportsController.class);
 +  private final HeartBeatHandler hh;
 +  private final AgentSessionManager agentSessionManager;
 +
 +  public AgentReportsController(Injector injector) {
 +    hh = injector.getInstance(HeartBeatHandler.class);
 +    agentSessionManager = injector.getInstance(AgentSessionManager.class);
 +  }
 +
 +  @SubscribeMapping("/component_status")
 +  public void handleComponentReportStatus(@Header String simpSessionId, ComponentStatusReports message)
 +      throws WebApplicationException, InvalidStateTransitionException, AmbariException {
 +    List<ComponentStatus> statuses = new ArrayList<>();
 +    for (Map.Entry<String, List<ComponentStatusReport>> clusterReport : message.getComponentStatusReports().entrySet()) {
 +      for (ComponentStatusReport report : clusterReport.getValue()) {
 +        ComponentStatus componentStatus = new ComponentStatus();
 +        componentStatus.setClusterId(report.getClusterId());
 +        componentStatus.setComponentName(report.getComponentName());
 +        componentStatus.setServiceName(report.getServiceName());
-         if (report.getCommand().equals(ComponentStatusReport.CommandStatusCommand.STATUS)) {
-           componentStatus.setStatus(report.getStatus());
-         } else {
-           componentStatus.setSecurityState(report.getStatus());
-         }
++        componentStatus.setStatus(report.getStatus());
 +        statuses.add(componentStatus);
 +      }
 +    }
 +
 +    hh.handleComponentReportStatus(statuses,
 +        agentSessionManager.getHost(simpSessionId).getHostName());
 +  }
 +
 +  @SubscribeMapping("/commands_status")
 +  public void handleCommandReportStatus(@Header String simpSessionId, CommandStatusReports message)
 +      throws WebApplicationException, InvalidStateTransitionException, AmbariException {
 +    List<CommandReport> statuses = new ArrayList<>();
 +    for (Map.Entry<String, List<CommandReport>> clusterReport : message.getClustersComponentReports().entrySet()) {
 +      statuses.addAll(clusterReport.getValue());
 +    }
 +
 +    hh.handleCommandReportStatus(statuses,
 +        agentSessionManager.getHost(simpSessionId).getHostName());
 +  }
 +
 +  @SubscribeMapping("/host_status")
 +  public void handleHostReportStatus(@Header String simpSessionId, HostStatusReport message) throws AmbariException {
 +    hh.handleHostReportStatus(message, agentSessionManager.getHost(simpSessionId).getHostName());
 +  }
 +
 +  @SubscribeMapping("/alerts_status")
 +  public void handleAlertsStatus(@Header String simpSessionId, Alert[] message) throws AmbariException {
 +    String hostName = agentSessionManager.getHost(simpSessionId).getHostName();
 +    List<Alert> alerts = Arrays.asList(message);
 +    LOG.info("Handling {} alerts status for host {}", alerts.size(), hostName);
 +    hh.getHeartbeatProcessor().processAlerts(hostName, alerts);
 +  }
 +
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HostLevelParamsHolder.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HostLevelParamsHolder.java
index db093f8,0000000..3d17ef2
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HostLevelParamsHolder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HostLevelParamsHolder.java
@@@ -1,83 -1,0 +1,84 @@@
 +/**
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +package org.apache.ambari.server.agent.stomp;
 +
 +import java.util.TreeMap;
 +
 +import org.apache.ambari.server.AmbariException;
 +import org.apache.ambari.server.agent.RecoveryConfigHelper;
 +import org.apache.ambari.server.agent.stomp.dto.HostLevelParamsCluster;
 +import org.apache.ambari.server.api.services.AmbariMetaInfo;
 +import org.apache.ambari.server.events.HostLevelParamsUpdateEvent;
 +import org.apache.ambari.server.events.publishers.StateUpdateEventPublisher;
 +import org.apache.ambari.server.state.Cluster;
 +import org.apache.ambari.server.state.Clusters;
 +import org.apache.ambari.server.state.Host;
 +
 +import com.google.inject.Inject;
 +import com.google.inject.Singleton;
 +
 +@Singleton
 +public class HostLevelParamsHolder extends AgentHostDataHolder<HostLevelParamsUpdateEvent> {
 +
 +  @Inject
 +  private RecoveryConfigHelper recoveryConfigHelper;
 +
 +  @Inject
 +  private AmbariMetaInfo ambariMetaInfo;
 +
 +  @Inject
 +  private Clusters clusters;
 +
 +  private StateUpdateEventPublisher stateUpdateEventPublisher;
 +
 +  @Inject
 +  public HostLevelParamsHolder(StateUpdateEventPublisher stateUpdateEventPublisher) {
 +    this.stateUpdateEventPublisher = stateUpdateEventPublisher;
 +    stateUpdateEventPublisher.register(this);
 +  }
 +
 +  @Override
 +  public HostLevelParamsUpdateEvent getCurrentData(String hostName) throws AmbariException {
 +    TreeMap<String, HostLevelParamsCluster> hostLevelParamsClusters = new TreeMap<>();
 +    for (Cluster cl : clusters.getClustersForHost(hostName)) {
 +      Host host = clusters.getHost(hostName);
++      //TODO fix repo info host param
 +      HostLevelParamsCluster hostLevelParamsCluster = new HostLevelParamsCluster(
-           ambariMetaInfo.getRepoInfo(cl, host),
++          null,//ambariMetaInfo.getRepoInfo(cl, host),
 +          recoveryConfigHelper.getRecoveryConfig(cl.getClusterName(), hostName));
 +
 +      hostLevelParamsClusters.put(Long.toString(cl.getClusterId()),
 +          hostLevelParamsCluster);
 +    }
 +    HostLevelParamsUpdateEvent hostLevelParamsUpdateEvent = new HostLevelParamsUpdateEvent(hostLevelParamsClusters);
 +    return hostLevelParamsUpdateEvent;
 +  }
 +
 +  public void updateData(HostLevelParamsUpdateEvent update) throws AmbariException {
 +    //TODO implement update host level params process
 +    setData(update, update.getHostName());
 +    regenerateHash(update.getHostName());
 +    update.setHash(getData(update.getHostName()).getHash());
 +    stateUpdateEventPublisher.publish(update);
 +  }
 +
 +  @Override
 +  protected HostLevelParamsUpdateEvent getEmptyData() {
 +    return HostLevelParamsUpdateEvent.emptyUpdate();
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/alerts/AgentHeartbeatAlertRunnable.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/alerts/AlertRunnable.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/alerts/AlertRunnable.java
index ea583e4,3d7d3c7..bdcffbc
--- a/ambari-server/src/main/java/org/apache/ambari/server/alerts/AlertRunnable.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/alerts/AlertRunnable.java
@@@ -162,4 -163,30 +163,30 @@@ public abstract class AlertRunnable imp
      Number number = NumberUtils.createNumber((String) value);
      return number.intValue();
    }
+ 
+   /**
+    * Builds an {@link Alert} instance.
+    *
+    * @param cluster
+    *          the cluster the alert is for (not {@code null}).
+    * @param myDefinition
+    *          the alert's definition (not {@code null}).
+    * @param alertState
+    *          the state of the alert (not {@code null}).
+    * @param message
+    *          the alert text.
+    * @return and alert.
+    */
+   protected Alert buildAlert(Cluster cluster, AlertDefinitionEntity myDefinition,
+       AlertState alertState, String message) {
+     Alert alert = new Alert(myDefinition.getDefinitionName(), null, myDefinition.getServiceName(),
+         myDefinition.getComponentName(), null, alertState);
+ 
+     alert.setLabel(myDefinition.getLabel());
+     alert.setText(message);
+     alert.setTimestamp(System.currentTimeMillis());
 -    alert.setCluster(cluster.getClusterName());
++    alert.setClusterId(cluster.getClusterId());
+ 
+     return alert;
+   }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/alerts/AmbariPerformanceRunnable.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/alerts/StaleAlertRunnable.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateSummary.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateValues.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertSummaryGroupedRenderer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ClusterResourceDefinition.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/resources/ClusterResourceDefinition.java
index e181347,9d0c169..8933dd3
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ClusterResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ClusterResourceDefinition.java
@@@ -85,6 -85,9 +85,8 @@@ public class ClusterResourceDefinition 
      directives.add(KerberosHelper.DIRECTIVE_REGENERATE_KEYTABS);
      directives.add(KerberosHelper.DIRECTIVE_MANAGE_KERBEROS_IDENTITIES);
      directives.add(KerberosHelper.DIRECTIVE_FORCE_TOGGLE_KERBEROS);
+     directives.add(KerberosHelper.DIRECTIVE_HOSTS);
+     directives.add(KerberosHelper.DIRECTIVE_COMPONENTS);
 -    directives.add(KerberosHelper.DIRECTIVE_IGNORE_CONFIGS);
      return directives;
    }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index ca4eed9,de84965..5f4ba17
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@@ -37,12 -36,12 +36,16 @@@ import java.util.List
  import java.util.Map;
  import java.util.Scanner;
  import java.util.Set;
++import java.util.function.Function;
  
  import javax.xml.bind.JAXBException;
  
++import org.apache.ambari.annotations.Experimental;
++import org.apache.ambari.annotations.ExperimentalFeature;
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.ParentObjectNotFoundException;
  import org.apache.ambari.server.StackAccessException;
++import org.apache.ambari.server.agent.CommandRepository;
  import org.apache.ambari.server.configuration.Configuration;
  import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
  import org.apache.ambari.server.controller.utilities.PropertyHelper;
@@@ -53,15 -52,8 +56,11 @@@ import org.apache.ambari.server.events.
  import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
  import org.apache.ambari.server.metadata.AmbariServiceAlertDefinitions;
  import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
- import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
  import org.apache.ambari.server.orm.dao.MetainfoDAO;
  import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
- import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
- import org.apache.ambari.server.orm.entities.MetainfoEntity;
 +import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 +import org.apache.ambari.server.orm.entities.RepositoryEntity;
 +import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
- import org.apache.ambari.server.stack.StackDirectory;
  import org.apache.ambari.server.stack.StackManager;
  import org.apache.ambari.server.stack.StackManagerFactory;
  import org.apache.ambari.server.state.Cluster;
@@@ -73,8 -64,7 +72,9 @@@ import org.apache.ambari.server.state.H
  import org.apache.ambari.server.state.OperatingSystemInfo;
  import org.apache.ambari.server.state.PropertyInfo;
  import org.apache.ambari.server.state.RepositoryInfo;
 +import org.apache.ambari.server.state.RepositoryVersionState;
  import org.apache.ambari.server.state.Service;
++import org.apache.ambari.server.state.ServiceComponent;
  import org.apache.ambari.server.state.ServiceInfo;
  import org.apache.ambari.server.state.StackId;
  import org.apache.ambari.server.state.StackInfo;
@@@ -95,6 -85,6 +95,9 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import com.google.gson.Gson;
++import com.google.gson.JsonArray;
++import com.google.gson.JsonElement;
++import com.google.gson.JsonObject;
  import com.google.gson.reflect.TypeToken;
  import com.google.inject.Inject;
  import com.google.inject.Singleton;
@@@ -151,23 -110,8 +123,11 @@@ public class AmbariMetaInfo 
  
    // all the supported OS'es
    @Inject
--  private OsFamily osFamily;
++  private OsFamily os_family;
 +
 +  @Inject
 +  private Gson gson;
  
-   @Inject
-   private ClusterVersionDAO clusterVersionDAO;
- 
    /**
     * ALL_SUPPORTED_OS is dynamically generated list from loaded families from os_family.json
     * Instead of append values here, please, add new families in json for tests and production
@@@ -280,12 -224,12 +240,12 @@@
    @Inject
    public void init() throws Exception {
      // Need to be initialized before all actions
--    ALL_SUPPORTED_OS = new ArrayList<>(osFamily.os_list());
++    ALL_SUPPORTED_OS = new ArrayList<>(os_family.os_list());
  
      readServerVersion();
  
      stackManager = stackManagerFactory.create(stackRoot, commonServicesRoot, extensionsRoot,
--        osFamily, false);
++        os_family, false);
  
      getCustomActionDefinitions(customActionRoot);
    }
@@@ -1498,132 -1406,33 +1422,262 @@@
  
      return versionDefinitions;
    }
 +  /**
 +   * Get repository info given a cluster and host.
 +   *
 +   * @param cluster  the cluster
 +   * @param host     the host
 +   *
 +   * @return the repo info
 +   *
 +   * @throws AmbariException if the repository information can not be obtained
-    */
 +  public String getRepoInfoString(Cluster cluster, Host host) throws AmbariException {
 +
 +    return getRepoInfoString(cluster, host.getOsType(), host.getOsFamily(), host.getHostName());
-   }
++  }*/
 +
-   public String getRepoInfoString(Cluster cluster, String hostOSType, String hostOSFamily, String hostName) throws AmbariException {
-     return gson.toJson(getRepoInfo(cluster, hostOSType, hostOSFamily, hostName));
++  public String getRepoInfoString(Cluster cluster, ServiceComponent component, Host host) throws AmbariException {
++    return gson.toJson(getCommandRepository(cluster, component, host));
 +  }
 +
 +  /**
 +   * Get repository info given a cluster and host.
 +   *
 +   * @param cluster  the cluster
 +   * @param host     the host
 +   *
 +   * @return the repo info
 +   *
++   * @deprecated use {@link #getCommandRepository(Cluster, ServiceComponent, Host)} instead.
 +   * @throws AmbariException if the repository information can not be obtained
 +   */
-   public List<RepositoryInfo> getRepoInfo(Cluster cluster, Host host) throws AmbariException {
++  @Deprecated
++  public String getRepoInfo(Cluster cluster, ServiceComponent component, Host host) throws AmbariException {
++
++    Function<List<RepositoryInfo>, JsonArray> function = new Function<List<RepositoryInfo>, JsonArray>() {
++      @Override
++      public JsonArray apply(List<RepositoryInfo> input) {
++        return null == input ? null : (JsonArray) gson.toJsonTree(input);
++      }
++    };
++
++    final JsonArray gsonList = getBaseUrls(cluster, component, host, function);
++
++    if (null == gsonList) {
++      return "";
++    }
++
++    BaseUrlUpdater<JsonArray> updater = new BaseUrlUpdater<JsonArray>(gsonList) {
++      @Override
++      public JsonArray apply(final RepositoryVersionEntity rve) {
++
++        JsonArray result = new JsonArray();
++
++        for (JsonElement e : gsonList) {
++          JsonObject obj = e.getAsJsonObject();
++
++          String repoId = obj.has("repoId") ? obj.get("repoId").getAsString() : null;
++          String repoName = obj.has("repoName") ? obj.get("repoName").getAsString() : null;
++          String baseUrl = obj.has("baseUrl") ? obj.get("baseUrl").getAsString() : null;
++          String osType = obj.has("osType") ? obj.get("osType").getAsString() : null;
++
++          if (null == repoId || null == baseUrl || null == osType || null == repoName) {
++            continue;
++          }
++
++          for (OperatingSystemEntity ose : rve.getOperatingSystems()) {
++            if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) {
++              for (RepositoryEntity re : ose.getRepositories()) {
++                if (re.getName().equals(repoName) &&
++                    !re.getBaseUrl().equals(baseUrl)) {
++                  obj.addProperty("baseUrl", re.getBaseUrl());
++                }
++              }
++              result.add(e);
++            }
++          }
++        }
 +
-     return getRepoInfo(cluster, host.getOsType(), host.getOsFamily(), host.getHostName());
++        return result;
++      }
++    };
++
++    return updateBaseUrls(cluster, component, updater).toString();
 +  }
 +
-   public List<RepositoryInfo> getRepoInfo(Cluster cluster, String hostOSType, String hostOSFamily, String hostName) throws AmbariException {
++  /**
++   * Builds repository information for inclusion in a command.  This replaces escaping json on
++   * a command.
++   *
++   * @param cluster the cluster
++   * @param host    the host
++   * @return  the command repository
++   * @throws AmbariException
++   */
++  @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES)
++  public CommandRepository getCommandRepository(final Cluster cluster, ServiceComponent component, final Host host) throws AmbariException {
++
++    final CommandRepository command = new CommandRepository();
++    StackId stackId = component.getDesiredStackId();
++    command.setRepositories(Collections.<RepositoryInfo>emptyList());
++    command.setStackName(stackId.getStackName());
++
++    final BaseUrlUpdater<Void> updater = new BaseUrlUpdater<Void>(null) {
++      @Override
++      public Void apply(RepositoryVersionEntity rve) {
++        command.setRepositoryVersionId(rve.getId());
++        command.setRepositoryVersion(rve.getVersion());
++        command.setStackName(rve.getStackName());
++
++        // !!! a repository version entity has all the repos worked out.  We shouldn't use
++        // the stack at all.
++        for (OperatingSystemEntity osEntity : rve.getOperatingSystems()) {
++          String osEntityFamily = os_family.find(osEntity.getOsType());
++          if (osEntityFamily.equals(host.getOsFamily())) {
++            command.setRepositories(osEntity.getOsType(), osEntity.getRepositories());
++
++            if (!osEntity.isAmbariManagedRepos()) {
++              command.setNonManaged();
++            } else {
++              command.setUniqueSuffix(String.format("-repo-%s", rve.getId()));
++            }
++          }
++        }
++
++        return null;
++      }
++    };
 +
-     StackId stackId = cluster.getDesiredStackVersion();
++    updateBaseUrls(cluster, component, updater);
++
++    return command;
++  }
++
++  /**
++   * Executed by two different representations of repos.  When we are comfortable with the new
++   * implementation, this may be removed and called inline in {@link #getCommandRepository(Cluster, ServiceComponent, Host)}
++   *
++   * @param cluster   the cluster to isolate the stack
++   * @param component the component
++   * @param host      used to resolve the family for the repositories
++   * @param function  function that will transform the supplied repositories for specific use.
++   * @return <T> the type as defined by the supplied {@code function}.
++   * @throws AmbariException
++   */
++  @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES)
++  private <T> T getBaseUrls(Cluster cluster, ServiceComponent component, Host host,
++                            Function<List<RepositoryInfo>, T> function) throws AmbariException {
++
++    String hostOsType = host.getOsType();
++    String hostOsFamily = host.getOsFamily();
++    String hostName = host.getHostName();
++
++    StackId stackId = component.getDesiredStackId();
 +
 +    Map<String, List<RepositoryInfo>> repos = getRepository(
 +        stackId.getStackName(), stackId.getStackVersion());
 +
-     String family = osFamily.find(hostOSType);
++    String family = os_family.find(hostOsType);
 +    if (null == family) {
-       family = hostOSFamily;
++      family = hostOsFamily;
 +    }
 +
-     List<RepositoryInfo> repoInfos = new ArrayList<>();
++    final List<RepositoryInfo> repoInfos;
 +
 +    // !!! check for the most specific first
-     if (repos.containsKey(hostOSType)) {
-       repoInfos = repos.get(hostOSType);
++    if (repos.containsKey(hostOsType)) {
++      repoInfos = repos.get(hostOsType);
 +    } else if (null != family && repos.containsKey(family)) {
 +      repoInfos = repos.get(family);
 +    } else {
++      repoInfos = null;
 +      LOG.warn("Could not retrieve repo information for host"
 +          + ", hostname=" + hostName
 +          + ", clusterName=" + cluster.getClusterName()
 +          + ", stackInfo=" + stackId.getStackId());
 +    }
 +
-     if (null != repoInfos) {
-       updateBaseUrls(cluster, repoInfos);
-       return repoInfos;
-     } else {
-       return null;
-     }
++    // leave it to function implementation to handle null.
++    return function.apply(repoInfos);
 +  }
++
 +  /**
 +   * Checks repo URLs against the current version for the cluster and makes
 +   * adjustments to the Base URL when the current is different.
-    * @param cluster   the cluster to load the current version
-    * @param repoInfos the array containing stack repo data
++   *
++   * @param <T> the result after appling the repository version, if found.
 +   */
-   private void updateBaseUrls(Cluster cluster, List<RepositoryInfo> repoInfos) throws AmbariException {
-     ClusterVersionEntity cve = cluster.getCurrentClusterVersion();
- 
-     if (null == cve) {
-       List<ClusterVersionEntity> list = clusterVersionDAO.findByClusterAndState(cluster.getClusterName(),
-           RepositoryVersionState.INIT);
- 
-       if (!list.isEmpty()) {
-         if (list.size() > 1) {
-           throw new AmbariException(String.format("The cluster can only be initialized by one version: %s found",
-               list.size()));
-         } else {
-           cve = list.get(0);
-         }
-       }
-     }
++  @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES)
++  private <T> T updateBaseUrls(Cluster cluster, ServiceComponent component, BaseUrlUpdater<T> function) throws AmbariException {
 +
-     if (null == cve || null == cve.getRepositoryVersion()) {
-       LOG.info("Cluster {} has no specific Repository Versions.  Using stack-defined values", cluster.getClusterName());
-       return;
++    RepositoryVersionEntity repositoryEntity = null;
++
++    // !!! try to find the component repo first
++    if (null != component) {
++      repositoryEntity = component.getDesiredRepositoryVersion();
++    } else {
++      LOG.info("Service component not passed in, attempt to resolve the repository for cluster {}",
++          cluster.getClusterName());
 +    }
 +
-     RepositoryVersionEntity rve = cve.getRepositoryVersion();
++    if (null == repositoryEntity && null != component) {
++      Service service = cluster.getService(component.getServiceName());
 +
-     for (Iterator<RepositoryInfo> iter = repoInfos.iterator(); iter.hasNext(); ) {
++      repositoryEntity = service.getDesiredRepositoryVersion();
++    }
 +
-       RepositoryInfo repositoryInfo = iter.next();
++    if (null == repositoryEntity) {
++      LOG.info("Cluster {} has no specific Repository Versions.  Using stack-defined values", cluster.getClusterName());
++      return function.getDefault();
++    }
 +
-       String repoId = repositoryInfo.getRepoId();
-       String repoName = repositoryInfo.getRepoName();
-       String baseUrl = repositoryInfo.getBaseUrl();
-       String osType = repositoryInfo.getOsType();
++    return function.apply(repositoryEntity);
++  }
  
-       if (null == repoId || null == baseUrl || null == osType || null == repoName) {
-         continue;
-       }
+   /**
+    * Reads a Kerberos descriptor from the specified file path.
+    *
+    * @param fileLocation the path to the file
+    * @return a KerberosDescriptor or <code>null</code>, if no path is specified
+    * @throws AmbariException if an error occurs reading or parsing the Kerberos descriptor file
+    */
+   KerberosDescriptor readKerberosDescriptorFromFile(String fileLocation) throws AmbariException {
+     if (!StringUtils.isEmpty(fileLocation)) {
+       File file = new File(fileLocation);
  
-       boolean toResult = false;
-       for (OperatingSystemEntity ose : rve.getOperatingSystems()) {
-         if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) {
-           for (RepositoryEntity re : ose.getRepositories()) {
-             if (re.getName().equals(repoName) &&
-                 re.getRepositoryId().equals(repoId) &&
-                 !re.getBaseUrl().equals(baseUrl)) {
-               repositoryInfo.setBaseUrl(re.getBaseUrl());
-             }
-           }
-           toResult = true;
+       if (file.canRead()) {
+         try {
+           return kerberosDescriptorFactory.createInstance(file);
+         } catch (IOException e) {
+           throw new AmbariException(String.format("Failed to parse Kerberos descriptor file %s",
+               file.getAbsolutePath()), e);
          }
+       } else {
+         throw new AmbariException(String.format("Unable to read Kerberos descriptor file %s",
+             file.getAbsolutePath()));
        }
-       if (!toResult) {
-         iter.remove();
-       }
+     } else {
+       LOG.debug("Missing path to Kerberos descriptor, returning null");
      }
+ 
+     return null;
+   }
++
++  /**
++   * Class that is used to update base urls.  There are two implementations of this - when we no
++   * longer are sure the deprecated repo info can be removed, so too can this class.
++   */
++  @Experimental(feature= ExperimentalFeature.PATCH_UPGRADES)
++  abstract static class BaseUrlUpdater<T> implements Function<RepositoryVersionEntity, T> {
++    private T m_default;
++
++    private BaseUrlUpdater(T defaultValue) {
++      m_default = defaultValue;
++    }
++
++    private T getDefault() {
++      return m_default;
++    }
++
 +  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
index e17185f,c4d0820..4fd37dc
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
@@@ -328,10 -323,36 +323,24 @@@ public class CheckDescription 
      PrereqCheckType.SERVICE,
      "Change Ranger SSL configuration path for Keystore and Truststore.",
      new ImmutableMap.Builder<String, String>()
-             .put(AbstractCheckDescriptor.DEFAULT,
-               "As Ranger is SSL enabled, Ranger SSL configurations will need to be changed from default value of /etc/ranger/*/conf folder to /etc/ranger/security. " +
-               "Since the certificates/keystores/truststores in this path may affect the upgrade/downgrade process, it is recommended to manually move the certificates/keystores/truststores out of the conf folders and change the appropriate config values before proceeding.").build());
+       .put(AbstractCheckDescriptor.DEFAULT,
+         "As Ranger is SSL enabled, Ranger SSL configurations will need to be changed from default value of /etc/ranger/*/conf folder to /etc/ranger/security. " +
+         "Since the certificates/keystores/truststores in this path may affect the upgrade/downgrade process, it is recommended to manually move the certificates/keystores/truststores out of the conf folders and change the appropriate config values before proceeding.").build());
+ 
+   public static CheckDescription JAVA_VERSION = new CheckDescription("JAVA_VERSION",
+       PrereqCheckType.CLUSTER,
+       "Verify Java version requirement",
+       new ImmutableMap.Builder<String, String>()
+         .put(AbstractCheckDescriptor.DEFAULT, "Ambari requires JDK with minimum version %s. Reconfigure Ambari with a JDK that meets the version requirement.")
+           .build());
+ 
+   public static CheckDescription COMPONENTS_EXIST_IN_TARGET_REPO = new CheckDescription("COMPONENTS_EXIST_IN_TARGET_REPO",
+       PrereqCheckType.CLUSTER,
+       "Verify Cluster Components Exist In Target Repository",
+       new ImmutableMap.Builder<String, String>()
+         .put(AbstractCheckDescriptor.DEFAULT, "The following components do not exist in the target repository's stack. They must be removed from the cluster before upgrading.")
+           .build());
  
 -  public static CheckDescription DRUID_HA_WARNING = new CheckDescription(
 -      "DRUID_HA",
 -      PrereqCheckType.SERVICE,
 -      "Druid Downtime During Upgrade",
 -      new ImmutableMap.Builder<String, String>()
 -          .put(
 -              AbstractCheckDescriptor.DEFAULT,
 -              "High Availability is not enabled for Druid. Druid Service may have some downtime during upgrade. Deploy multiple instances of %s in the Cluster to avoid any downtime."
 -          )
 -          .build()
 -  );
 -
    private String m_name;
    private PrereqCheckType m_type;
    private String m_description;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
index b2a03e4,34888f2..054c470
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
@@@ -57,7 -58,11 +57,9 @@@ import org.apache.ambari.server.orm.ent
  import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
  import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
  import org.apache.ambari.server.orm.entities.MetainfoEntity;
- import org.apache.ambari.server.state.SecurityState;
+ import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
+ import org.apache.ambari.server.state.ClientConfigFileDefinition;
 -import org.apache.ambari.server.state.Cluster;
 -import org.apache.ambari.server.state.Clusters;
+ import org.apache.ambari.server.state.ComponentInfo;
  import org.apache.ambari.server.state.ServiceInfo;
  import org.apache.ambari.server.state.State;
  import org.apache.ambari.server.state.UpgradeState;
@@@ -313,10 -322,10 +314,10 @@@ public class DatabaseConsistencyCheckHe
            } else if (tableRowCount != -1 && tableRowCount < TABLE_ROW_COUNT_LIMIT) {
              LOG.info(String.format("The database table %s currently has %d rows and is within normal limits (%d)", tableName, tableRowCount, TABLE_ROW_COUNT_LIMIT));
            } else {
-             throw new SQLException();
+             warning("Unable to get size for table {}!", tableName);
            }
          } catch (SQLException ex) {
-           LOG.error(String.format("Failed to get %s row count: ", tableName), e);
 -          warning(String.format("Failed to get %s row count: ", tableName), e);
++          error(String.format("Failed to get %s row count: ", tableName), e);
          }
        } finally {
          if (rs != null) {
@@@ -375,7 -384,7 +376,7 @@@
        }
  
      } catch (SQLException e) {
-       LOG.error("Exception occurred during check for config selected more than ones procedure: ", e);
 -      warning("Exception occurred during check for config selected more than once procedure: ", e);
++      error("Exception occurred during check for config selected more than once procedure: ", e);
      } finally {
        if (rs != null) {
          try {
@@@ -424,7 -433,7 +425,7 @@@
        }
  
      } catch (SQLException e) {
-       LOG.error("Exception occurred during check for host without state procedure: ", e);
 -      warning("Exception occurred during check for host without state procedure: ", e);
++      error("Exception occurred during check for host without state procedure: ", e);
      } finally {
        if (rs != null) {
          try {
@@@ -489,15 -465,8 +457,8 @@@
          }
        }
  
-       if (topologyRequestCount != topologyRequestTablesJoinedCount) {
-         error("Your topology request hierarchy is not complete for each row in topology_request should exist " +
-           "at least one raw in topology_logical_request, topology_host_request, topology_host_task, " +
-           "topology_logical_task.");
-       }
- 
- 
      } catch (SQLException e) {
-       LOG.error("Exception occurred during topology request tables check: ", e);
 -      warning("Exception occurred during topology request tables check: ", e);
++      error("Exception occurred during topology request tables check: ", e);
      } finally {
        if (rs != null) {
          try {
@@@ -587,7 -547,7 +539,7 @@@
        }
  
      } catch (SQLException e) {
-       LOG.error("Exception occurred during check for same count of host component states and host component desired states: ", e);
 -      warning("Exception occurred during check for same count of host component states and host component desired states: ", e);
++      error("Exception occurred during check for same count of host component states and host component desired states: ", e);
      } finally {
        if (rs != null) {
          try {
@@@ -819,7 -786,7 +778,7 @@@
          }
        }
      } catch (SQLException e) {
-       LOG.error("Exception occurred during checking MySQL engine to be innodb: ", e);
 -      warning("Exception occurred during checking MySQL engine to be innodb: ", e);
++      error("Exception occurred during checking MySQL engine to be innodb: ", e);
      } finally {
        if (rs != null) {
          try {
@@@ -1053,13 -1122,11 +1024,11 @@@
        for (String clusterName : clusterServiceConfigType.keySet()) {
          Multimap<String, String> serviceConfig = clusterServiceConfigType.get(clusterName);
          for (String serviceName : serviceConfig.keySet()) {
 -          warning("You have non selected configs: {} for service {} from cluster {}!", StringUtils.join(serviceConfig.get(serviceName), ","), serviceName, clusterName);
 +          error("You have non selected configs: {} for service {} from cluster {}!", StringUtils.join(serviceConfig.get(serviceName), ","), serviceName, clusterName);
          }
        }
-     } catch (SQLException e) {
-       LOG.error("Exception occurred during complex service check procedure: ", e);
-     } catch (AmbariException e) {
-       LOG.error("Exception occurred during complex service check procedure: ", e);
+     } catch (SQLException | AmbariException e) {
 -      warning("Exception occurred during complex service check procedure: ", e);
++      error("Exception occurred during complex service check procedure: ", e);
      } finally {
        if (rs != null) {
          try {

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java
index 4ccdc0a,a4c2430..ad68a2c
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java
@@@ -73,15 -63,6 +73,17 @@@ public class ServiceCheckValidityCheck 
    private static final Logger LOG = LoggerFactory.getLogger(ServiceCheckValidityCheck.class);
  
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss");
 +  private static List<SortRequestProperty> sortRequestProperties =
 +      Collections.singletonList(new SortRequestProperty(TaskResourceProvider.TASK_START_TIME_PROPERTY_ID, SortRequest.Order.DESC));
 +  private static SortRequest sortRequest = new SortRequestImpl(sortRequestProperties);
 +  private static final PageRequestImpl PAGE_REQUEST = new PageRequestImpl(PageRequest.StartingPoint.End, 1000, 0, null, null);
 +  private static final RequestImpl REQUEST = new RequestImpl(null, null, null, null, sortRequest, PAGE_REQUEST);
-   private static final Predicate PREDICATE = new PredicateBuilder().property(TaskResourceProvider.TASK_COMMAND_PROPERTY_ID)
-       .equals(RoleCommand.SERVICE_CHECK.name()).toPredicate();
++  private static final Predicate PREDICATE = new PredicateBuilder()
++    .property(TaskResourceProvider.TASK_COMMAND_PROPERTY_ID).equals(RoleCommand.SERVICE_CHECK.name())
++    .and().property(TaskResourceProvider.TASK_START_TIME_PROPERTY_ID).greaterThan(-1)
++    .toPredicate();
 +
 +
  
    @Inject
    Provider<ServiceConfigDAO> serviceConfigDAOProvider;
@@@ -89,6 -70,9 +91,7 @@@
    @Inject
    Provider<HostRoleCommandDAO> hostRoleCommandDAOProvider;
  
 -  @Inject
 -  Provider<ActionMetadata> actionMetadataProvider;
+ 
    /**
     * Constructor.
     */
@@@ -127,43 -111,34 +130,43 @@@
        }
      }
  
 -    // get the latest service checks, grouped by role
 -    List<LastServiceCheckDTO> lastServiceChecks = hostRoleCommandDAO.getLatestServiceChecksByRole(clusterId);
 -    Map<String, Long> lastServiceChecksByRole = new HashMap<>();
 -    for( LastServiceCheckDTO lastServiceCheck : lastServiceChecks ) {
 -      lastServiceChecksByRole.put(lastServiceCheck.role, lastServiceCheck.endTime);
 -    }
 +    List<HostRoleCommandEntity> commands = hostRoleCommandDAO.findAll(REQUEST, PREDICATE);
  
 -    LinkedHashSet<String> failedServiceNames = new LinkedHashSet<>();
 +    // !!! build a map of Role to latest-config-check in case it was rerun multiple times, we want the latest
 +    Map<Role, HostRoleCommandEntity> latestTimestamps = new HashMap<>();
 +    for (HostRoleCommandEntity command : commands) {
 +      Role role = command.getRole();
  
 -    // for every service, see if there was a service check executed and then
 -    for( Entry<String, Long> entry : lastServiceConfigUpdates.entrySet() ) {
 -      String serviceName = entry.getKey();
 -      long configCreationTime = entry.getValue();
 -      String role = actionMetadataProvider.get().getServiceCheckAction(serviceName);
 +      // Because results are already sorted by start_time desc, first occurrence is guaranteed to have max(start_time).
 +      if (!latestTimestamps.containsKey(role)) {
 +        latestTimestamps.put(role, command);
 +      }
 +    }
  
 -      if(!lastServiceChecksByRole.containsKey(role) ) {
 -        LOG.info("There was no service check found for service {} matching role {}", serviceName, role);
 -        failedServiceNames.add(serviceName);
 -        continue;
 +    LinkedHashSet<String> failedServiceNames = new LinkedHashSet<>();
 +    for (Map.Entry<String, Long> serviceEntry : lastServiceConfigUpdates.entrySet()) {
 +      String serviceName = serviceEntry.getKey();
 +      Long configTimestamp = serviceEntry.getValue();
 +
 +      boolean serviceCheckWasExecuted = false;
 +      for (HostRoleCommandEntity command : latestTimestamps.values()) {
-         if (command.getCommandDetail().contains(serviceName)) {
++        if (null !=  command.getCommandDetail() && command.getCommandDetail().contains(serviceName)) {
 +          serviceCheckWasExecuted = true;
 +          Long serviceCheckTimestamp = command.getStartTime();
 +
 +          if (serviceCheckTimestamp < configTimestamp) {
 +            failedServiceNames.add(serviceName);
 +            LOG.info("Service {} latest config change is {}, latest service check executed at {}",
 +                serviceName,
 +                DATE_FORMAT.format(new Date(configTimestamp)),
 +                DATE_FORMAT.format(new Date(serviceCheckTimestamp)));
 +          }
 +        }
        }
  
 -      long lastServiceCheckTime = lastServiceChecksByRole.get(role);
 -      if (lastServiceCheckTime < configCreationTime) {
 +      if (!serviceCheckWasExecuted) {
          failedServiceNames.add(serviceName);
 -        LOG.info(
 -            "The {} service (role {}) had its configurations updated on {}, but the last service check was {}",
 -            serviceName, role, DATE_FORMAT.format(new Date(configCreationTime)),
 -            DATE_FORMAT.format(new Date(lastServiceCheckTime)));
 +        LOG.info("Service {} service check has never been executed", serviceName);
        }
      }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index 02e52ea,d0dd7e0..d3e1488
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@@ -71,9 -71,10 +68,8 @@@ import org.apache.ambari.server.control
  import org.apache.ambari.server.controller.internal.RequestResourceFilter;
  import org.apache.ambari.server.controller.spi.Resource;
  import org.apache.ambari.server.metadata.ActionMetadata;
- import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
  import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
- import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 -import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 -import org.apache.ambari.server.orm.entities.RepositoryEntity;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
  import org.apache.ambari.server.state.Cluster;
  import org.apache.ambari.server.state.Clusters;
  import org.apache.ambari.server.state.CommandScriptDefinition;
@@@ -85,8 -87,9 +82,8 @@@ import org.apache.ambari.server.state.H
  import org.apache.ambari.server.state.HostComponentAdminState;
  import org.apache.ambari.server.state.HostState;
  import org.apache.ambari.server.state.MaintenanceState;
+ import org.apache.ambari.server.state.PropertyInfo;
  import org.apache.ambari.server.state.PropertyInfo.PropertyType;
- import org.apache.ambari.server.state.RepositoryVersionState;
 -import org.apache.ambari.server.state.RepositoryInfo;
  import org.apache.ambari.server.state.Service;
  import org.apache.ambari.server.state.ServiceComponent;
  import org.apache.ambari.server.state.ServiceComponentHost;
@@@ -391,8 -409,10 +399,8 @@@ public class AmbariCustomCommandExecuti
  
        Map<String, String> hostLevelParams = new TreeMap<>();
  
 -      hostLevelParams.put(CUSTOM_COMMAND, commandName);
 -
        // Set parameters required for re-installing clients on restart
-       hostLevelParams.put(REPO_INFO, ambariMetaInfo.getRepoInfoString(cluster, host));
 -      hostLevelParams.put(REPO_INFO, getRepoInfo(cluster, component, host));
++      hostLevelParams.put(REPO_INFO, ambariMetaInfo.getRepoInfoString(cluster, component, host));
        hostLevelParams.put(STACK_NAME, stackId.getStackName());
        hostLevelParams.put(STACK_VERSION, stackId.getStackVersion());
  
@@@ -424,10 -445,9 +433,10 @@@
            commandParams.put(key, additionalCommandParams.get(key));
          }
        }
 +      commandParams.put(CUSTOM_COMMAND, commandName);
  
        boolean isInstallCommand = commandName.equals(RoleCommand.INSTALL.toString());
-       String commandTimeout = configs.getDefaultAgentTaskTimeout(isInstallCommand);
+       int commandTimeout = Short.valueOf(configs.getDefaultAgentTaskTimeout(isInstallCommand)).intValue();
  
        ComponentInfo componentInfo = ambariMetaInfo.getComponent(
            stackId.getStackName(), stackId.getStackVersion(),
@@@ -471,6 -510,8 +499,8 @@@
        execCmd.setCommandParams(commandParams);
        execCmd.setRoleParams(roleParams);
  
 -      execCmd.setRepositoryFile(getCommandRepository(cluster, component, host));
++      execCmd.setRepositoryFile(ambariMetaInfo.getCommandRepository(cluster, component, host));
+ 
        // perform any server side command related logic - eg - set desired states on restart
        applyCustomCommandBackendLogic(cluster, serviceName, componentName, commandName, hostName);
      }
@@@ -1248,10 -1520,23 +1308,19 @@@
     */
    public boolean isTopologyRefreshRequired(String actionName, String clusterName, String serviceName)
        throws AmbariException {
+ 
      if (actionName.equals(START_COMMAND_NAME) || actionName.equals(RESTART_COMMAND_NAME)) {
        Cluster cluster = clusters.getCluster(clusterName);
-       StackId stackId = cluster.getDesiredStackVersion();
+       StackId stackId = null;
 -      if (serviceName != null) {
 -        try {
 -          Service service = cluster.getService(serviceName);
 -          stackId = service.getDesiredStackId();
 -        } catch (AmbariException e) {
 -          LOG.debug("Could not load service {}, skipping topology check", serviceName);
 -        }
 -      }
 -
 -      if (stackId == null) {
++      try {
++        Service service = cluster.getService(serviceName);
++        stackId = service.getDesiredStackId();
++      } catch (AmbariException e) {
++        LOG.debug("Could not load service {}, skipping topology check", serviceName);
+         stackId = cluster.getDesiredStackVersion();
+       }
+ 
 +
        AmbariMetaInfo ambariMetaInfo = managementController.getAmbariMetaInfo();
  
        StackInfo stack = ambariMetaInfo.getStack(stackId.getStackName(), stackId.getStackVersion());

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariHandlerList.java
----------------------------------------------------------------------


[45/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PreconfigureKerberosAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PreconfigureKerberosAction.java
index 0000000,30bc47f..697f1d1
mode 000000,100644..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PreconfigureKerberosAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PreconfigureKerberosAction.java
@@@ -1,0 -1,573 +1,573 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ 
+ package org.apache.ambari.server.serveraction.upgrades;
+ 
+ import static org.apache.ambari.server.controller.KerberosHelper.DEFAULT_REALM;
+ import static org.apache.ambari.server.controller.KerberosHelper.KERBEROS_ENV;
+ import static org.apache.ambari.server.controller.KerberosHelper.PRECONFIGURE_SERVICES;
+ 
+ import java.io.IOException;
+ import java.util.Collection;
+ import java.util.Collections;
+ import java.util.HashMap;
+ import java.util.HashSet;
+ import java.util.Iterator;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+ import java.util.concurrent.ConcurrentMap;
+ 
+ import org.apache.ambari.server.AmbariException;
+ import org.apache.ambari.server.actionmanager.HostRoleStatus;
+ import org.apache.ambari.server.agent.CommandReport;
+ import org.apache.ambari.server.controller.AmbariManagementController;
+ import org.apache.ambari.server.controller.KerberosHelper;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+ import org.apache.ambari.server.serveraction.kerberos.PreconfigureServiceType;
+ import org.apache.ambari.server.state.Cluster;
+ import org.apache.ambari.server.state.ConfigHelper;
+ import org.apache.ambari.server.state.Host;
+ import org.apache.ambari.server.state.SecurityType;
+ import org.apache.ambari.server.state.Service;
+ import org.apache.ambari.server.state.ServiceComponentHost;
+ import org.apache.ambari.server.state.StackId;
+ import org.apache.ambari.server.state.UpgradeContext;
+ import org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptorContainer;
+ import org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor;
+ import org.apache.ambari.server.state.kerberos.KerberosConfigurationDescriptor;
+ import org.apache.ambari.server.state.kerberos.KerberosDescriptor;
+ import org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor;
+ import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor;
+ import org.apache.ambari.server.state.kerberos.VariableReplacementHelper;
+ import org.apache.ambari.server.state.stack.upgrade.Direction;
+ import org.apache.commons.collections.CollectionUtils;
+ import org.apache.commons.collections.MapUtils;
+ import org.apache.commons.lang.StringUtils;
+ 
+ import com.google.inject.Inject;
+ 
+ /**
+  * PreconfigureKerberos updates existing service configurations with properties from service-level
+  * Kerberos descriptors, flagged for pre-configuring, during stack upgrades in order to prevent service
+  * restarts when the flagged services are installed.
+  */
+ public class PreconfigureKerberosAction extends AbstractUpgradeServerAction {
+   static final String UPGRADE_DIRECTION_KEY = "upgrade_direction";
+ 
+   @Inject
+   private AmbariManagementController ambariManagementController;
+ 
+   @Inject
+   private KerberosHelper kerberosHelper;
+ 
+   @Inject
+   private ConfigHelper configHelper;
+ 
+   @Inject
+   private VariableReplacementHelper variableReplacementHelper;
+ 
+   @Override
+   public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext) throws AmbariException, InterruptedException {
+     Map<String, String> commandParameters = getCommandParameters();
+     if (null == commandParameters || commandParameters.isEmpty()) {
+       return createCommandReport(0, HostRoleStatus.FAILED, "{}", "",
+           "Unable to change configuration values without command parameters");
+     }
+ 
+     if (!isDowngrade()) {
+       String clusterName = commandParameters.get("clusterName");
+       Cluster cluster = m_clusters.getCluster(clusterName);
+ 
+       if (cluster.getSecurityType() == SecurityType.KERBEROS) {
+         StackId stackId;
+ 
+         try {
+           stackId = getTargetStackId(cluster);
+         } catch (AmbariException e) {
+           return createCommandReport(0, HostRoleStatus.FAILED, "{}", "", e.getLocalizedMessage());
+         }
+ 
+         if (stackId == null) {
+           return createCommandReport(0, HostRoleStatus.FAILED, "{}", "",
+               "The target stack Id was not specified.");
+         }
+ 
+         KerberosDescriptor kerberosDescriptor = kerberosHelper.getKerberosDescriptor(KerberosHelper.KerberosDescriptorType.COMPOSITE, cluster, stackId, true);
+ 
+         // Calculate the current host-specific configurations. These will be used to replace
+         // variables within the Kerberos descriptor data
+         Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, true, false);
+ 
+         PreconfigureServiceType preconfigureServiceType = getPreconfigureServiceType(configurations);
+ 
+         if (preconfigureServiceType != PreconfigureServiceType.NONE) {
+           Map<String, Map<String, String>> kerberosConfigurations = new HashMap<>();
+           Map<String, Set<String>> propertiesToRemove = new HashMap<>();
+           Map<String, Set<String>> propertiesToIgnore = new HashMap<>();
+ 
+           if (preconfigureServiceType == PreconfigureServiceType.ALL) {
+             // Force all services to be flagged for pre-configuration...
+             Map<String, KerberosServiceDescriptor> serviceDescriptors = kerberosDescriptor.getServices();
+             if (serviceDescriptors != null) {
+               for (KerberosServiceDescriptor serviceDescriptor : serviceDescriptors.values()) {
+                 serviceDescriptor.setPreconfigure(true);
+               }
+             }
+           }
+ 
+           processServiceComponentHosts(cluster, kerberosDescriptor, configurations, kerberosConfigurations, propertiesToIgnore);
+ 
+           // Calculate the set of configurations to update and replace any variables
+           // using the previously calculated Map of configurations for the host.
+           kerberosConfigurations = kerberosHelper.processPreconfiguredServiceConfigurations(kerberosConfigurations, configurations, cluster, kerberosDescriptor);
+ 
+           Map<String, Set<String>> installedServices = calculateInstalledServices(cluster);
+ 
+           kerberosHelper.applyStackAdvisorUpdates(cluster, installedServices.keySet(), configurations, kerberosConfigurations,
+               propertiesToIgnore, propertiesToRemove, true);
+ 
+           kerberosHelper.setAuthToLocalRules(cluster, kerberosDescriptor, getDefaultRealm(configurations), installedServices,
+               configurations, kerberosConfigurations, true);
+ 
+           processConfigurationChanges(cluster, stackId, kerberosDescriptor, kerberosConfigurations, propertiesToRemove, configurations);
+         } else {
+           actionLog.writeStdOut("Skipping: This facility is only available when kerberos-env/preconfigure_services is not \"NONE\"");
+         }
+       } else {
+         actionLog.writeStdOut("Skipping: This facility is only available when Kerberos is enabled");
+       }
+     } else {
+       actionLog.writeStdOut("Skipping: This facility is only available during an upgrade");
+     }
+ 
+     return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", actionLog.getStdOut(), actionLog.getStdErr());
+   }
+ 
+   /**
+    * Given a Cluster object creates a map of service names to sets of the installed components for that
+    * service.
+    *
+    * @param cluster the cluster
+    * @return a map of (installed) service names to the relevant set of (installed) component names
+    */
+   private Map<String, Set<String>> calculateInstalledServices(Cluster cluster) {
+     Map<String, Set<String>> installedServices = new HashMap<>();
+     Map<String, Service> services = cluster.getServices();
+ 
+     for (Service service : services.values()) {
+       installedServices.put(service.getName(), service.getServiceComponents().keySet());
+     }
+ 
+     return installedServices;
+   }
+ 
+   /**
+    * Safely retrieves the specified property from the specified configuration type from a map of
+    * configurations.
+    *
+    * @param configurations the existing configurations for the cluster
+    * @return the requested value or null if the configuration does not exist
+    */
+   private String getValueFromConfiguration(Map<String, Map<String, String>> configurations, String configType, String propertyName) {
+     String value = null;
+ 
+     if (configurations != null) {
+       Map<String, String> kerberosEnv = configurations.get(configType);
+ 
+       if (kerberosEnv != null) {
+         value = kerberosEnv.get(propertyName);
+       }
+     }
+ 
+     return value;
+   }
+ 
+   /**
+    * Safely retrieves the <code>realm</code> property of the <code>kerberos-env</code> configuration.
+    *
+    * @param configurations the existing configurations for the cluster
+    * @return the requested value or null if the configuration does not exist
+    * @see #getValueFromConfiguration(Map, String, String)
+    */
+   private String getDefaultRealm(Map<String, Map<String, String>> configurations) {
+     return getValueFromConfiguration(configurations, KERBEROS_ENV, DEFAULT_REALM);
+   }
+ 
+   /**
+    * Safely retrieves the <code>preconfigure_services</code> property of the <code>kerberos-env</code> configuration.
+    *
+    * @param configurations the existing configurations for the cluster
+    * @return the requested value or null if the configuration does not exist
+    * @see #getValueFromConfiguration(Map, String, String)
+    */
+   private PreconfigureServiceType getPreconfigureServiceType(Map<String, Map<String, String>> configurations) {
+     String preconfigureServices = getValueFromConfiguration(configurations, KERBEROS_ENV, PRECONFIGURE_SERVICES);
+ 
+     PreconfigureServiceType preconfigureServiceType = null;
+     if (!StringUtils.isEmpty(preconfigureServices)) {
+       try {
+         preconfigureServiceType = PreconfigureServiceType.valueOf(preconfigureServices.toUpperCase());
+       } catch (Throwable t) {
+         preconfigureServiceType = PreconfigureServiceType.DEFAULT;
+       }
+     }
+ 
+     return (preconfigureServiceType == null) ? PreconfigureServiceType.DEFAULT : preconfigureServiceType;
+   }
+ 
+   /**
+    * Determines if upgrade direction is {@link Direction#UPGRADE} or {@link Direction#DOWNGRADE}.
+    *
+    * @return {@code true} if {@link Direction#DOWNGRADE}; {@code false} if {@link Direction#UPGRADE}
+    */
+   private boolean isDowngrade() {
+     return Direction.DOWNGRADE.name().equalsIgnoreCase(getCommandParameterValue(UPGRADE_DIRECTION_KEY));
+   }
+ 
+   /**
+    * Retrieves the target stack ID for the stack upgrade or downgrade operation.
+    *
+    * @param cluster the cluster
+    * @return the target {@link StackId}
+    * @throws AmbariException if multiple stack id's are detected
+    */
+   private StackId getTargetStackId(Cluster cluster) throws AmbariException {
+     UpgradeContext upgradeContext = getUpgradeContext(cluster);
+ 
+     // !!! FIXME in a per-service view, what does this become?
+     Set<StackId> stackIds = new HashSet<>();
+ 
+     for (Service service : cluster.getServices().values()) {
+       RepositoryVersionEntity targetRepoVersion = upgradeContext.getTargetRepositoryVersion(service.getName());
+       StackId targetStackId = targetRepoVersion.getStackId();
+       stackIds.add(targetStackId);
+     }
+ 
+     if (1 != stackIds.size()) {
+       throw new AmbariException("Services are deployed from multiple stacks and cannot determine a unique one.");
+     }
+ 
+     return stackIds.iterator().next();
+   }
+ 
+   /**
+    * Find and iterate through the {@link ServiceComponentHost} objects for the current {@link Cluster}
+    * to calculate property updates and auth-to-local rules.
+    *
+    * @param cluster                the cluster
+    * @param kerberosDescriptor     the Kerberos descriptor
+    * @param currentConfigurations  the current configurations for the cluster
+    * @param kerberosConfigurations the (Kerberos-specific) configuration updates
+    * @param propertiesToBeIgnored  a map to store properties that should be ignored by operations that update property values
+    * @throws AmbariException if an issue occurs
+    */
+   private void processServiceComponentHosts(Cluster cluster, KerberosDescriptor kerberosDescriptor,
+                                             Map<String, Map<String, String>> currentConfigurations,
+                                             Map<String, Map<String, String>> kerberosConfigurations,
+                                             Map<String, Set<String>> propertiesToBeIgnored)
+       throws AmbariException {
+ 
+     Collection<Host> hosts = cluster.getHosts();
+     if (!hosts.isEmpty()) {
+       // Create the context to use for filtering Kerberos Identities based on the state of the cluster
+       Map<String, Object> filterContext = new HashMap<>();
+       filterContext.put("configurations", currentConfigurations);
+       filterContext.put("services", cluster.getServices().keySet());
+ 
+       try {
+         Map<String, Set<String>> propertiesToIgnore = null;
+ 
+         for (Host host : hosts) {
+           // Iterate over the components installed on the current host to get the service and
+           // component-level Kerberos descriptors in order to determine which principals,
+           // keytab files, and configurations need to be created or updated.
+           for (ServiceComponentHost sch : cluster.getServiceComponentHosts(host.getHostName())) {
+             String hostName = sch.getHostName();
+ 
+             String serviceName = sch.getServiceName();
+             String componentName = sch.getServiceComponentName();
+ 
+             KerberosServiceDescriptor serviceDescriptor = kerberosDescriptor.getService(serviceName);
+ 
+             if (serviceDescriptor != null) {
+               List<KerberosIdentityDescriptor> serviceIdentities = serviceDescriptor.getIdentities(true, filterContext);
+ 
+               // Add service-level principals (and keytabs)
+               kerberosHelper.addIdentities(null, serviceIdentities,
 -                  null, hostName, serviceName, componentName, kerberosConfigurations, currentConfigurations, false);
++                  null, hostName, serviceName, componentName, kerberosConfigurations, currentConfigurations);
+               propertiesToIgnore = gatherPropertiesToIgnore(serviceIdentities, propertiesToIgnore);
+ 
+               KerberosComponentDescriptor componentDescriptor = serviceDescriptor.getComponent(componentName);
+ 
+               if (componentDescriptor != null) {
+                 List<KerberosIdentityDescriptor> componentIdentities = componentDescriptor.getIdentities(true, filterContext);
+ 
+                 // Calculate the set of configurations to update and replace any variables
+                 // using the previously calculated Map of configurations for the host.
+                 kerberosHelper.mergeConfigurations(kerberosConfigurations,
+                     componentDescriptor.getConfigurations(true), currentConfigurations, null);
+ 
+                 // Add component-level principals (and keytabs)
+                 kerberosHelper.addIdentities(null, componentIdentities,
 -                    null, hostName, serviceName, componentName, kerberosConfigurations, currentConfigurations, false);
++                    null, hostName, serviceName, componentName, kerberosConfigurations, currentConfigurations);
+                 propertiesToIgnore = gatherPropertiesToIgnore(componentIdentities, propertiesToIgnore);
+               }
+             }
+           }
+         }
+ 
+         // Add ambari-server identities only if 'kerberos-env.create_ambari_principal = true'
+         if (kerberosHelper.createAmbariIdentities(currentConfigurations.get(KERBEROS_ENV))) {
+           List<KerberosIdentityDescriptor> ambariIdentities = kerberosHelper.getAmbariServerIdentities(kerberosDescriptor);
+ 
+           for (KerberosIdentityDescriptor identity : ambariIdentities) {
+             // If the identity represents the ambari-server user, use the component name "AMBARI_SERVER_SELF"
+             // so it can be distinguished between other identities related to the AMBARI-SERVER
+             // component.
+             String componentName = KerberosHelper.AMBARI_SERVER_KERBEROS_IDENTITY_NAME.equals(identity.getName())
+                 ? "AMBARI_SERVER_SELF"
+                 : "AMBARI_SERVER";
+ 
+             List<KerberosIdentityDescriptor> componentIdentities = Collections.singletonList(identity);
+             kerberosHelper.addIdentities(null, componentIdentities,
 -                null, KerberosHelper.AMBARI_SERVER_HOST_NAME, "AMBARI", componentName, kerberosConfigurations, currentConfigurations, false);
++                null, KerberosHelper.AMBARI_SERVER_HOST_NAME, "AMBARI", componentName, kerberosConfigurations, currentConfigurations);
+             propertiesToIgnore = gatherPropertiesToIgnore(componentIdentities, propertiesToIgnore);
+           }
+         }
+ 
+         if ((propertiesToBeIgnored != null) && (propertiesToIgnore != null)) {
+           propertiesToBeIgnored.putAll(propertiesToIgnore);
+         }
+       } catch (IOException e) {
+         throw new AmbariException(e.getMessage(), e);
+       }
+     }
+   }
+ 
+   private Map<String, Set<String>> gatherPropertiesToIgnore(List<KerberosIdentityDescriptor> identities,
+                                                             Map<String, Set<String>> propertiesToIgnore) {
+     Map<String, Map<String, String>> identityConfigurations = kerberosHelper.getIdentityConfigurations(identities);
+     if (!MapUtils.isEmpty(identityConfigurations)) {
+       if (propertiesToIgnore == null) {
+         propertiesToIgnore = new HashMap<>();
+       }
+ 
+       for (Map.Entry<String, Map<String, String>> entry : identityConfigurations.entrySet()) {
+         String configType = entry.getKey();
+         Map<String, String> properties = entry.getValue();
+ 
+         if (MapUtils.isEmpty(properties)) {
+           Set<String> propertyNames = propertiesToIgnore.get(configType);
+           if (propertyNames == null) {
+             propertyNames = new HashSet<>();
+             propertiesToIgnore.put(configType, propertyNames);
+           }
+           propertyNames.addAll(properties.keySet());
+         }
+       }
+     }
+ 
+     return propertiesToIgnore;
+   }
+ 
+   /**
+    * Processes configuration changes to determine if any work needs to be done.
+    * <p/>
+    * If work is to be done, a data file containing the details is created so it they changes may be
+    * processed in the appropriate stage.
+    *
+    * @param cluster                the cluster
+    * @param targetStackId          the target stack id
+    * @param kerberosConfigurations the Kerberos-specific configuration map
+    * @param propertiesToBeRemoved  a map of properties to be removed from the current configuration,
+    *                               grouped by configuration type.
+    * @param variableReplaments     replacement values to use when attempting to perform variable replacements on the property names
+    * @throws AmbariException if an issue is encountered
+    */
+   private void processConfigurationChanges(Cluster cluster, StackId targetStackId,
+                                            KerberosDescriptor kerberosDescriptor,
+                                            Map<String, Map<String, String>> kerberosConfigurations,
+                                            Map<String, Set<String>> propertiesToBeRemoved,
+                                            Map<String, Map<String, String>> variableReplaments)
+       throws AmbariException {
+     actionLog.writeStdOut("Determining configuration changes");
+ 
+     if (!kerberosConfigurations.isEmpty()) {
+       Map<String, Service> installedServices = cluster.getServices();
+ 
+       // Build a map of configuration types to properties that indicate which properties should be altered
+       // This map should contain only properties defined in service-level Kerberos descriptors that
+       // have been flagged to be preconfigured and that have not yet been installed.
+       Map<String, Set<String>> propertyFilter = new HashMap<>();
+       Map<String, KerberosServiceDescriptor> serviceDescriptors = kerberosDescriptor.getServices();
+       if (serviceDescriptors != null) {
+         for (KerberosServiceDescriptor serviceDescriptor : serviceDescriptors.values()) {
+           if (!installedServices.containsKey(serviceDescriptor.getName()) && serviceDescriptor.shouldPreconfigure()) {
+             buildFilter(Collections.singleton(serviceDescriptor), propertyFilter, variableReplaments);
+           }
+         }
+       }
+ 
+       // Add the auth-to-local rule configuration specifications to the filter
+       Map<String, Set<String>> authToLocalProperties = kerberosHelper.translateConfigurationSpecifications(kerberosDescriptor.getAllAuthToLocalProperties());
+       if (!MapUtils.isEmpty(authToLocalProperties)) {
+         for (Map.Entry<String, Set<String>> entry : authToLocalProperties.entrySet()) {
+           Set<String> properties = entry.getValue();
+ 
+           if (!CollectionUtils.isEmpty(properties)) {
+             String configurationType = entry.getKey();
+ 
+             Set<String> propertyNames = propertyFilter.get(configurationType);
+             if (propertyNames == null) {
+               propertyNames = new HashSet<>();
+               propertyFilter.put(configurationType, propertyNames);
+             }
+ 
+             propertyNames.addAll(properties);
+           }
+         }
+       }
+ 
+       Set<String> visitedTypes = new HashSet<>();
+ 
+       for (Map.Entry<String, Map<String, String>> entry : kerberosConfigurations.entrySet()) {
+         String configType = entry.getKey();
+ 
+         String service = cluster.getServiceByConfigType(configType);
+         Set<String> allowedProperties = propertyFilter.get(configType);
+ 
+         // Update properties for services that are installed and not filtered out
+         if (installedServices.containsKey(service) && !CollectionUtils.isEmpty(allowedProperties)) {
+           Map<String, String> propertiesToUpdate = entry.getValue();
+           Set<String> propertiesToRemove = (propertiesToBeRemoved == null) ? null : propertiesToBeRemoved.get(configType);
+ 
+           // Filter the properties to update
+           if (propertiesToUpdate != null) {
+             Iterator<Map.Entry<String, String>> mapIterator = propertiesToUpdate.entrySet().iterator();
+             while (mapIterator.hasNext()) {
+               Map.Entry<String, String> mapEntry = mapIterator.next();
+ 
+               if (!allowedProperties.contains(mapEntry.getKey())) {
+                 mapIterator.remove();
+               }
+             }
+           }
+ 
+           // Filter the properties to remove
+           if (propertiesToRemove != null) {
+             Iterator<String> setIterator = propertiesToRemove.iterator();
+             while (setIterator.hasNext()) {
+               String setEntry = setIterator.next();
+               if (!allowedProperties.contains(setEntry)) {
+                 setIterator.remove();
+               }
+             }
+           }
+ 
+           visitedTypes.add(configType);
+ 
+           if (!MapUtils.isEmpty(propertiesToUpdate) || !CollectionUtils.isEmpty(propertiesToRemove)) {
+             if (!MapUtils.isEmpty(propertiesToUpdate)) {
+               for (Map.Entry<String, String> property : propertiesToUpdate.entrySet()) {
+                 actionLog.writeStdOut(String.format("Setting: %s/%s = %s", configType, property.getKey(), property.getValue()));
+               }
+             }
+ 
+             if (!CollectionUtils.isEmpty(propertiesToRemove)) {
+               for (String property : propertiesToRemove) {
+                 actionLog.writeStdOut(String.format("Removing: %s/%s", configType, property));
+               }
+             }
+ 
+             configHelper.updateConfigType(cluster, targetStackId,
+                 ambariManagementController, configType, propertiesToUpdate, propertiesToRemove,
+                 ambariManagementController.getAuthName(), "Preconfiguring for Kerberos during upgrade");
+           }
+         }
+       }
+ 
+       if (!MapUtils.isEmpty(propertiesToBeRemoved)) {
+         for (Map.Entry<String, Set<String>> entry : propertiesToBeRemoved.entrySet()) {
+           String configType = entry.getKey();
+ 
+           if (!visitedTypes.contains(configType)) {
+             Set<String> propertiesToRemove = entry.getValue();
+ 
+             if (!CollectionUtils.isEmpty(propertiesToRemove)) {
+               for (String property : propertiesToRemove) {
+                 actionLog.writeStdOut(String.format("Removing: %s/%s", configType, property));
+               }
+ 
+               configHelper.updateConfigType(cluster, targetStackId,
+                   ambariManagementController, configType, null, entry.getValue(),
+                   ambariManagementController.getAuthName(), "Preconfiguring for Kerberos during upgrade");
+             }
+           }
+         }
+       }
+     }
+   }
+ 
+   /**
+    * Adds entries to the property filter (<code>propertyFilter</code>) found in the {@link KerberosConfigurationDescriptor}s
+    * within the specified node of the Kerberos descriptor.
+    *
+    * @param containers     the Kerberos descriptor containers to process
+    * @param propertyFilter the property filter map to update
+    * @param replacements   replacement values to use when attempting to perform variable replacements on the property names
+    * @throws AmbariException if an issue occurs while replacing variables in the property names
+    */
+   private void buildFilter(Collection<? extends AbstractKerberosDescriptorContainer> containers,
+                            Map<String, Set<String>> propertyFilter,
+                            Map<String, Map<String, String>> replacements)
+       throws AmbariException {
+     if (containers != null) {
+       for (AbstractKerberosDescriptorContainer container : containers) {
+         Map<String, KerberosConfigurationDescriptor> configurationDescriptors = container.getConfigurations(false);
+ 
+         if (!MapUtils.isEmpty(configurationDescriptors)) {
+           for (KerberosConfigurationDescriptor configurationDescriptor : configurationDescriptors.values()) {
+             Map<String, String> properties = configurationDescriptor.getProperties();
+ 
+             if (!MapUtils.isEmpty(properties)) {
+               String configType = configurationDescriptor.getType();
+ 
+               Set<String> propertyNames = propertyFilter.get(configType);
+               if (propertyNames == null) {
+                 propertyNames = new HashSet<>();
+                 propertyFilter.put(configType, propertyNames);
+               }
+ 
+               // Replace variables in the property name. For example ${knox-env/knox_user}.
+               for (String propertyName : properties.keySet()) {
+                 propertyNames.add(variableReplacementHelper.replaceVariables(propertyName, replacements));
+               }
+             }
+           }
+         }
+ 
+         Collection<? extends AbstractKerberosDescriptorContainer> childContainers = container.getChildContainers();
+         if (childContainers != null) {
+           buildFilter(childContainers, propertyFilter, replacements);
+         }
+       }
+     }
+   }
+ }
+ 

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/stack/RepoUtil.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
index f68570b,2992027..db9d178
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackContext.java
@@@ -25,13 -29,17 +25,11 @@@ import java.util.concurrent.ExecutorSer
  import java.util.concurrent.Executors;
  import java.util.concurrent.Future;
  import java.util.concurrent.ThreadFactory;
 -import java.util.concurrent.TimeUnit;
  
- import org.apache.ambari.server.api.services.AmbariMetaInfo;
  import org.apache.ambari.server.metadata.ActionMetadata;
  import org.apache.ambari.server.orm.dao.MetainfoDAO;
- import org.apache.ambari.server.orm.entities.MetainfoEntity;
 +import org.apache.ambari.server.state.stack.LatestRepoCallable;
  import org.apache.ambari.server.state.stack.OsFamily;
 -import org.apache.ambari.server.state.stack.RepoUrlInfoCallable;
 -import org.apache.ambari.server.state.stack.RepoUrlInfoCallable.RepoUrlInfoResult;
 -import org.apache.ambari.server.state.stack.RepoVdfCallable;
 -import org.apache.commons.collections.MapUtils;
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
  
  /**
   * Provides external functionality to the Stack framework.

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
index d3ad351,6dc2b93..3688727
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
@@@ -1236,6 -1276,9 +1232,9 @@@ public class StackModule extends BaseMo
          RepositoryXml serviceRepoXml = ssd.getRepoFile();
          if (null != serviceRepoXml) {
            repos.addAll(serviceRepoXml.getRepositories());
+           if (null != serviceRepoXml.getLatestURI()) {
 -            registerRepoUpdateTask(serviceRepoXml);
++            stackContext.registerRepoUpdateTask(serviceRepoXml.getLatestURI(), this);
+           }
          }
        }
      }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/stack/StackServiceDirectory.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
index 3e04a87,90dd611..23f4078
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
@@@ -26,12 -26,8 +26,9 @@@ import java.util.Set
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.controller.ClusterResponse;
  import org.apache.ambari.server.controller.ServiceConfigVersionResponse;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
  import org.apache.ambari.server.events.ClusterConfigChangedEvent;
  import org.apache.ambari.server.metadata.RoleCommandOrder;
- import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
- import org.apache.ambari.server.orm.entities.HostEntity;
- import org.apache.ambari.server.orm.entities.HostVersionEntity;
  import org.apache.ambari.server.orm.entities.PrivilegeEntity;
  import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
  import org.apache.ambari.server.orm.entities.UpgradeEntity;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/Clusters.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryInfo.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryInfo.java
index 31a00ca,8ab1fe9..d57b5d6
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryInfo.java
@@@ -29,9 -29,10 +29,8 @@@ public class RepositoryInfo 
    private String osType;
    private String repoId;
    private String repoName;
 -  private String distribution;
 -  private String components;
    private String mirrorsList;
    private String defaultBaseUrl;
-   private String latestBaseUrl;
    private boolean repoSaved = false;
    private boolean unique = false;
    private boolean ambariManagedRepositories = true;
@@@ -186,21 -191,23 +171,20 @@@
          Objects.equal(osType, that.osType) &&
          Objects.equal(repoId, that.repoId) &&
          Objects.equal(repoName, that.repoName) &&
 -        Objects.equal(distribution, that.distribution) &&
 -        Objects.equal(components, that.components) &&
          Objects.equal(mirrorsList, that.mirrorsList) &&
          Objects.equal(defaultBaseUrl, that.defaultBaseUrl) &&
-         Objects.equal(latestBaseUrl, that.latestBaseUrl) &&
          Objects.equal(ambariManagedRepositories, that.ambariManagedRepositories);
    }
  
    @Override
    public int hashCode() {
-     return Objects.hashCode(baseUrl, osType, repoId, repoName, mirrorsList, defaultBaseUrl, latestBaseUrl, repoSaved, unique, ambariManagedRepositories);
 -    return Objects.hashCode(baseUrl, osType, repoId, repoName, distribution, components, mirrorsList, defaultBaseUrl,
 -           ambariManagedRepositories);
++    return Objects.hashCode(baseUrl, osType, repoId, repoName, mirrorsList, defaultBaseUrl, repoSaved, unique, ambariManagedRepositories);
    }
  
    public RepositoryResponse convertToResponse()
    {
      return new RepositoryResponse(getBaseUrl(), getOsType(), getRepoId(),
-         getRepoName(), getMirrorsList(), getDefaultBaseUrl(), getLatestBaseUrl());
 -            getRepoName(), getDistribution(), getComponents(), getMirrorsList(), getDefaultBaseUrl());
++        getRepoName(), getMirrorsList(), getDefaultBaseUrl());
    }
  
    /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
index 91884f6,65189ca..b6203f9
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
@@@ -23,7 -22,7 +23,8 @@@ import java.util.Set
  
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.controller.ServiceResponse;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
  
  public interface Service {
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
index d755568,9fb2aba..ed19023
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
@@@ -23,7 -22,7 +23,8 @@@ import java.util.Set
  
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.controller.ServiceComponentResponse;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
  
  public interface ServiceComponent {
  
@@@ -102,5 -102,20 +108,20 @@@
    ServiceComponentHost addServiceComponentHost(
        String hostName) throws AmbariException;
  
 -  void delete() throws AmbariException;
 +  void delete(DeleteHostComponentStatusMetaData deleteMetaData);
+ 
+   /**
+    * This method computes the state of the repository that's associated with the desired
+    * version.  It is used, for example, when a host component reports its version and the
+    * state can be in flux.
+    *
+    * @param reportedVersion
+    * @throws AmbariException
+    */
+   void updateRepositoryState(String reportedVersion) throws AmbariException;
+ 
+   /**
+    * @return the repository state for the desired version
+    */
+   RepositoryVersionState getRepositoryState();
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
index 08f9f41,5ff9e37..575193f
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
@@@ -23,9 -23,8 +23,9 @@@ import java.util.Map
  
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.controller.ServiceComponentHostResponse;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
  import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
- import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+ import org.apache.ambari.server.orm.entities.HostVersionEntity;
  import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
  
  
@@@ -130,30 -107,9 +108,9 @@@ public interface ServiceComponentHost 
     *
     * @param version component version (e.g. 2.2.0.0-2041)
     */
 -  void setVersion(String version);
 +  void setVersion(String version) throws AmbariException;
  
    /**
-    * Gets the desired security state for this ServiceComponent
-    * <p/>
-    * The returned SecurityState is a valid endpoint state where
-    * SecurityState.isEndpoint() == true.
-    *
-    * @return the desired SecurityState for this ServiceComponent
-    */
-   SecurityState getDesiredSecurityState();
- 
-   /**
-    * Sets the desired security state for this ServiceComponent
-    * <p/>
-    * It is expected that the new SecurityState is a valid endpoint state such that
-    * SecurityState.isEndpoint() == true.
-    *
-    * @param securityState the desired SecurityState for this ServiceComponent
-    * @throws AmbariException if the new state is not an endpoint state
-    */
-   void setDesiredSecurityState(SecurityState securityState) throws AmbariException;
- 
-   /**
     * @param upgradeState the upgrade state
     */
    void setUpgradeState(UpgradeState upgradeState);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
index 32ecbf8,22c97ed..74b592b
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
@@@ -19,10 -19,9 +19,11 @@@
  package org.apache.ambari.server.state;
  
  import java.util.HashMap;
 +import java.util.HashSet;
+ import java.util.List;
  import java.util.Map;
  import java.util.Map.Entry;
 +import java.util.Set;
  import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ConcurrentMap;
  import java.util.concurrent.locks.ReadWriteLock;
@@@ -32,9 -31,10 +33,10 @@@ import org.apache.ambari.server.AmbariE
  import org.apache.ambari.server.ObjectNotFoundException;
  import org.apache.ambari.server.ServiceComponentHostNotFoundException;
  import org.apache.ambari.server.api.services.AmbariMetaInfo;
 -import org.apache.ambari.server.controller.MaintenanceStateHelper;
  import org.apache.ambari.server.controller.ServiceComponentResponse;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
  import org.apache.ambari.server.events.ServiceComponentRecoveryChangedEvent;
+ import org.apache.ambari.server.events.listeners.upgrade.StackVersionListener;
  import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
  import org.apache.ambari.server.orm.dao.ClusterServiceDAO;
  import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
@@@ -84,11 -92,15 +94,12 @@@ public class ServiceComponentImpl imple
     */
    private final long desiredStateEntityId;
  
-   /**
-    * Data access object used for lookup up stacks.
-    */
-   private final StackDAO stackDAO;
+   @Inject
+   private RepositoryVersionDAO repoVersionDAO;
+ 
+   @Inject
+   private HostComponentStateDAO hostComponentDAO;
  
 -  @Inject
 -  private MaintenanceStateHelper maintenanceStateHelper;
 -
    @AssistedInject
    public ServiceComponentImpl(@Assisted Service service, @Assisted String componentName,
        AmbariMetaInfo ambariMetaInfo,

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
index c22bfb2,1104d19..8ba41ae
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
@@@ -18,14 -18,13 +18,16 @@@
  
  package org.apache.ambari.server.state;
  
+ import java.util.ArrayList;
+ import java.util.Collection;
  import java.util.HashMap;
 +import java.util.HashSet;
  import java.util.List;
  import java.util.Map;
 +import java.util.Set;
  import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ConcurrentMap;
 +import java.util.concurrent.atomic.AtomicReference;
  import java.util.concurrent.locks.Lock;
  import java.util.concurrent.locks.ReentrantLock;
  
@@@ -588,25 -577,22 +595,30 @@@ public class ServiceImpl implements Ser
  
    @Override
    @Transactional
 -  public void delete() throws AmbariException {
 +  public void delete(DeleteHostComponentStatusMetaData deleteMetaData) {
+     List<Component> components = getComponents(); // XXX temporal coupling, need to call this BEFORE deletingAllComponents
 -    deleteAllComponents();
 -    deleteAllServiceConfigs();
 +    deleteAllComponents(deleteMetaData);
 +    if (deleteMetaData.getAmbariException() != null) {
 +      return;
 +    }
 +    try {
 +      deleteAllServiceConfigs();
  
 -    StackId stackId = getDesiredStackId();
 +      removeEntities();
 +    } catch (AmbariException e) {
 +      deleteMetaData.setAmbariException(e);
 +      return;
 +    }
  
 -    removeEntities();
++    StackId stackId = getDesiredStackId();
+ 
      // publish the service removed event
-     StackId stackId = cluster.getDesiredStackVersion();
+     if (null == stackId) {
+       return;
+     }
  
      ServiceRemovedEvent event = new ServiceRemovedEvent(getClusterId(), stackId.getStackName(),
-         stackId.getStackVersion(), getName());
+         stackId.getStackVersion(), getName(), components);
  
      eventPublisher.publish(event);
    }
@@@ -635,16 -626,9 +652,12 @@@
  
    @Override
    public MaintenanceState getMaintenanceState() {
 -    return getServiceDesiredStateEntity().getMaintenanceState();
 +    if (maintenanceState.get() == null) {
 +      maintenanceState.set(getServiceDesiredStateEntity().getMaintenanceState());
 +    }
 +    return maintenanceState.get();
    }
  
-   private ClusterServiceEntity getServiceEntity() {
-     return clusterServiceDAO.findByPK(serviceEntityPK);
-   }
- 
    private ClusterServiceEntityPK getServiceEntityPK(ClusterServiceEntity serviceEntity) {
      ClusterServiceEntityPK pk = new ClusterServiceEntityPK();
      pk.setClusterId(serviceEntity.getClusterId());

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceOsSpecific.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
index 353dd86,a3886ab..6184b94
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
@@@ -33,6 -33,6 +33,7 @@@ import org.apache.ambari.server.control
  import org.apache.ambari.server.stack.Validable;
  import org.apache.ambari.server.state.repository.VersionDefinitionXml;
  import org.apache.ambari.server.state.stack.ConfigUpgradePack;
++import org.apache.ambari.server.state.stack.LatestRepoCallable;
  import org.apache.ambari.server.state.stack.RepositoryXml;
  import org.apache.ambari.server.state.stack.StackRoleCommandOrder;
  import org.apache.ambari.server.state.stack.UpgradePack;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
index 92e01c2,8f9d8e1..464cb41
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
@@@ -491,6 -553,51 +553,36 @@@ public class UpgradeHelper 
    }
  
    /**
+    * Merges two service check groups when they have been orchestrated back-to-back.
+    * @param newHolder   the "new" group holder, which was orchestrated after the "old" one
+    * @param oldHolder   the "old" group holder, which is one that was already orchestrated
+    */
+   @SuppressWarnings("unchecked")
+   private void mergeServiceChecks(UpgradeGroupHolder newHolder, UpgradeGroupHolder oldHolder) {
+ 
+     LinkedHashSet<StageWrapper> priority = new LinkedHashSet<>();
+     LinkedHashSet<StageWrapper> others = new LinkedHashSet<>();
+ 
 -    Set<String> extraKeys = new HashSet<>();
 -    LinkedHashSet<StageWrapper> extras = new LinkedHashSet<>();
 -
+     for (List<StageWrapper> holderItems : new List[] { oldHolder.items, newHolder.items }) {
+       for (StageWrapper stageWrapper : holderItems) {
 -        if (stageWrapper instanceof ServiceCheckStageWrapper) {
 -          ServiceCheckStageWrapper wrapper = (ServiceCheckStageWrapper) stageWrapper;
 -          if (wrapper.priority) {
 -            priority.add(stageWrapper);
 -          } else {
 -            others.add(stageWrapper);
 -          }
++        ServiceCheckStageWrapper wrapper = (ServiceCheckStageWrapper) stageWrapper;
++
++        if (wrapper.priority) {
++          priority.add(stageWrapper);
+         } else {
 -          // !!! It's a good chance that back-to-back service check groups are adding the
 -          // same non-service-check wrappers.
 -          // this should be "equal enough" to prevent them from duplicating on merge
 -          String key = stageWrapper.toString();
 -          if (!extraKeys.contains(key)) {
 -            extras.add(stageWrapper);
 -            extraKeys.add(key);
 -          }
++          others.add(stageWrapper);
+         }
 -
+       }
+     }
+ 
+     // !!! remove duplicate wrappers that are now in the priority list
+     others = new LinkedHashSet<>(CollectionUtils.subtract(others, priority));
+ 
+     oldHolder.items = Lists.newLinkedList(priority);
+     oldHolder.items.addAll(others);
 -    oldHolder.items.addAll(extras);
+   }
+ 
+   /**
     * Walks through the UpgradeGroupHolder and updates titles and manual tasks,
     * replacing keyword tokens needed for display purposes
     *
@@@ -768,8 -905,250 +890,241 @@@
              serviceComponentHost.setVersion(StackVersionListener.UNKNOWN_VERSION);
            }
          }
-         serviceComponent.setDesiredVersion(desiredVersion);
  
+         // set component desired repo
+         serviceComponent.setDesiredRepositoryVersion(targetRepositoryVersion);
+       }
+     }
+   }
+ 
+   /**
+    * Handles the creation or resetting of configurations based on whether an
+    * upgrade or downgrade is occurring. This method will not do anything when
+    * the service is not crossing major stack versions, since, by definition, no
+    * new configurations are automatically created when upgrading with the same
+    * stack (ie HDP 2.2.0.0 -> HDP 2.2.1.0).
+    * <p/>
+    * When upgrading or downgrade between stacks (HDP 2.2.0.0 -> HDP 2.3.0.0)
+    * then this will perform the following:
+    * <ul>
+    * <li>Upgrade: Create new configurations that are a merge between the source
+    * stack and the target stack. If a value has changed between stacks, then the
+    * target stack value should be taken unless the cluster's value differs from
+    * the old stack. This can occur if a property has been customized after
 -   * installation. Read-only properties, however, are always taken from the new
 -   * stack.</li>
++   * installation.</li>
+    * <li>Downgrade: Reset the latest configurations from the service's original
+    * stack. The new configurations that were created on upgrade must be left
+    * intact until all components have been reverted, otherwise heartbeats will
+    * fail due to missing configurations.</li>
+    * </ul>
+    *
+    * @param upgradeContext
+    *          the upgrade context (not {@code null}).
+    * @throws AmbariException
+    */
+   private void processConfigurationsIfRequired(UpgradeContext upgradeContext)
+       throws AmbariException {
+ 
+     AmbariManagementController controller = m_controllerProvider.get();
+ 
+     Cluster cluster = upgradeContext.getCluster();
+     Direction direction = upgradeContext.getDirection();
+     String userName = controller.getAuthName();
+     Set<String> servicesInUpgrade = upgradeContext.getSupportedServices();
+ 
+     Set<String> clusterConfigTypes = new HashSet<>();
+     Set<String> processedClusterConfigTypes = new HashSet<>();
+ 
+     // merge or revert configurations for any service that needs it
+     for (String serviceName : servicesInUpgrade) {
+       RepositoryVersionEntity sourceRepositoryVersion = upgradeContext.getSourceRepositoryVersion(serviceName);
+       RepositoryVersionEntity targetRepositoryVersion = upgradeContext.getTargetRepositoryVersion(serviceName);
+       StackId sourceStackId = sourceRepositoryVersion.getStackId();
+       StackId targetStackId = targetRepositoryVersion.getStackId();
+ 
+       // only work with configurations when crossing stacks
+       if (sourceStackId.equals(targetStackId)) {
+         RepositoryVersionEntity associatedRepositoryVersion = upgradeContext.getRepositoryVersion();
+         LOG.info(
+             "The {} {} {} will not change stack configurations for {} since the source and target are both {}",
+             direction.getText(false), direction.getPreposition(),
+             associatedRepositoryVersion.getVersion(), serviceName, targetStackId);
+ 
+         continue;
+       }
+ 
+       ConfigHelper configHelper = m_configHelperProvider.get();
+ 
+       // downgrade is easy - just remove the new and make the old current
+       if (direction == Direction.DOWNGRADE) {
+         cluster.applyLatestConfigurations(targetStackId, serviceName);
+         continue;
+       }
+ 
 -      // the auto-merge must take read-only properties even if they have changed
 -      // - if the properties was read-only in the source stack, then we must
 -      // take the new stack's value
 -      Map<String, Set<String>> readOnlyProperties = getReadOnlyProperties(sourceStackId, serviceName);
 -
+       // upgrade is a bit harder - we have to merge new stack configurations in
+ 
+       // populate a map of default configurations for the service on the old
+       // stack (this is used when determining if a property has been
+       // customized and should be overriden with the new stack value)
+       Map<String, Map<String, String>> oldServiceDefaultConfigsByType = configHelper.getDefaultProperties(
+           sourceStackId, serviceName);
+ 
+       // populate a map with default configurations from the new stack
+       Map<String, Map<String, String>> newServiceDefaultConfigsByType = configHelper.getDefaultProperties(
+           targetStackId, serviceName);
+ 
+       if (null == oldServiceDefaultConfigsByType || null == newServiceDefaultConfigsByType) {
+         continue;
+       }
+ 
+       Set<String> foundConfigTypes = new HashSet<>();
+ 
+       // find the current, existing configurations for the service
+       List<Config> existingServiceConfigs = new ArrayList<>();
+       List<ServiceConfigEntity> latestServiceConfigs = m_serviceConfigDAO.getLastServiceConfigsForService(
+           cluster.getClusterId(), serviceName);
+ 
+       for (ServiceConfigEntity serviceConfig : latestServiceConfigs) {
+         List<ClusterConfigEntity> existingConfigurations = serviceConfig.getClusterConfigEntities();
+         for (ClusterConfigEntity currentServiceConfig : existingConfigurations) {
+           String configurationType = currentServiceConfig.getType();
+ 
+           Config currentClusterConfigForService = cluster.getDesiredConfigByType(configurationType);
+           existingServiceConfigs.add(currentClusterConfigForService);
+           foundConfigTypes.add(configurationType);
+         }
+       }
+ 
+       // !!! these are the types that come back from the config helper, but are not part of the service.
+       @SuppressWarnings("unchecked")
+       Set<String> missingConfigTypes = new HashSet<>(CollectionUtils.subtract(oldServiceDefaultConfigsByType.keySet(),
+           foundConfigTypes));
+ 
+       for (String missingConfigType : missingConfigTypes) {
+         Config config = cluster.getDesiredConfigByType(missingConfigType);
+         if (null != config) {
+           existingServiceConfigs.add(config);
+           clusterConfigTypes.add(missingConfigType);
+         }
+       }
+ 
+       // now that we have found, old, new, and existing confgs, overlay the
+       // existing on top of the new
+       for (Config existingServiceConfig : existingServiceConfigs) {
+         String configurationType = existingServiceConfig.getType();
+ 
+         // get current stack default configurations on install
+         Map<String, String> oldServiceDefaultConfigs = oldServiceDefaultConfigsByType.get(
+             configurationType);
+ 
+         // NPE sanity for current stack defaults
+         if (null == oldServiceDefaultConfigs) {
+           oldServiceDefaultConfigs = Collections.emptyMap();
+         }
+ 
+         // get the existing configurations
+         Map<String, String> existingConfigurations = existingServiceConfig.getProperties();
+ 
+         // get the new configurations
 -        Map<String, String> newDefaultConfigurations = newServiceDefaultConfigsByType.get(configurationType);
++        Map<String, String> newDefaultConfigurations = newServiceDefaultConfigsByType.get(
++            configurationType);
+ 
+         // if the new stack configurations don't have the type, then simply add
+         // all of the existing in
+         if (null == newDefaultConfigurations) {
+           newServiceDefaultConfigsByType.put(configurationType, existingConfigurations);
+           continue;
+         } else {
+           // Remove any configs in the new stack whose value is NULL, unless
+           // they currently exist and the value is not NULL.
+           Iterator<Map.Entry<String, String>> iter = newDefaultConfigurations.entrySet().iterator();
+           while (iter.hasNext()) {
+             Map.Entry<String, String> entry = iter.next();
+             if (entry.getValue() == null) {
+               iter.remove();
+             }
+           }
+         }
+ 
 -        // process every existing configuration property for this configuration type
++        // process every existing configuration property for this configuration
++        // type
+         for (Map.Entry<String, String> existingConfigurationEntry : existingConfigurations.entrySet()) {
+           String existingConfigurationKey = existingConfigurationEntry.getKey();
+           String existingConfigurationValue = existingConfigurationEntry.getValue();
+ 
+           // if there is already an entry, we now have to try to determine if
+           // the value was customized after stack installation
+           if (newDefaultConfigurations.containsKey(existingConfigurationKey)) {
+             String newDefaultConfigurationValue = newDefaultConfigurations.get(
+                 existingConfigurationKey);
+ 
+             if (!StringUtils.equals(existingConfigurationValue, newDefaultConfigurationValue)) {
+               // the new default is different from the existing cluster value;
+               // only override the default value if the existing value differs
+               // from the original stack
+               String oldDefaultValue = oldServiceDefaultConfigs.get(existingConfigurationKey);
+ 
 -              // see if this property is a read-only property which means that
 -              // we shouldn't care if it was changed - we should take the new
 -              // stack's value
 -              Set<String> readOnlyPropertiesForType = readOnlyProperties.get(configurationType);
 -              boolean readOnly = (null != readOnlyPropertiesForType
 -                  && readOnlyPropertiesForType.contains(existingConfigurationKey));
 -
 -              if (!readOnly && !StringUtils.equals(existingConfigurationValue, oldDefaultValue)) {
 -                // at this point, we've determined that there is a difference
 -                // between default values between stacks, but the value was also
 -                // customized, so keep the customized value
++              if (!StringUtils.equals(existingConfigurationValue, oldDefaultValue)) {
++                // at this point, we've determined that there is a
++                // difference
++                // between default values between stacks, but the value was
++                // also customized, so keep the customized value
+                 newDefaultConfigurations.put(existingConfigurationKey, existingConfigurationValue);
+               }
+             }
+           } else {
 -            // there is no entry in the map, so add the existing key/value pair
++            // there is no entry in the map, so add the existing key/value
++            // pair
+             newDefaultConfigurations.put(existingConfigurationKey, existingConfigurationValue);
+           }
+         }
+ 
+         /*
+         for every new configuration which does not exist in the existing
+         configurations, see if it was present in the current stack
+ 
+         stack 2.x has foo-site/property (on-ambari-upgrade is false)
+         stack 2.y has foo-site/property
+         the current cluster (on 2.x) does not have it
+ 
+         In this case, we should NOT add it back as clearly stack advisor has removed it
+         */
+         Iterator<Map.Entry<String, String>> newDefaultConfigurationsIterator = newDefaultConfigurations.entrySet().iterator();
+         while (newDefaultConfigurationsIterator.hasNext()) {
+           Map.Entry<String, String> newConfigurationEntry = newDefaultConfigurationsIterator.next();
+           String newConfigurationPropertyName = newConfigurationEntry.getKey();
+           if (oldServiceDefaultConfigs.containsKey(newConfigurationPropertyName)
+               && !existingConfigurations.containsKey(newConfigurationPropertyName)) {
+             LOG.info(
+                 "The property {}/{} exists in both {} and {} but is not part of the current set of configurations and will therefore not be included in the configuration merge",
+                 configurationType, newConfigurationPropertyName, sourceStackId, targetStackId);
+ 
+             // remove the property so it doesn't get merged in
+             newDefaultConfigurationsIterator.remove();
+           }
+         }
+       }
+ 
+       if (null != newServiceDefaultConfigsByType) {
+ 
+         for (String clusterConfigType : clusterConfigTypes) {
+           if (processedClusterConfigTypes.contains(clusterConfigType)) {
+             newServiceDefaultConfigsByType.remove(clusterConfigType);
+           } else {
+             processedClusterConfigTypes.add(clusterConfigType);
+           }
+ 
+         }
+ 
+         Set<String> configTypes = newServiceDefaultConfigsByType.keySet();
+         LOG.warn("The upgrade will create the following configurations for stack {}: {}",
+             targetStackId, StringUtils.join(configTypes, ','));
+ 
+         String serviceVersionNote = String.format("%s %s %s", direction.getText(true),
+             direction.getPreposition(), upgradeContext.getRepositoryVersion().getVersion());
+ 
+         configHelper.createConfigTypes(cluster, targetStackId, controller,
+             newServiceDefaultConfigsByType, userName, serviceVersionNote);
        }
      }
    }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ParameterizedSource.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/alert/Reporting.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/alert/Source.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 7147ce3,9c0b0ca..e6da65e
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@@ -145,14 -128,12 +132,16 @@@ import org.apache.ambari.server.state.U
  import org.apache.ambari.server.state.configgroup.ConfigGroup;
  import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
  import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
+ import org.apache.ambari.server.state.repository.ClusterVersionSummary;
+ import org.apache.ambari.server.state.repository.VersionDefinitionXml;
  import org.apache.ambari.server.state.scheduler.RequestExecution;
  import org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
 +import org.apache.ambari.server.state.stack.upgrade.Direction;
 +import org.apache.ambari.server.state.svccomphost.ServiceComponentHostSummary;
 +import org.apache.ambari.server.topology.TopologyDeleteFormer;
  import org.apache.ambari.server.topology.TopologyRequest;
  import org.apache.commons.collections.CollectionUtils;
 +import org.apache.commons.collections.MapUtils;
  import org.apache.commons.lang.StringUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
@@@ -2315,15 -1545,10 +1569,15 @@@ public class ClusterImpl implements Clu
        serviceConfigEntity.setVersion(nextServiceConfigVersion);
        serviceConfigEntity.setUser(user);
        serviceConfigEntity.setNote(note);
-       serviceConfigEntity.setStack(clusterEntity.getDesiredStack());
+       serviceConfigEntity.setStack(stackEntity);
  
        serviceConfigDAO.create(serviceConfigEntity);
 +      List<String> groupHostNames = null;
        if (configGroup != null) {
 +        if (MapUtils.isNotEmpty(configGroup.getHosts())) {
 +          groupHostNames = configGroup.getHosts().entrySet().stream().map(h -> h.getValue().getHostName())
 +              .collect(Collectors.toList());
 +        }
          serviceConfigEntity.setHostIds(new ArrayList<>(configGroup.getHosts().keySet()));
          serviceConfigEntity = serviceConfigDAO.merge(serviceConfigEntity);
        }
@@@ -2585,19 -1806,31 +1837,32 @@@
        throw new ObjectNotFoundException("Service config version with serviceName={} and version={} not found");
      }
  
 +    String configGroupName = null;
      // disable all configs related to service
      if (serviceConfigEntity.getGroupId() == null) {
+       // Here was fixed bug with entity changes revert. More you can find here AMBARI-21173.
+       // This issue reproduces only if you are changing same entity in first and second loop.
+       // In that case eclipselink will revert changes to cached, if entity has fluchGroup and it
+       // needs to be refreshed. Actually we don't need to change same antities in few steps, so i
+       // decided to filter out. duplicates and do not change them. It will be better for performance and bug will be fixed.
        Collection<String> configTypes = serviceConfigTypes.get(serviceName);
        List<ClusterConfigEntity> enabledConfigs = clusterDAO.getEnabledConfigsByTypes(clusterId, configTypes);
+       List<ClusterConfigEntity> serviceConfigEntities = serviceConfigEntity.getClusterConfigEntities();
+       ArrayList<ClusterConfigEntity> duplicatevalues = new ArrayList<>(serviceConfigEntities);
+       duplicatevalues.retainAll(enabledConfigs);
+ 
        for (ClusterConfigEntity enabledConfig : enabledConfigs) {
-         enabledConfig.setSelected(false);
-         clusterDAO.merge(enabledConfig);
+         if (!duplicatevalues.contains(enabledConfig)) {
+           enabledConfig.setSelected(false);
+           clusterDAO.merge(enabledConfig);
+         }
        }
  
-       for (ClusterConfigEntity configEntity : serviceConfigEntity.getClusterConfigEntities()) {
-         configEntity.setSelected(true);
-         clusterDAO.merge(configEntity);
+       for (ClusterConfigEntity configEntity : serviceConfigEntities) {
+         if (!duplicatevalues.contains(configEntity)) {
+           configEntity.setSelected(true);
+           clusterDAO.merge(configEntity);
+         }
        }
      } else {
        Long configGroupId = serviceConfigEntity.getGroupId();
@@@ -3159,9 -2415,14 +2463,14 @@@
        // since the entities which were modified came from the cluster entity's
        // list to begin with, we can just save them right back - no need for a
        // new collection since the entity instances were modified directly
 -      clusterEntity = clusterDAO.merge(clusterEntity, true);
 +      clusterEntity = clusterDAO.merge(clusterEntity);
  
        cacheConfigurations();
+ 
+       LOG.info(
+           "Applied latest configurations for {} on stack {}. The the following types were modified: {}",
+           serviceName, stackId, StringUtils.join(configTypesForService, ','));
+ 
      } finally {
        clusterGlobalLock.writeLock().unlock();
      }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java
index 702d776,5ac1ac3..8743f63
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java
@@@ -46,13 -40,10 +46,11 @@@ import org.apache.ambari.server.control
  import org.apache.ambari.server.events.HostRegisteredEvent;
  import org.apache.ambari.server.events.HostsAddedEvent;
  import org.apache.ambari.server.events.HostsRemovedEvent;
 +import org.apache.ambari.server.events.TopologyUpdateEvent;
  import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
  import org.apache.ambari.server.orm.dao.ClusterDAO;
- import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
  import org.apache.ambari.server.orm.dao.HostConfigMappingDAO;
  import org.apache.ambari.server.orm.dao.HostDAO;
- import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
  import org.apache.ambari.server.orm.dao.HostStateDAO;
  import org.apache.ambari.server.orm.dao.HostVersionDAO;
  import org.apache.ambari.server.orm.dao.KerberosPrincipalHostDAO;
@@@ -276,17 -243,9 +260,17 @@@ public class ClustersImpl implements Cl
      clusters.put(clusterName, cluster);
      clustersById.put(cluster.getClusterId(), cluster);
      clusterHostMap.put(clusterName,
-         Collections.newSetFromMap(new ConcurrentHashMap<Host, Boolean>()));
+         Collections.newSetFromMap(new ConcurrentHashMap<>()));
  
      cluster.setCurrentStackVersion(stackId);
 +
 +    TreeMap<String, TopologyCluster> addedClusters = new TreeMap<>();
 +    TopologyCluster addedCluster = new TopologyCluster();
 +    addedClusters.put(Long.toString(cluster.getClusterId()), addedCluster);
 +    TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(addedClusters,
 +        TopologyUpdateEvent.EventType.UPDATE);
 +    m_topologyHolder.get().updateData(topologyUpdateEvent);
 +    m_metadataHolder.get().updateData(m_ambariManagementController.get().getClusterMetadata(cluster));
    }
  
    @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
index 0b54eec,274a425..2a9e69e
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
@@@ -595,14 -580,9 +586,10 @@@ public class HostImpl implements Host 
        writeLock.unlock();
      }
      if (oldState != getState()) {
 +      ambariEventPublisher.publish(new HostStateUpdateEvent(getHostName(), getState()));
        if (LOG.isDebugEnabled()) {
-         LOG.debug("Host transitioned to a new state"
-             + ", host=" + getHostName()
-             + ", oldState=" + oldState
-             + ", currentState=" + getState()
-             + ", eventType=" + event.getType().name()
-             + ", event=" + event);
+         LOG.debug("Host transitioned to a new state, host={}, oldState={}, currentState={}, eventType={}, event={}",
+           getHostName(), oldState, getState(), event.getType().name(), event);
        }
      }
    }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/AbstractKerberosDescriptor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/AbstractKerberosDescriptorContainer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosComponentDescriptor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosDescriptor.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosDescriptor.java
index a1b9e5c,0c7a9a9..9432f6c
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosDescriptor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosDescriptor.java
@@@ -193,13 -201,17 +198,17 @@@ public class KerberosDescriptor extend
        }
  
        if (services == null) {
 -        services = new TreeMap<String, KerberosServiceDescriptor>();
 +        services = new TreeMap<>();
        }
  
-       services.put(name, service);
- 
-       // Set the service's parent to this KerberosDescriptor
-       service.setParent(this);
+       KerberosServiceDescriptor existing = services.get(name);
+       if (existing == null) {
+         services.put(name, service);
+         // Set the service's parent to this KerberosDescriptor
+         service.setParent(this);
+       } else {
+         existing.update(service);
+       }
      }
    }
  
@@@ -418,4 -425,43 +422,43 @@@
  
      return authToLocalProperties;
    }
+ 
+   /**
+    * Get a map of principals, where the key is the principal path (SERVICE/COMPONENT/principal_name or SERVICE/principal_name) and the value is the principal.
+    * <p>
+    * For example if the kerberos principal of the HISTORYSERVER is defined in the kerberos.json:
+    * "name": "history_server_jhs",
+    * "principal": {
+    * "value": "jhs/_HOST@${realm}",
+    * "type" : "service",
+    * },
+    * Then "jhs/_HOST@EXAMPLE.COM" will be put into the map under the "MAPREDUCE2/HISTORYSERVER/history_server_jhs" key.
+    */
+   public Map<String, String> principals() throws AmbariException {
+     Map<String, String> result = new HashMap<>();
+     for (AbstractKerberosDescriptorContainer each : nullToEmpty(getChildContainers())) {
+       if ((each instanceof KerberosServiceDescriptor)) {
+         collectFromComponents(each.getName(), nullToEmpty(((KerberosServiceDescriptor) each).getComponents()).values(), result);
+         collectFromIdentities(each.getName(), "", nullToEmpty(each.getIdentities()), result);
+       }
+     }
+     return result;
+   }
+ 
+   private static void collectFromComponents(String service, Collection<KerberosComponentDescriptor> components, Map<String, String> result) {
+     for (KerberosComponentDescriptor each : components) {
+       collectFromIdentities(service, each.getName(), nullToEmpty(each.getIdentities()), result);
+     }
+   }
+ 
+   private static void collectFromIdentities(String service, String component, Collection<KerberosIdentityDescriptor> identities, Map<String, String> result) {
+     for (KerberosIdentityDescriptor each : identities) {
 -      if (each.getPrincipalDescriptor() != null && !each.getReferencedServiceName().isPresent()) {
++      if (each.getPrincipalDescriptor() != null && !each.getReferencedServiceName().isPresent() && !each.getName().startsWith("/")) {
+         String path = StringUtils.isBlank(component)
+             ? String.format("%s/%s", service, each.getName())
+             : String.format("%s/%s/%s", service, component, each.getName());
+         result.put(path, each.getPrincipalDescriptor().getName());
+       }
+     }
+   }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosIdentityDescriptor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptor.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptor.java
index 68cafe5,51b7cd0..5da3399
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptor.java
@@@ -157,6 -150,8 +146,8 @@@ public class KerberosServiceDescriptor 
            }
          }
        }
+ 
 -      setPreconfigure(getBooleanValue(data, KEY_PRECONFIGURE));
++      setPreconfigure(getBooleanValue(data, "preconfigure"));
      }
    }
  
@@@ -266,9 -279,13 +275,13 @@@
        for (KerberosComponentDescriptor component : components.values()) {
          list.add(component.toMap());
        }
 -      map.put(KEY_COMPONENTS, list);
 +      map.put(Type.COMPONENT.getDescriptorPluralName(), list);
      }
  
+     if (preconfigure != null) {
 -      map.put(KEY_PRECONFIGURE, preconfigure.toString());
++      map.put("preProcess", preconfigure.toString());
+     }
+ 
      return map;
    }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/services/AmbariServerAlertService.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/stack/RepositoryXml.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/stack/RepositoryXml.java
index 078b4ae,c2209bb..03b3705
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/RepositoryXml.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/RepositoryXml.java
@@@ -146,7 -146,8 +146,6 @@@ public class RepositoryXml implements V
      private String mirrorslist = null;
      private String repoid = null;
      private String reponame = null;
-     private String latest = null;
 -    private String distribution = null;
 -    private String components = null;
      private boolean unique = false;
  
      private Repo() {
@@@ -180,10 -181,13 +179,6 @@@
        return reponame;
      }
  
-     public String getLatestUri() {
-       return latest;
 -    public String getDistribution() {
 -      return distribution;
--    }
--
 -    public String getComponents() {
 -      return components;
 -    }
      /**
       * @return true if version of HDP that change with each release
       */
@@@ -217,7 -221,8 +212,6 @@@
            ri.setOsType(os.trim());
            ri.setRepoId(r.getRepoId());
            ri.setRepoName(r.getRepoName());
-           ri.setLatestBaseUrl(r.getBaseUrl());
 -          ri.setDistribution(r.getDistribution());
 -          ri.setComponents(r.getComponents());
            ri.setUnique(r.isUnique());
  
            repos.add(ri);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ConfigureTask.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
index fdb7c8d,f540d8d..9524c09
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
@@@ -218,4 -246,98 +236,97 @@@ public class RepositoryVersionHelper 
      throw new AmbariException("There were no suitable upgrade packs for stack " + stackName + " " + stackVersion +
          ((null != upgradeType) ? " and upgrade type " + upgradeType : ""));
    }
+ 
+   /**
+    * Build the role parameters for an install command.
+    *
+    * @param amc           the management controller.  Tests don't use the same instance that gets injected.
+    * @param repoVersion   the repository version
+    * @param osFamily      the os family
+    * @param servicesOnHost the set of services to check for packages
+    * @return a Map<String, String> to use in
+    */
+   public Map<String, String> buildRoleParams(AmbariManagementController amc, RepositoryVersionEntity repoVersion, String osFamily, Set<String> servicesOnHost)
+     throws SystemException {
+ 
+     StackId stackId = repoVersion.getStackId();
+ 
+     List<ServiceOsSpecific.Package> packages = new ArrayList<>();
+ 
+     for (String serviceName : servicesOnHost) {
+       ServiceInfo info;
+ 
+       try {
+         if (ami.get().isServiceRemovedInStack(stackId.getStackName(), stackId.getStackVersion(), serviceName)) {
+           LOG.info(String.format("%s has been removed from stack %s-%s. Skip calculating its installation packages", stackId.getStackName(), stackId.getStackVersion(), serviceName));
+           continue; //No need to calculate install packages for removed services
+         }
+ 
+         info = ami.get().getService(stackId.getStackName(), stackId.getStackVersion(), serviceName);
+       } catch (AmbariException e) {
+         throw new SystemException(String.format("Cannot obtain stack information for %s-%s", stackId.getStackName(), stackId.getStackVersion()), e);
+       }
+ 
+       List<ServiceOsSpecific.Package> packagesForService = amc.getPackagesForServiceHost(info,
+         new HashMap<>(), osFamily);
+ 
+       List<String> blacklistedPackagePrefixes = configuration.get().getRollingUpgradeSkipPackagesPrefixes();
+ 
+       for (ServiceOsSpecific.Package aPackage : packagesForService) {
+         if (!aPackage.getSkipUpgrade()) {
+           boolean blacklisted = false;
+           for (String prefix : blacklistedPackagePrefixes) {
+             if (aPackage.getName().startsWith(prefix)) {
+               blacklisted = true;
+               break;
+             }
+           }
+           if (! blacklisted) {
+             packages.add(aPackage);
+           }
+         }
+       }
+     }
+ 
+     Map<String, String> roleParams = new HashMap<>();
+     roleParams.put("stack_id", stackId.getStackId());
+     // !!! TODO make roleParams <String, Object> so we don't have to do this awfulness.
+     roleParams.put(KeyNames.PACKAGE_LIST, gson.toJson(packages));
+ 
+     return roleParams;
+   }
+ 
+   /**
+    * Adds a command repository to the action context
+    * @param context       the context
+    * @param osFamily      the OS family
+    * @param repoVersion   the repository version entity
+    * @param repos         the repository entities
+    */
+   public void addCommandRepository(ActionExecutionContext context,
+       RepositoryVersionEntity repoVersion, OperatingSystemEntity osEntity) {
+ 
+     final CommandRepository commandRepo = new CommandRepository();
+     commandRepo.setRepositories(osEntity.getOsType(), osEntity.getRepositories());
+     commandRepo.setRepositoryVersion(repoVersion.getVersion());
+     commandRepo.setRepositoryVersionId(repoVersion.getId());
 -    commandRepo.setResolved(repoVersion.isResolved());
+     commandRepo.setStackName(repoVersion.getStackId().getStackName());
+ 
+     if (!osEntity.isAmbariManagedRepos()) {
+       commandRepo.setNonManaged();
+     } else {
+       commandRepo.setUniqueSuffix(String.format("-repo-%s", repoVersion.getId()));
+     }
+ 
+     context.addVisitor(new ExecutionCommandVisitor() {
+       @Override
+       public void visit(ExecutionCommand command) {
+         if (null == command.getRepositoryFile()) {
+           command.setRepositoryFile(commandRepo);
+         }
+       }
+     });
+   }
+ 
+ 
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
index 446ae8c,230b031..ecb616a
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
@@@ -25,10 -24,8 +25,11 @@@ import java.util.HashSet
  import java.util.List;
  import java.util.Map;
  import java.util.Map.Entry;
 +import java.util.Set;
 +import java.util.TreeMap;
+ import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ConcurrentMap;
 +import java.util.concurrent.atomic.AtomicReference;
  import java.util.concurrent.locks.Lock;
  import java.util.concurrent.locks.ReadWriteLock;
  import java.util.concurrent.locks.ReentrantReadWriteLock;
@@@ -93,8 -83,8 +95,9 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import com.google.common.collect.ImmutableList;
+ import com.google.common.util.concurrent.Striped;
  import com.google.inject.Inject;
 +import com.google.inject.Provider;
  import com.google.inject.assistedinject.Assisted;
  import com.google.inject.assistedinject.AssistedInject;
  import com.google.inject.persist.Transactional;
@@@ -880,8 -869,8 +888,9 @@@ public class ServiceComponentHostImpl i
    }
  
    @Override
+   @Transactional
    public void setState(State state) {
 +    State oldState = getState();
      stateMachine.setCurrentState(state);
      HostComponentStateEntity stateEntity = getStateEntity();
      if (stateEntity != null) {
@@@ -913,7 -898,8 +922,8 @@@
    }
  
    @Override
+   @Transactional
 -  public void setVersion(String version) {
 +  public void setVersion(String version) throws AmbariException {
      HostComponentStateEntity stateEntity = getStateEntity();
      if (stateEntity != null) {
        stateEntity.setVersion(version);


[07/50] [abbrv] ambari git commit: AMBARI-22040. configs.py does not work properly when dealing with files (aonishuk)

Posted by ao...@apache.org.
AMBARI-22040. configs.py does not work properly when dealing with files (aonishuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/12abba0b
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/12abba0b
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/12abba0b

Branch: refs/heads/branch-3.0-perf
Commit: 12abba0b743ec198067001a64608ccbcc904a869
Parents: 50b6475
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Mon Sep 25 12:38:39 2017 +0300
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Mon Sep 25 12:38:39 2017 +0300

----------------------------------------------------------------------
 ambari-server/src/test/python/TestConfigs.py    | 38 ++++++++++++++++----
 .../src/test/resources/TestConfigs-content.xml  | 28 +++++++++++++++
 2 files changed, 60 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/12abba0b/ambari-server/src/test/python/TestConfigs.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestConfigs.py b/ambari-server/src/test/python/TestConfigs.py
index cc6cb31..6d2ab34 100644
--- a/ambari-server/src/test/python/TestConfigs.py
+++ b/ambari-server/src/test/python/TestConfigs.py
@@ -73,7 +73,7 @@ class TestConfigs(TestCase):
       self.assertEquals(config['properties'], {'config1': 'value1', 'config2': 'value2'})
     urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping)
     to_file_method.return_value = config_assertion
-    sys.argv = ['configs.py', 'user', 'password', '8081', 'http', 'get', 'localhost', 'cluster1', 'hdfs-site', '1.conf']
+    sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'http', '-a', 'get', '-l','localhost','-n', 'cluster1', '-c','hdfs-site']
     configs.main()
 
   @patch.object(configs, 'output_to_file')
@@ -94,7 +94,7 @@ class TestConfigs(TestCase):
       }
     }
     urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping)
-    sys.argv = ['configs.py', 'user', 'password', '8081', 'https', 'set', 'localhost', 'cluster1', 'hdfs-site', 'config1', 'value3']
+    sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'https', '-a', 'set', '-l','localhost','-n', 'cluster1', '-c','hdfs-site', '-k', 'config1', '-v', 'value3']
     configs.main()
 
   @patch.object(configs, 'output_to_file')
@@ -115,7 +115,7 @@ class TestConfigs(TestCase):
       }
     }
     urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping)
-    sys.argv = ['configs.py', 'user', 'password', '8081', 'https', 'set', 'localhost', 'cluster1', 'hdfs-site', 'config1', 'value3']
+    sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'https', '-a', 'set', '-l','localhost','-n', 'cluster1', '-c','hdfs-site', '-k', 'config1', '-v', 'value3']
     configs.main()
 
   @patch.object(configs, 'output_to_file')
@@ -138,7 +138,7 @@ class TestConfigs(TestCase):
       }
     }
     urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping)
-    sys.argv = ['configs.py', 'user', 'password', '8081', 'https', 'set', 'localhost', 'cluster2', 'hdfs-site', 'config1', 'value4']
+    sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'https', '-a', 'set', '-l','localhost','-n', 'cluster2', '-c','hdfs-site', '-k', 'config1', '-v', 'value4']
     configs.main()
 
   @patch.object(configs, 'output_to_file')
@@ -159,7 +159,8 @@ class TestConfigs(TestCase):
       }
     }
     urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping)
-    sys.argv = ['configs.py', 'user', 'password', '8081', 'https', 'delete', 'localhost', 'cluster1', 'hdfs-site', 'config1']
+
+    sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'https', '-a', 'delete', '-l','localhost','-n', 'cluster1', '-c','hdfs-site', '-k', 'config1']
     configs.main()
 
   @patch.object(configs, 'output_to_file')
@@ -182,5 +183,30 @@ class TestConfigs(TestCase):
       }
     }
     urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping)
-    sys.argv = ['configs.py', 'user', 'password', '8081', 'https', 'delete', 'localhost', 'cluster2', 'hdfs-site', 'config1']
+    sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'https', '-a', 'delete', '-l','localhost','-n', 'cluster2', '-c','hdfs-site', '-k', 'config1']
+    configs.main()
+
+  @patch.object(configs, 'output_to_file')
+  @patch('urllib2.urlopen')
+  def test_set_properties_from_xml(self, urlopen_method, to_file_method):
+    response_mapping = {
+      'GET': {
+        'body': {
+          'https://localhost:8081/api/v1/clusters/cluster1?fields=Clusters/desired_configs' : '{"Clusters":{"desired_configs":{"hdfs-site":{"tag":"version1"}}}}',
+          'https://localhost:8081/api/v1/clusters/cluster1/configurations?type=hdfs-site&tag=version1': '{"items":[{"properties":{"config3": "value3", "config4": "value4"}}]}'
+        }
+      },
+      'PUT': {
+        'request_assertion': {
+          'https://localhost:8081/api/v1/clusters/cluster1':
+            lambda request_body: self.assertEquals(request_body['Clusters']['desired_configs']['properties'], {"config1": "value1", "config2": "value2"})
+        }
+      }
+    }
+    urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping)
+
+    test_directory = os.path.dirname(os.path.abspath(__file__))
+    configs_path = os.path.join(test_directory, '../resources/TestConfigs-content.xml')
+
+    sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'https', '-a', 'set', '-l','localhost','-n', 'cluster1', '-c','hdfs-site', '-f', configs_path]
     configs.main()

http://git-wip-us.apache.org/repos/asf/ambari/blob/12abba0b/ambari-server/src/test/resources/TestConfigs-content.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/TestConfigs-content.xml b/ambari-server/src/test/resources/TestConfigs-content.xml
new file mode 100644
index 0000000..4039da9
--- /dev/null
+++ b/ambari-server/src/test/resources/TestConfigs-content.xml
@@ -0,0 +1,28 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<configuration>
+  <property>
+    <name>config1</name>
+    <value>value1</value>
+    <final>true</final>
+  </property>
+  <property>
+    <name>config2</name>
+    <value>value2</value>
+  </property>
+</configuration>
\ No newline at end of file


[38/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
index 812ae36,f4d0a9a..5665179
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
@@@ -27,13 -27,13 +27,14 @@@ import java.util.Map
  
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.H2DatabaseCleaner;
- import org.apache.ambari.server.api.services.AmbariMetaInfo;
  import org.apache.ambari.server.controller.ServiceResponse;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
  import org.apache.ambari.server.orm.GuiceJpaInitializer;
  import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+ import org.apache.ambari.server.orm.OrmTestHelper;
  import org.apache.ambari.server.orm.dao.ClusterServiceDAO;
  import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
  import org.junit.After;
  import org.junit.Before;
  import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
index d80b03c,8b8e7e1..677b607
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
@@@ -2273,6 -2250,548 +2250,504 @@@ public class UpgradeHelperTest extends 
    }
  
    /**
+    * Tests merging configurations between existing and new stack values on
+    * upgrade.
+    *
+    * @throws Exception
+    */
+   @Test
+   public void testMergeConfigurations() throws Exception {
+     RepositoryVersionEntity repoVersion211 = createNiceMock(RepositoryVersionEntity.class);
+     RepositoryVersionEntity repoVersion220 = createNiceMock(RepositoryVersionEntity.class);
+ 
+     StackId stack211 = new StackId("HDP-2.1.1");
+     StackId stack220 = new StackId("HDP-2.2.0");
+ 
+     String version211 = "2.1.1.0-1234";
+     String version220 = "2.2.0.0-1234";
+ 
+     expect(repoVersion211.getStackId()).andReturn(stack211).atLeastOnce();
+     expect(repoVersion211.getVersion()).andReturn(version211).atLeastOnce();
+ 
+     expect(repoVersion220.getStackId()).andReturn(stack220).atLeastOnce();
+     expect(repoVersion220.getVersion()).andReturn(version220).atLeastOnce();
+ 
+     Map<String, Map<String, String>> stack211Configs = new HashMap<>();
+     Map<String, String> stack211FooType = new HashMap<>();
+     Map<String, String> stack211BarType = new HashMap<>();
+     Map<String, String> stack211BazType = new HashMap<>();
+     stack211Configs.put("foo-site", stack211FooType);
+     stack211Configs.put("bar-site", stack211BarType);
+     stack211Configs.put("baz-site", stack211BazType);
+     stack211FooType.put("1", "one");
+     stack211FooType.put("1A", "one-A");
+     stack211BarType.put("2", "two");
+     stack211BazType.put("3", "three");
+ 
+     Map<String, Map<String, String>> stack220Configs = new HashMap<>();
+     Map<String, String> stack220FooType = new HashMap<>();
+     Map<String, String> stack220BazType = new HashMap<>();
+     stack220Configs.put("foo-site", stack220FooType);
+     stack220Configs.put("baz-site", stack220BazType);
+     stack220FooType.put("1", "one-new");
+     stack220FooType.put("1A1", "one-A-one");
+     stack220BazType.put("3", "three-new");
+ 
+     Map<String, String> existingFooType = new HashMap<>();
+     Map<String, String> existingBarType = new HashMap<>();
+     Map<String, String> existingBazType = new HashMap<>();
+ 
+     ClusterConfigEntity fooConfigEntity = createNiceMock(ClusterConfigEntity.class);
+     ClusterConfigEntity barConfigEntity = createNiceMock(ClusterConfigEntity.class);
+     ClusterConfigEntity bazConfigEntity = createNiceMock(ClusterConfigEntity.class);
+ 
+     expect(fooConfigEntity.getType()).andReturn("foo-site");
+     expect(barConfigEntity.getType()).andReturn("bar-site");
+     expect(bazConfigEntity.getType()).andReturn("baz-site");
+ 
+     Config fooConfig = createNiceMock(Config.class);
+     Config barConfig = createNiceMock(Config.class);
+     Config bazConfig = createNiceMock(Config.class);
+ 
+     existingFooType.put("1", "one");
+     existingFooType.put("1A", "one-A");
+     existingBarType.put("2", "two");
+     existingBazType.put("3", "three-changed");
+ 
+     expect(fooConfig.getType()).andReturn("foo-site").atLeastOnce();
+     expect(barConfig.getType()).andReturn("bar-site").atLeastOnce();
+     expect(bazConfig.getType()).andReturn("baz-site").atLeastOnce();
+     expect(fooConfig.getProperties()).andReturn(existingFooType);
+     expect(barConfig.getProperties()).andReturn(existingBarType);
+     expect(bazConfig.getProperties()).andReturn(existingBazType);
+ 
+     Map<String, DesiredConfig> desiredConfigurations = new HashMap<>();
+     desiredConfigurations.put("foo-site", null);
+     desiredConfigurations.put("bar-site", null);
+     desiredConfigurations.put("baz-site", null);
+ 
+     Service zookeeper = createNiceMock(Service.class);
+     expect(zookeeper.getName()).andReturn("ZOOKEEPER").atLeastOnce();
+     expect(zookeeper.getServiceComponents()).andReturn(
+       new HashMap<>()).once();
+     zookeeper.setDesiredRepositoryVersion(repoVersion220);
+     expectLastCall().once();
+ 
+     Cluster cluster = createNiceMock(Cluster.class);
+     expect(cluster.getCurrentStackVersion()).andReturn(stack211).atLeastOnce();
+     expect(cluster.getDesiredStackVersion()).andReturn(stack220);
+     expect(cluster.getDesiredConfigs()).andReturn(desiredConfigurations);
+     expect(cluster.getDesiredConfigByType("foo-site")).andReturn(fooConfig);
+     expect(cluster.getDesiredConfigByType("bar-site")).andReturn(barConfig);
+     expect(cluster.getDesiredConfigByType("baz-site")).andReturn(bazConfig);
+     expect(cluster.getService("ZOOKEEPER")).andReturn(zookeeper);
+     expect(cluster.getDesiredConfigByType("foo-type")).andReturn(fooConfig);
+     expect(cluster.getDesiredConfigByType("bar-type")).andReturn(barConfig);
+     expect(cluster.getDesiredConfigByType("baz-type")).andReturn(bazConfig);
+ 
+     // setup the config helper for placeholder resolution
+     @SuppressWarnings("unchecked")
+     Provider<ConfigHelper> configHelperProvider = EasyMock.createNiceMock(Provider.class);
+     ConfigHelper configHelper = EasyMock.createNiceMock(ConfigHelper.class);
+ 
+     expect(configHelperProvider.get()).andStubReturn(configHelper);
+ 
+     expect(configHelper.getDefaultProperties(stack211, "ZOOKEEPER")).andReturn(
+         stack211Configs).anyTimes();
+ 
+     expect(configHelper.getDefaultProperties(stack220, "ZOOKEEPER")).andReturn(
+         stack220Configs).anyTimes();
+ 
+     Capture<Map<String, Map<String, String>>> expectedConfigurationsCapture = EasyMock.newCapture();
+ 
+     configHelper.createConfigTypes(EasyMock.anyObject(Cluster.class),
+         EasyMock.anyObject(StackId.class), EasyMock.anyObject(AmbariManagementController.class),
+         EasyMock.capture(expectedConfigurationsCapture), EasyMock.anyObject(String.class),
+         EasyMock.anyObject(String.class));
+ 
+     expectLastCall().once();
+     EasyMock.replay(configHelperProvider, configHelper);
+ 
+     // mock the service config DAO and replay it
+     ServiceConfigEntity zookeeperServiceConfig = createNiceMock(ServiceConfigEntity.class);
+     expect(zookeeperServiceConfig.getClusterConfigEntities()).andReturn(
+         Lists.newArrayList(fooConfigEntity, barConfigEntity, bazConfigEntity));
+ 
+     ServiceConfigDAO serviceConfigDAOMock;
+     serviceConfigDAOMock = EasyMock.createNiceMock(ServiceConfigDAO.class);
+ 
+     List<ServiceConfigEntity> latestServiceConfigs = Lists.newArrayList(zookeeperServiceConfig);
+     expect(serviceConfigDAOMock.getLastServiceConfigsForService(EasyMock.anyLong(),
+         eq("ZOOKEEPER"))).andReturn(latestServiceConfigs).once();
+ 
+     replay(serviceConfigDAOMock);
+ 
+     Map<String, UpgradePack> upgradePacks = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1");
+     UpgradePack upgradePack = upgradePacks.get("upgrade_to_new_stack");
+ 
+     UpgradeContext context = createNiceMock(UpgradeContext.class);
+     expect(context.getCluster()).andReturn(cluster).atLeastOnce();
+     expect(context.getType()).andReturn(UpgradeType.ROLLING).atLeastOnce();
+     expect(context.getDirection()).andReturn(Direction.UPGRADE).atLeastOnce();
+     expect(context.getRepositoryVersion()).andReturn(repoVersion220).anyTimes();
+     expect(context.getSupportedServices()).andReturn(Sets.newHashSet("ZOOKEEPER")).atLeastOnce();
+     expect(context.getSourceRepositoryVersion(EasyMock.anyString())).andReturn(repoVersion211).atLeastOnce();
+     expect(context.getTargetRepositoryVersion(EasyMock.anyString())).andReturn(repoVersion220).atLeastOnce();
+     expect(context.getOrchestrationType()).andReturn(RepositoryType.STANDARD).anyTimes();
+     expect(context.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+     expect(context.getHostRoleCommandFactory()).andStubReturn(injector.getInstance(HostRoleCommandFactory.class));
+     expect(context.getRoleGraphFactory()).andStubReturn(injector.getInstance(RoleGraphFactory.class));
+     expect(context.getUpgradePack()).andReturn(upgradePack).atLeastOnce();
+ 
+     replayAll();
+ 
+     UpgradeHelper upgradeHelper = injector.getInstance(UpgradeHelper.class);
+     upgradeHelper.m_serviceConfigDAO = serviceConfigDAOMock;
+     upgradeHelper.m_configHelperProvider = configHelperProvider;
+     upgradeHelper.updateDesiredRepositoriesAndConfigs(context);
+ 
+     Map<String, Map<String, String>> expectedConfigurations = expectedConfigurationsCapture.getValue();
+     Map<String, String> expectedFooType = expectedConfigurations.get("foo-site");
+     Map<String, String> expectedBarType = expectedConfigurations.get("bar-site");
+     Map<String, String> expectedBazType = expectedConfigurations.get("baz-site");
+ 
+     // As the upgrade pack did not have any Flume updates, its configs should
+     // not be updated.
+     assertEquals(3, expectedConfigurations.size());
+ 
+     // the really important values are one-new and three-changed; one-new
+     // indicates that the new stack value is changed since it was not customized
+     // while three-changed represents that the customized value was preserved
+     // even though the stack value changed
+     assertEquals("one-new", expectedFooType.get("1"));
+     assertEquals("one-A", expectedFooType.get("1A"));
+     assertEquals("two", expectedBarType.get("2"));
+     assertEquals("three-changed", expectedBazType.get("3"));
+   }
+ 
+   @Test
+   public void testMergeConfigurationsWithClusterEnv() throws Exception {
+     Cluster cluster = makeCluster(true);
+ 
+     StackId oldStack = cluster.getDesiredStackVersion();
+     StackId newStack = new StackId("HDP-2.5.0");
+ 
+     ConfigFactory cf = injector.getInstance(ConfigFactory.class);
+ 
+     Config clusterEnv = cf.createNew(cluster, "cluster-env", "version1",
+         ImmutableMap.<String, String>builder().put("a", "b").build(),
+         Collections.emptyMap());
+ 
+     Config zooCfg = cf.createNew(cluster, "zoo.cfg", "version1",
+         ImmutableMap.<String, String>builder().put("c", "d").build(),
+         Collections.emptyMap());
+ 
+     cluster.addDesiredConfig("admin", Sets.newHashSet(clusterEnv, zooCfg));
+ 
+     Map<String, Map<String, String>> stackMap = new HashMap<>();
+     stackMap.put("cluster-env", new HashMap<>());
+     stackMap.put("hive-site", new HashMap<>());
+ 
+     final Map<String, String> clusterEnvMap = new HashMap<>();
+ 
+     Capture<Cluster> captureCluster = Capture.newInstance();
+     Capture<StackId> captureStackId = Capture.newInstance();
+     Capture<AmbariManagementController> captureAmc = Capture.newInstance();
+ 
+     Capture<Map<String, Map<String, String>>> cap = new Capture<Map<String, Map<String, String>>>() {
+       @Override
+       public void setValue(Map<String, Map<String, String>> value) {
+         if (value.containsKey("cluster-env")) {
+           clusterEnvMap.putAll(value.get("cluster-env"));
+         }
+       }
+     };
+ 
+     Capture<String> captureUsername = Capture.newInstance();
+     Capture<String> captureNote = Capture.newInstance();
+ 
+     EasyMock.reset(m_configHelper);
+     expect(m_configHelper.getDefaultProperties(oldStack, "HIVE")).andReturn(stackMap).atLeastOnce();
+     expect(m_configHelper.getDefaultProperties(newStack, "HIVE")).andReturn(stackMap).atLeastOnce();
+     expect(m_configHelper.getDefaultProperties(oldStack, "ZOOKEEPER")).andReturn(stackMap).atLeastOnce();
+     expect(m_configHelper.getDefaultProperties(newStack, "ZOOKEEPER")).andReturn(stackMap).atLeastOnce();
+     m_configHelper.createConfigTypes(
+         EasyMock.capture(captureCluster),
+         EasyMock.capture(captureStackId),
+         EasyMock.capture(captureAmc),
+         EasyMock.capture(cap),
+ 
+         EasyMock.capture(captureUsername),
+         EasyMock.capture(captureNote));
+     expectLastCall().atLeastOnce();
+ 
+     replay(m_configHelper);
+ 
+     RepositoryVersionEntity repoVersionEntity = helper.getOrCreateRepositoryVersion(new StackId("HDP-2.5.0"), "2.5.0-1234");
+ 
+     Map<String, Object> upgradeRequestMap = new HashMap<>();
+     upgradeRequestMap.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name());
+     upgradeRequestMap.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, repoVersionEntity.getId().toString());
+     upgradeRequestMap.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test_HDP-250");
+     upgradeRequestMap.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, Boolean.TRUE.toString());
+ 
+     UpgradeContextFactory contextFactory = injector.getInstance(UpgradeContextFactory.class);
+     UpgradeContext context = contextFactory.create(cluster, upgradeRequestMap);
+ 
+     UpgradeHelper upgradeHelper = injector.getInstance(UpgradeHelper.class);
+     upgradeHelper.updateDesiredRepositoriesAndConfigs(context);
+ 
+     assertNotNull(clusterEnvMap);
+     assertTrue(clusterEnvMap.containsKey("a"));
+ 
+     // Do stacks cleanup
+     stackManagerMock.invalidateCurrentPaths();
+     ambariMetaInfo.init();
+   }
+ 
+   @Test
+   public void testSequentialServiceChecks() throws Exception {
+     Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1");
+     assertTrue(upgrades.containsKey("upgrade_test_checks"));
+     UpgradePack upgrade = upgrades.get("upgrade_test_checks");
+     assertNotNull(upgrade);
+ 
+     Cluster cluster = makeCluster();
+     cluster.deleteService("HDFS");
+     cluster.deleteService("YARN");
+ 
+     UpgradeContext context = getMockUpgradeContext(cluster, Direction.UPGRADE,
+         UpgradeType.ROLLING, repositoryVersion2110);
+ 
+     List<UpgradeGroupHolder> groups = m_upgradeHelper.createSequence(upgrade, context);
+     assertEquals(5, groups.size());
+ 
+     UpgradeGroupHolder serviceCheckGroup = groups.get(2);
+     assertEquals(ServiceCheckGrouping.class, serviceCheckGroup.groupClass);
+     assertEquals(3, serviceCheckGroup.items.size());
+ 
+     StageWrapper wrapper = serviceCheckGroup.items.get(0);
+     assertEquals(ServiceCheckGrouping.ServiceCheckStageWrapper.class, wrapper.getClass());
+     assertTrue(wrapper.getText().contains("ZooKeeper"));
+ 
+     // Do stacks cleanup
+     stackManagerMock.invalidateCurrentPaths();
+     ambariMetaInfo.init();
+   }
+ 
+   @Test
 -  public void testSequentialServiceChecksWithServiceCheckFailure() throws Exception {
 -    Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1");
 -    assertTrue(upgrades.containsKey("upgrade_test_checks"));
 -    UpgradePack upgrade = upgrades.get("upgrade_test_checks");
 -    assertNotNull(upgrade);
 -
 -    // !!! fake skippable so we don't affect other tests
 -    for (Grouping g : upgrade.getAllGroups()) {
 -      if (g.name.equals("SERVICE_CHECK_1") || g.name.equals("SERVICE_CHECK_2")) {
 -        g.skippable = true;
 -      }
 -    }
 -
 -    Cluster cluster = makeCluster();
 -    cluster.deleteService("HDFS");
 -    cluster.deleteService("YARN");
 -
 -    UpgradeContext context = getMockUpgradeContext(cluster, Direction.UPGRADE, UpgradeType.ROLLING, repositoryVersion2110,
 -        RepositoryType.STANDARD, cluster.getServices().keySet(), m_masterHostResolver, false);
 -    expect(context.isServiceCheckFailureAutoSkipped()).andReturn(Boolean.TRUE).atLeastOnce();
 -
 -    replay(context);
 -
 -    List<UpgradeGroupHolder> groups = m_upgradeHelper.createSequence(upgrade, context);
 -    assertEquals(5, groups.size());
 -
 -    UpgradeGroupHolder serviceCheckGroup = groups.get(2);
 -    assertEquals(ServiceCheckGrouping.class, serviceCheckGroup.groupClass);
 -    assertEquals(4, serviceCheckGroup.items.size());
 -
 -    StageWrapper wrapper = serviceCheckGroup.items.get(0);
 -    assertEquals(ServiceCheckGrouping.ServiceCheckStageWrapper.class, wrapper.getClass());
 -    assertTrue(wrapper.getText().contains("ZooKeeper"));
 -
 -    wrapper = serviceCheckGroup.items.get(serviceCheckGroup.items.size()-1);
 -    assertTrue(wrapper.getText().equals("Verifying Skipped Failures"));
 -
 -    // Do stacks cleanup
 -    stackManagerMock.invalidateCurrentPaths();
 -    ambariMetaInfo.init();
 -  }
 -
 -
 -  @Test
+   public void testPrematureServiceChecks() throws Exception {
+     Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1");
+     assertTrue(upgrades.containsKey("upgrade_test_checks"));
+     UpgradePack upgrade = upgrades.get("upgrade_test_checks");
+     assertNotNull(upgrade);
+ 
+     Cluster cluster = makeCluster();
+     cluster.deleteService("HDFS");
+     cluster.deleteService("YARN");
+     cluster.deleteService("ZOOKEEPER");
+ 
+     UpgradeContext context = getMockUpgradeContext(cluster, Direction.UPGRADE,
+         UpgradeType.ROLLING, repositoryVersion2110);
+ 
+     List<UpgradeGroupHolder> groups = m_upgradeHelper.createSequence(upgrade, context);
+ 
+     assertEquals(3, groups.size());
+ 
+     for (UpgradeGroupHolder holder : groups) {
+       assertFalse(ServiceCheckGrouping.class.equals(holder.groupClass));
+     }
+ 
+     // Do stacks cleanup
+     stackManagerMock.invalidateCurrentPaths();
+     ambariMetaInfo.init();
+   }
+ 
+ 
+   /**
+    * @param cluster
+    * @param direction
+    * @param type
+    * @return
+    */
+   private UpgradeContext getMockUpgradeContext(Cluster cluster, Direction direction, UpgradeType type){
+     return getMockUpgradeContext(cluster, direction, type, repositoryVersion2210);
+   }
+ 
+   /**
+    * @param cluster
+    * @param direction
+    * @param type
+    * @return
+    */
+   private UpgradeContext getMockUpgradeContext(Cluster cluster, Direction direction,
+       UpgradeType type, RepositoryVersionEntity repositoryVersion) {
+     Set<String> allServices = cluster.getServices().keySet();
+     return getMockUpgradeContext(cluster, direction, type, repositoryVersion,
+         RepositoryType.STANDARD, allServices);
+   }
+ 
+   /**
+    * @param cluster
+    * @param direction
+    * @param type
+    * @return
+    */
+   private UpgradeContext getMockUpgradeContext(Cluster cluster, Direction direction,
+       UpgradeType type, RepositoryVersionEntity repositoryVersion, RepositoryType repositoryType,
+       Set<String> services) {
+     return getMockUpgradeContext(cluster, direction, type, repositoryVersion,
+         repositoryType, services, m_masterHostResolver, true);
+   }
+ 
+   /**
+    * @param cluster
+    * @param direction
+    * @param type
+    * @return
+    */
+   private UpgradeContext getMockUpgradeContextNoReplay(Cluster cluster, Direction direction,
+       UpgradeType type, RepositoryVersionEntity repositoryVersion) {
+     Set<String> allServices = cluster.getServices().keySet();
+ 
+     return getMockUpgradeContext(cluster, direction, type, repositoryVersion,
+         RepositoryType.STANDARD, allServices, null, false);
+   }
+ 
+   /**
+    * @param cluster
+    * @param direction
+    * @param type
+    * @param repositoryType
+    * @param services
+    * @return
+    */
+   private UpgradeContext getMockUpgradeContext(Cluster cluster, Direction direction,
+       UpgradeType type, RepositoryVersionEntity repositoryVersion, final RepositoryType repositoryType,
+       Set<String> services, MasterHostResolver resolver, boolean replay) {
+     UpgradeContext context = EasyMock.createNiceMock(UpgradeContext.class);
+     expect(context.getCluster()).andReturn(cluster).anyTimes();
+     expect(context.getType()).andReturn(type).anyTimes();
+     expect(context.getDirection()).andReturn(direction).anyTimes();
+     expect(context.getRepositoryVersion()).andReturn(repositoryVersion).anyTimes();
+     expect(context.getSupportedServices()).andReturn(services).anyTimes();
+     expect(context.getOrchestrationType()).andReturn(repositoryType).anyTimes();
+     expect(context.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+     expect(context.getHostRoleCommandFactory()).andStubReturn(
+         injector.getInstance(HostRoleCommandFactory.class));
+     expect(context.getRoleGraphFactory()).andStubReturn(
+         injector.getInstance(RoleGraphFactory.class));
+ 
+     // only set this if supplied
+     if (null != resolver) {
+       expect(context.getResolver()).andReturn(resolver).anyTimes();
+     }
+ 
+     final Map<String, RepositoryVersionEntity> targetRepositoryVersions = new HashMap<>();
+     for( String serviceName : services ){
+       targetRepositoryVersions.put(serviceName, repositoryVersion);
+     }
+ 
+     final Capture<String> repoVersionServiceName = EasyMock.newCapture();
+     expect(
+         context.getTargetRepositoryVersion(EasyMock.capture(repoVersionServiceName))).andAnswer(
+             new IAnswer<RepositoryVersionEntity>() {
+               @Override
+               public RepositoryVersionEntity answer() {
+                 return targetRepositoryVersions.get(repoVersionServiceName.getValue());
+               }
+             }).anyTimes();
+ 
+     final Capture<String> serviceNameSupported = EasyMock.newCapture();
+     expect(context.isServiceSupported(EasyMock.capture(serviceNameSupported))).andAnswer(
+         new IAnswer<Boolean>() {
+           @Override
+           public Boolean answer() {
+             return targetRepositoryVersions.containsKey(serviceNameSupported.getValue());
+           }
+         }).anyTimes();
+ 
+ 
+     final Map<String, String> serviceNames = new HashMap<>();
+     final Capture<String> serviceDisplayNameArg1 = EasyMock.newCapture();
+     final Capture<String> serviceDisplayNameArg2 = EasyMock.newCapture();
+ 
+     context.setServiceDisplay(EasyMock.capture(serviceDisplayNameArg1), EasyMock.capture(serviceDisplayNameArg2));
+     expectLastCall().andAnswer(
+         new IAnswer<Object>() {
+           @Override
+           public Object answer() {
+             serviceNames.put(serviceDisplayNameArg1.getValue(), serviceDisplayNameArg2.getValue());
+             return null;
+           }
+         }).anyTimes();
+ 
+ 
+     final Map<String, String> componentNames = new HashMap<>();
+     final Capture<String> componentDisplayNameArg1 = EasyMock.newCapture();
+     final Capture<String> componentDisplayNameArg2 = EasyMock.newCapture();
+     final Capture<String> componentDisplayNameArg3 = EasyMock.newCapture();
+ 
+     context.setComponentDisplay(EasyMock.capture(componentDisplayNameArg1),
+         EasyMock.capture(componentDisplayNameArg2), EasyMock.capture(componentDisplayNameArg3));
+ 
+     expectLastCall().andAnswer(new IAnswer<Object>() {
+       @Override
+       public Object answer() {
+         componentNames.put(
+             componentDisplayNameArg1.getValue() + ":" + componentDisplayNameArg2.getValue(),
+             componentDisplayNameArg3.getValue());
+         return null;
+       }
+     }).anyTimes();
+ 
+     final Capture<String> getServiceDisplayArgument1 = EasyMock.newCapture();
+     expect(
+         context.getServiceDisplay(EasyMock.capture(getServiceDisplayArgument1))).andAnswer(
+             new IAnswer<String>() {
+               @Override
+               public String answer() {
+                 return serviceNames.get(getServiceDisplayArgument1.getValue());
+               }
+             }).anyTimes();
+ 
+     final Capture<String> getComponentDisplayArgument1 = EasyMock.newCapture();
+     final Capture<String> getComponentDisplayArgument2 = EasyMock.newCapture();
+     expect(context.getComponentDisplay(EasyMock.capture(getComponentDisplayArgument1),
+         EasyMock.capture(getComponentDisplayArgument2))).andAnswer(new IAnswer<String>() {
+           @Override
+           public String answer() {
+             return componentNames.get(getComponentDisplayArgument1.getValue() + ":"
+                 + getComponentDisplayArgument2.getValue());
+           }
+         }).anyTimes();
+ 
+     final Capture<UpgradeScope> isScopedCapture = EasyMock.newCapture();
+     expect(context.isScoped(EasyMock.capture(isScopedCapture))).andStubAnswer(
+         new IAnswer<Boolean>() {
+           @Override
+           public Boolean answer() throws Throwable {
+             UpgradeScope scope = isScopedCapture.getValue();
+             if (scope == UpgradeScope.ANY) {
+               return true;
+             }
+ 
+             if (scope == UpgradeScope.PARTIAL) {
+               return repositoryType != RepositoryType.STANDARD;
+             }
+ 
+             return repositoryType == RepositoryType.STANDARD;
+           }
+         });
+ 
+     if (replay) {
+       replay(context);
+     }
+ 
+     return context;
+   }
+ 
+   /**
     * Extend {@link org.apache.ambari.server.stack.MasterHostResolver} in order
     * to overwrite the JMX methods.
     */

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/alerts/AlertDefinitionHashTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/alerts/AlertEventPublisherTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/alerts/AlertReceivedListenerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/AlertDataManagerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
index 3836d6b,1d8c7fb..5a977b8
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
@@@ -38,9 -38,10 +38,11 @@@ import org.apache.ambari.server.AmbariE
  import org.apache.ambari.server.H2DatabaseCleaner;
  import org.apache.ambari.server.HostNotFoundException;
  import org.apache.ambari.server.controller.AmbariSessionManager;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
  import org.apache.ambari.server.orm.GuiceJpaInitializer;
  import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+ import org.apache.ambari.server.orm.OrmTestHelper;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
  import org.apache.ambari.server.state.Cluster;
  import org.apache.ambari.server.state.Clusters;
  import org.apache.ambari.server.state.Host;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosDescriptorTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosDescriptorUpdateHelperTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
index 064e1cc,400116d..e4d3c90
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosServiceDescriptorTest.java
@@@ -37,11 -37,12 +37,12 @@@ import com.google.gson.Gson
  
  import junit.framework.Assert;
  
 -@Category({category.KerberosTest.class})
 +@Category({ category.KerberosTest.class})
  public class KerberosServiceDescriptorTest {
 -  static final String JSON_VALUE =
 +  public static final String JSON_VALUE =
        "{" +
            "  \"name\": \"SERVICE_NAME\"," +
+           "  \"preconfigure\": \"true\"," +
            "  \"identities\": [" +
            KerberosIdentityDescriptorTest.JSON_VALUE +
            "]," +

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/VariableReplacementHelperTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/VariableReplacementHelperTest.java
index f00f694,e46294a..b797275
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/VariableReplacementHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/VariableReplacementHelperTest.java
@@@ -224,9 -225,24 +225,24 @@@ public class VariableReplacementHelperT
        // Ignore this is expected.
      }
  
-     Assert.assertEquals("test=unit.test", helper.replaceVariables("test=${realm|toLower()}", configurations));
-   
-     Assert.assertEquals("PLAINTEXTSASL://localhost:6667", helper.replaceVariables("${kafka-broker/listeners|replace(\\bPLAINTEXT\\b,PLAINTEXTSASL)}", configurations)); 
+     assertEquals("test=unit.test", helper.replaceVariables("test=${realm|toLower()}", configurations));
+ 
+     assertEquals("PLAINTEXTSASL://localhost:6667", helper.replaceVariables("${kafka-broker/listeners|replace(\\bPLAINTEXT\\b,PLAINTEXTSASL)}", configurations));
    }
  
+   @Test
+   public void testReplacePrincipalWithPrimary() throws AmbariException {
+     Map<String, Map<String, String>> config = new HashMap<String, Map<String, String>>() {
+       {
+         put("principals", new HashMap<String, String>() {{
+           put("resource_manager_rm", "rm/HOST@EXAMPLE.COM");
+           put("hive_server_hive", "hive@EXAMPLE.COM");
+           put("hdfs", "hdfs");
+         }});
+       }
+     };
+     assertEquals("hdfs", helper.replaceVariables("${principals/hdfs|principalPrimary()}", config));
+     assertEquals("rm", helper.replaceVariables("${principals/resource_manager_rm|principalPrimary()}", config));
+     assertEquals("hive", helper.replaceVariables("${principals/hive_server_hive|principalPrimary()}", config));
+   }
 -}
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/testing/DBInconsistencyTests.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
index 6bcd6bc,0daa20f..c3248a3
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
@@@ -389,11 -391,10 +391,10 @@@ public class ClusterDeployWithStartOnly
      ambariContext.persistInstallStateForUI(CLUSTER_NAME, STACK_NAME, STACK_VERSION);
      expectLastCall().once();
  
 -    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(1);
 +    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(2);
  
      persistedTopologyRequest = new PersistedTopologyRequest(1, request);
-     expect(persistedState.getAllRequests()).andReturn(Collections.<ClusterTopology,
-       List<LogicalRequest>>emptyMap()).once();
+     expect(persistedState.getAllRequests()).andReturn(Collections.emptyMap()).once();
      expect(persistedState.persistTopologyRequest(request)).andReturn(persistedTopologyRequest).once();
      persistedState.persistLogicalRequest((LogicalRequest) anyObject(), anyLong());
      expectLastCall().once();

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
index 0631b03,bbf4fdb..372d0a1
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
@@@ -366,11 -368,10 +368,10 @@@ public class ClusterInstallWithoutStart
      ambariContext.persistInstallStateForUI(CLUSTER_NAME, STACK_NAME, STACK_VERSION);
      expectLastCall().once();
  
 -    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(1);
 +    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(2);
  
      persistedTopologyRequest = new PersistedTopologyRequest(1, request);
-     expect(persistedState.getAllRequests()).andReturn(Collections.<ClusterTopology,
-       List<LogicalRequest>>emptyMap()).once();
+     expect(persistedState.getAllRequests()).andReturn(Collections.emptyMap()).once();
      expect(persistedState.persistTopologyRequest(request)).andReturn(persistedTopologyRequest).once();
      persistedState.persistLogicalRequest((LogicalRequest) anyObject(), anyLong());
      expectLastCall().once();

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
index c074d78,059a8be..9620507
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
@@@ -361,11 -363,10 +363,10 @@@ public class ClusterInstallWithoutStart
      ambariContext.persistInstallStateForUI(CLUSTER_NAME, STACK_NAME, STACK_VERSION);
      expectLastCall().once();
  
 -    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(1);
 +    expect(executor.submit(anyObject(AsyncCallableService.class))).andReturn(mockFuture).times(2);
  
      persistedTopologyRequest = new PersistedTopologyRequest(1, request);
-     expect(persistedState.getAllRequests()).andReturn(Collections.<ClusterTopology,
-       List<LogicalRequest>>emptyMap()).once();
+     expect(persistedState.getAllRequests()).andReturn(Collections.emptyMap()).once();
      expect(persistedState.persistTopologyRequest(request)).andReturn(persistedTopologyRequest).once();
      persistedState.persistLogicalRequest((LogicalRequest) anyObject(), anyLong());
      expectLastCall().once();

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
index e9198fb,b2dac8f..feefcab
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigureClusterTaskTest.java
@@@ -73,8 -81,11 +73,8 @@@ public class ConfigureClusterTaskTest 
        Exception {
      // GIVEN
      // is it OK to handle the non existence of hostgroups as a success?!
-     expect(clusterConfigurationRequest.getRequiredHostGroups()).andReturn(Collections.<String>emptyList());
-     expect(clusterTopology.getHostGroupInfo()).andReturn(Collections.<String, HostGroupInfo>emptyMap());
+     expect(clusterConfigurationRequest.getRequiredHostGroups()).andReturn(Collections.emptyList());
+     expect(clusterTopology.getHostGroupInfo()).andReturn(Collections.emptyMap());
 -    expect(clusterTopology.getClusterId()).andReturn(1L).anyTimes();
 -    expect(clusterTopology.getAmbariContext()).andReturn(ambariContext);
 -    expect(ambariContext.getClusterName(1L)).andReturn("testCluster");
  
      // this is only called if the "prerequisites" are satisfied
      clusterConfigurationRequest.process();

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
index 95db56f,ac643d7..45c8b1a
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
@@@ -283,9 -285,7 +284,8 @@@ public class TopologyManagerTest 
      expect(request.getDescription()).andReturn("Provision Cluster Test").anyTimes();
      expect(request.getConfiguration()).andReturn(topoConfiguration).anyTimes();
      expect(request.getHostGroupInfo()).andReturn(groupInfoMap).anyTimes();
- 
++    expect(request.getRepositoryVersion()).andReturn("1").anyTimes();
      expect(request.getConfigRecommendationStrategy()).andReturn(ConfigRecommendationStrategy.NEVER_APPLY).anyTimes();
- 
      expect(request.getSecurityConfiguration()).andReturn(null).anyTimes();
  
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog251Test.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog251Test.java
index 4575998,3978f95..823b0fd
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog251Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog251Test.java
@@@ -163,4 -175,94 +175,94 @@@ public class UpgradeCatalog251Test 
      Assert.assertEquals(Integer.valueOf(0), captured.getDefaultValue());
      Assert.assertEquals(Short.class, captured.getType());
    }
+ 
+   @Test
+   public void testExecuteDMLUpdates() throws Exception {
+     Method addNewConfigurationsFromXml = AbstractUpgradeCatalog.class.getDeclaredMethod("addNewConfigurationsFromXml");
+     Method updateKAFKAConfigs = UpgradeCatalog251.class.getDeclaredMethod("updateKAFKAConfigs");
+     Method updateSTORMConfigs = UpgradeCatalog251.class.getDeclaredMethod("updateSTORMConfigs");
+ 
+     UpgradeCatalog251 upgradeCatalog251 = createMockBuilder(UpgradeCatalog251.class)
+             .addMockedMethod(addNewConfigurationsFromXml)
+             .addMockedMethod(updateKAFKAConfigs)
+             .addMockedMethod(updateSTORMConfigs)
+             .createMock();
+ 
+     upgradeCatalog251.addNewConfigurationsFromXml();
+     expectLastCall().once();
+ 
+     Field field = AbstractUpgradeCatalog.class.getDeclaredField("dbAccessor");
+     field.set(upgradeCatalog251, dbAccessor);
+ 
+     upgradeCatalog251.updateKAFKAConfigs();
+     expectLastCall().once();
 -    
++
+     upgradeCatalog251.updateSTORMConfigs();
+     expectLastCall().once();
+ 
+     replay(upgradeCatalog251, dbAccessor);
+ 
+     upgradeCatalog251.executeDMLUpdates();
+ 
+     verify(upgradeCatalog251, dbAccessor);
+   }
+ 
+ 
+   @Test
+   public void testUpdateKAFKAConfigs() throws Exception{
+     EasyMockSupport easyMockSupport = new EasyMockSupport();
+     final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class);
+     final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class);
+     final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class);
+ 
+     Map<String, String> initialProperties = Collections.singletonMap("listeners", "PLAINTEXT://localhost:6667,SSL://localhost:6666");
+     Map<String, String> expectedUpdates = Collections.singletonMap("listeners", "PLAINTEXTSASL://localhost:6667,SSL://localhost:6666");
+ 
+     final Config kafkaBroker = easyMockSupport.createNiceMock(Config.class);
+     expect(kafkaBroker.getProperties()).andReturn(initialProperties).times(1);
+     // Re-entrant test
+     expect(kafkaBroker.getProperties()).andReturn(expectedUpdates).times(1);
+ 
+     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
+       @Override
+       protected void configure() {
+         bind(AmbariManagementController.class).toInstance(mockAmbariManagementController);
+         bind(Clusters.class).toInstance(mockClusters);
+         bind(EntityManager.class).toInstance(entityManager);
+         bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
+         bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
+         bind(PasswordEncoder.class).toInstance(createNiceMock(PasswordEncoder.class));
+       }
+     });
+ 
+     expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).atLeastOnce();
+     expect(mockClusters.getClusters()).andReturn(Collections.singletonMap("normal", mockClusterExpected)).atLeastOnce();
+     expect(mockClusterExpected.getDesiredConfigByType("kafka-broker")).andReturn(kafkaBroker).atLeastOnce();
+     expect(mockClusterExpected.getSecurityType()).andReturn(SecurityType.KERBEROS).atLeastOnce();
+     expect(mockClusterExpected.getServices()).andReturn(Collections.singletonMap("KAFKA", null)).atLeastOnce();
+ 
+     UpgradeCatalog251 upgradeCatalog251 = createMockBuilder(UpgradeCatalog251.class)
+         .withConstructor(Injector.class)
+         .withArgs(mockInjector)
+         .addMockedMethod("updateConfigurationProperties", String.class,
+             Map.class, boolean.class, boolean.class)
+         .createMock();
+ 
+ 
+     // upgradeCatalog251.updateConfigurationProperties is only expected to execute once since no changes are
+     // expected when the relevant data have been previously changed
+     upgradeCatalog251.updateConfigurationProperties("kafka-broker", expectedUpdates, true, false);
+     expectLastCall().once();
+ 
+     easyMockSupport.replayAll();
+     replay(upgradeCatalog251);
+ 
+     // Execute the first time... upgrading to Ambari 2.4.0
+     upgradeCatalog251.updateKAFKAConfigs();
+ 
+     // Test reentry... upgrading from Ambari 2.4.0
+     upgradeCatalog251.updateKAFKAConfigs();
+ 
+     easyMockSupport.verifyAll();
+   }
  }


[06/50] [abbrv] ambari git commit: AMBARI-22039. File "hdfs.headless.keytab" has incorrect permission (aonishuk)

Posted by ao...@apache.org.
AMBARI-22039. File "hdfs.headless.keytab" has incorrect permission  (aonishuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/50b64758
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/50b64758
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/50b64758

Branch: refs/heads/branch-3.0-perf
Commit: 50b64758091a0df76419cbced4044e2689b5d4d1
Parents: 5d5cc4f
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Mon Sep 25 12:27:24 2017 +0300
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Mon Sep 25 12:27:24 2017 +0300

----------------------------------------------------------------------
 .../stacks/2.6/ZEPPELIN/test_zeppelin_070.py      | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/50b64758/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py b/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
index b9b34e8..f379f40 100644
--- a/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
+++ b/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
@@ -312,7 +312,8 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="zeppelin",
+                              user="hdfs",
+                              owner="zeppelin",
                               group="zeppelin",
                               type='file',
                               action=['download_on_execute'],
@@ -336,7 +337,8 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="zeppelin",
+                              user="hdfs",
+                              owner="zeppelin",
                               group="zeppelin",
                               type='file',
                               action=['create_on_execute'],
@@ -355,7 +357,8 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="zeppelin",
+                              user="hdfs",
+                              owner="zeppelin",
                               group="zeppelin",
                               type='file',
                               action=['download_on_execute'],
@@ -379,7 +382,8 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="zeppelin",
+                              user="hdfs",
+                              owner="zeppelin",
                               group="zeppelin",
                               type='file',
                               action=['create_on_execute'],
@@ -398,7 +402,8 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="zeppelin",
+                              user="hdfs",
+                              owner="zeppelin",
                               group="zeppelin",
                               type='file',
                               action=['download_on_execute'],
@@ -422,7 +427,8 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="zeppelin",
+                              user="hdfs",
+                              owner="zeppelin",
                               group="zeppelin",
                               type='file',
                               action=['create_on_execute'],


[13/50] [abbrv] ambari git commit: AMBARI-22026. Restart of all components on host operation failed with 500 status code. (mpapirkovskyy)

Posted by ao...@apache.org.
AMBARI-22026. Restart of all components on host operation failed with 500 status code. (mpapirkovskyy)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/0393451c
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/0393451c
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/0393451c

Branch: refs/heads/branch-3.0-perf
Commit: 0393451c43fe06b7cac72afebd2109d9298197a8
Parents: 999daef
Author: Myroslav Papirkovskyi <mp...@hortonworks.com>
Authored: Mon Sep 25 19:08:49 2017 +0300
Committer: Myroslav Papirkovskyi <mp...@hortonworks.com>
Committed: Mon Sep 25 19:10:24 2017 +0300

----------------------------------------------------------------------
 .../AmbariCustomCommandExecutionHelper.java         | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/0393451c/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index 38a02ef..d0dd7e0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -1524,14 +1524,18 @@ public class AmbariCustomCommandExecutionHelper {
     if (actionName.equals(START_COMMAND_NAME) || actionName.equals(RESTART_COMMAND_NAME)) {
       Cluster cluster = clusters.getCluster(clusterName);
       StackId stackId = null;
-      try {
-        Service service = cluster.getService(serviceName);
-        stackId = service.getDesiredStackId();
-      } catch (AmbariException e) {
-        LOG.debug("Could not load service {}, skipping topology check", serviceName);
-        stackId = cluster.getDesiredStackVersion();
+      if (serviceName != null) {
+        try {
+          Service service = cluster.getService(serviceName);
+          stackId = service.getDesiredStackId();
+        } catch (AmbariException e) {
+          LOG.debug("Could not load service {}, skipping topology check", serviceName);
+        }
       }
 
+      if (stackId == null) {
+        stackId = cluster.getDesiredStackVersion();
+      }
 
       AmbariMetaInfo ambariMetaInfo = managementController.getAmbariMetaInfo();
 


[27/50] [abbrv] ambari git commit: AMBARI-22052.Zeppelin's conf HDFS directory owner is wrong(Prabhjyot Singh via Venkata Sairam)

Posted by ao...@apache.org.
AMBARI-22052.Zeppelin's conf HDFS directory owner is wrong(Prabhjyot Singh via Venkata Sairam)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6a99bd8b
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6a99bd8b
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6a99bd8b

Branch: refs/heads/branch-3.0-perf
Commit: 6a99bd8b9723b806c6b099fc3c6836bf96f66a43
Parents: ee618e1
Author: Venkata Sairam <ve...@gmail.com>
Authored: Tue Sep 26 16:05:03 2017 +0530
Committer: Venkata Sairam <ve...@gmail.com>
Committed: Tue Sep 26 16:05:03 2017 +0530

----------------------------------------------------------------------
 .../common-services/ZEPPELIN/0.7.0/package/scripts/master.py   | 1 +
 .../src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py   | 6 +++---
 2 files changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6a99bd8b/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py b/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
index 382566e..8bdfaec 100644
--- a/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
+++ b/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
@@ -358,6 +358,7 @@ class Master(Script):
                             source=interpreter_config,
                             group=params.zeppelin_group,
                             owner=params.zeppelin_user,
+                            user=params.zeppelin_user,
                             replace_existing_files=True)
 
   def update_kerberos_properties(self):

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a99bd8b/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py b/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
index f379f40..1fdbadb 100644
--- a/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
+++ b/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py
@@ -337,7 +337,7 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="hdfs",
+                              user="zeppelin",
                               owner="zeppelin",
                               group="zeppelin",
                               type='file',
@@ -382,7 +382,7 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="hdfs",
+                              user="zeppelin",
                               owner="zeppelin",
                               group="zeppelin",
                               type='file',
@@ -427,7 +427,7 @@ class TestZeppelin070(RMFTestCase):
                               hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore',
                               hdfs_site={u'a': u'b'},
                               kinit_path_local='/usr/bin/kinit',
-                              user="hdfs",
+                              user="zeppelin",
                               owner="zeppelin",
                               group="zeppelin",
                               type='file',


[32/50] [abbrv] ambari git commit: AMBARI-22060. Fail to restart Ranger Admin during HDP downgrade. (dlysnichenko)

Posted by ao...@apache.org.
AMBARI-22060. Fail to restart Ranger Admin during HDP downgrade. (dlysnichenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1a90a522
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1a90a522
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1a90a522

Branch: refs/heads/branch-3.0-perf
Commit: 1a90a5221f0af01160d1d3fe5986d4e76977fb7d
Parents: 439a9ad
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Tue Sep 26 18:59:50 2017 +0300
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Tue Sep 26 19:00:33 2017 +0300

----------------------------------------------------------------------
 .../server/serveraction/upgrades/FinalizeUpgradeAction.java     | 5 +++++
 .../org/apache/ambari/server/state/cluster/ClusterImpl.java     | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1a90a522/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
index 5ec0692..451f802 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
@@ -202,6 +202,11 @@ public class FinalizeUpgradeAction extends AbstractUpgradeServerAction {
       // longer used
       finalizeHostRepositoryVersions(cluster);
 
+      if (upgradeContext.getOrchestrationType() == RepositoryType.STANDARD) {
+        outSB.append(String.format("Finalizing the version for cluster %s.\n", cluster.getClusterName()));
+        cluster.setCurrentStackVersion(cluster.getDesiredStackVersion());
+      }
+
       // mark revertable
       if (repositoryType.isRevertable() && direction == Direction.UPGRADE) {
         UpgradeEntity upgrade = cluster.getUpgradeInProgress();

http://git-wip-us.apache.org/repos/asf/ambari/blob/1a90a522/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 8f1a882..9c0b0ca 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -2415,7 +2415,7 @@ public class ClusterImpl implements Cluster {
       // since the entities which were modified came from the cluster entity's
       // list to begin with, we can just save them right back - no need for a
       // new collection since the entity instances were modified directly
-      clusterEntity = clusterDAO.merge(clusterEntity);
+      clusterEntity = clusterDAO.merge(clusterEntity, true);
 
       cacheConfigurations();
 


[49/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/LICENSE.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/conf/unix/install-helper.sh
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
----------------------------------------------------------------------
diff --cc ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
index 231cdd1,55c3d6e..ac78a5d
--- a/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
+++ b/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
@@@ -244,12 -271,28 +244,19 @@@ class AlertSchedulerHandler()
      :return:
      """
      definitions = []
 -
 -    alerts_definitions_path = os.path.join(self.cachedir, self.FILENAME)
 -    try:
 -      with open(alerts_definitions_path) as fp:
 -        all_commands = json.load(fp)
 -    except:
 -      logger.warning('[AlertScheduler] {0} not found or invalid. No alerts will be scheduled until registration occurs.'.format(alerts_definitions_path))
 -      return definitions
 -
 -    for command_json in all_commands:
 +    for cluster_id, command_json in self.alert_definitions_cache.iteritems():
        clusterName = '' if not 'clusterName' in command_json else command_json['clusterName']
        hostName = '' if not 'hostName' in command_json else command_json['hostName']
+       publicHostName = '' if not 'publicHostName' in command_json else command_json['publicHostName']
+       clusterHash = None if not 'hash' in command_json else command_json['hash']
+ 
+       # cache the cluster and cluster hash after loading the JSON
+       if clusterName != '' and clusterHash is not None:
+         logger.info('[AlertScheduler] Caching cluster {0} with alert hash {1}'.format(clusterName, clusterHash))
+         self._cluster_hashes[clusterName] = clusterHash
  
        for definition in command_json['alertDefinitions']:
-         alert = self.__json_to_callable(clusterName, hostName, Utils.get_mutable_copy(definition))
 -        alert = self.__json_to_callable(clusterName, hostName, publicHostName, definition)
++        alert = self.__json_to_callable(clusterName, hostName, publicHostName, Utils.get_mutable_copy(definition))
  
          if alert is None:
            continue
@@@ -294,7 -337,7 +301,7 @@@
          alert = RecoveryAlert(json_definition, source, self.config, self.recovery_manger)
  
        if alert is not None:
-         alert.set_cluster(clusterName, json_definition['clusterId'], hostName)
 -        alert.set_cluster(clusterName, hostName, publicHostName)
++        alert.set_cluster(clusterName, json_definition['clusterId'], hostName, publicHostName)
  
      except Exception, exception:
        logger.exception("[AlertScheduler] Unable to load an invalid alert definition. It will be skipped.")

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
----------------------------------------------------------------------
diff --cc ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
index 604939b,95e4712..e784bea
--- a/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
+++ b/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
@@@ -25,8 -25,9 +25,9 @@@ import hostnam
  import ambari_simplejson as json
  import os
  
 -from ambari_commons import OSConst
 +from ambari_agent.FileCache import FileCache
  from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
+ 
  logger = logging.getLogger(__name__)
  
  content = """

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/Controller.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py
----------------------------------------------------------------------
diff --cc ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py
index aa03bc9,7dd00de..9f3e9a2
--- a/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py
+++ b/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py
@@@ -77,16 -78,13 +77,17 @@@ class CustomServiceOrchestrator()
    # Property name for credential store class path
    CREDENTIAL_STORE_CLASS_PATH_NAME = 'credentialStoreClassPath'
  
 -  def __init__(self, config, controller):
 -    self.config = config
 -    self.tmp_dir = config.get('agent', 'prefix')
 -    self.force_https_protocol = config.get_force_https_protocol_name()
 +  def __init__(self, initializer_module):
 +    self.metadata_cache = initializer_module.metadata_cache
 +    self.topology_cache = initializer_module.topology_cache
 +    self.configurations_cache = initializer_module.configurations_cache
 +    self.host_level_params_cache = initializer_module.host_level_params_cache
 +    self.config = initializer_module.config
 +    self.tmp_dir = self.config.get('agent', 'prefix')
 +    self.force_https_protocol = self.config.get_force_https_protocol()
+     self.ca_cert_file_path = config.get_ca_cert_file_path()
      self.exec_tmp_dir = Constants.AGENT_TMP_DIR
 -    self.file_cache = FileCache(config)
 +    self.file_cache = initializer_module.file_cache
      self.status_commands_stdout = os.path.join(self.tmp_dir,
                                                 'status_command_stdout.txt')
      self.status_commands_stderr = os.path.join(self.tmp_dir,
@@@ -394,11 -396,11 +395,11 @@@
        for py_file, current_base_dir in filtered_py_file_list:
          log_info_on_failure = not command_name in self.DONT_DEBUG_FAILURES_FOR_COMMANDS
          script_params = [command_name, json_path, current_base_dir, tmpstrucoutfile, logger_level, self.exec_tmp_dir,
-                          self.force_https_protocol]
- 
+                          self.force_https_protocol, self.ca_cert_file_path]
+         
          if log_out_files:
            script_params.append("-o")
 -        
 +
          ret = python_executor.run_file(py_file, script_params,
                                 tmpoutfile, tmperrfile, timeout,
                                 tmpstrucoutfile, self.map_task_to_process,

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/HostInfo.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/NetUtil.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
----------------------------------------------------------------------
diff --cc ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
index e364447,05f8023..186655b
--- a/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
+++ b/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
@@@ -45,8 -45,8 +45,9 @@@ class BaseAlert(object)
      self.alert_meta = alert_meta
      self.alert_source_meta = alert_source_meta
      self.cluster_name = ''
 +    self.cluster_id = None
      self.host_name = ''
+     self.public_host_name = ''
      self.config = config
      
    def interval(self):
@@@ -84,14 -84,16 +85,17 @@@
      sets helper objects for alerts without having to use them in a constructor
      """
      self.collector = collector
 -    self.cluster_configuration = cluster_configuration
 +    self.cluster_configuration_cache = cluster_configuration_cache
  
  
-   def set_cluster(self, cluster_name, cluster_id, host_name):
 -  def set_cluster(self, cluster_name, host_name, public_host_name = None):
++  def set_cluster(self, cluster_name, cluster_id, host_name, public_host_name = None):
      """ sets cluster information for the alert """
      self.cluster_name = cluster_name
 +    self.cluster_id = cluster_id
      self.host_name = host_name
+     self.public_host_name = host_name
+     if public_host_name:
+       self.public_host_name = public_host_name
  
  
    def _get_alert_meta_value_safely(self, meta_key):

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/packages/tarball/all.xml
----------------------------------------------------------------------
diff --cc ambari-agent/src/packages/tarball/all.xml
index c830dd1,b0c2f1c..2ff57cd
--- a/ambari-agent/src/packages/tarball/all.xml
+++ b/ambari-agent/src/packages/tarball/all.xml
@@@ -67,18 -71,9 +71,21 @@@
      </fileSet>
      <fileSet>
        <directoryMode>755</directoryMode>
+       <fileMode>755</fileMode>
        <directory>${project.basedir}/../ambari-common/src/main/python/ambari_simplejson</directory>
        <outputDirectory>${simplejson.install.dir}</outputDirectory>
 +    </fileSet>
 +    <fileSet>
 +      <directoryMode>755</directoryMode>
++      <fileMode>755</fileMode>
 +      <directory>${project.basedir}/../ambari-common/src/main/python/ambari_stomp</directory>
 +      <outputDirectory>${stomp.install.dir}</outputDirectory>
 +    </fileSet>
 +    <fileSet>
 +      <directoryMode>755</directoryMode>
++      <fileMode>755</fileMode>
 +      <directory>${project.basedir}/../ambari-common/src/main/python/ambari_ws4py</directory>
 +      <outputDirectory>${ws4py.install.dir}</outputDirectory>
      </fileSet>
      <fileSet>
        <directoryMode>755</directoryMode>

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/test/python/ambari_agent/TestAlerts.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py
----------------------------------------------------------------------
diff --cc ambari-agent/src/test/python/ambari_agent/TestHostInfo.py
index a00771d,3c46268..9811142
--- a/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py
@@@ -200,8 -83,16 +83,15 @@@ class TestHostInfo(TestCase)
    @patch.object(HostInfoLinux, 'checkFirewall')
    @patch.object(HostInfoLinux, 'checkUnlimitedJce')
    def test_hostinfo_register_suse(self, jce_mock, cit_mock, hvlc_mock, hvrc_mock, eac_mock, cf_mock, jp_mock,
-                              cls_mock, cu_mock, gir_mock, gipbr_mock, gipbn_mock,
-                              gpd_mock, aip_mock, aap_mock, whcf_mock, os_umask_mock, get_os_type_mock):
+                              cls_mock, cu_mock, get_packages_mock, whcf_mock, os_umask_mock, get_os_type_mock):
+ 
+     m = MagicMock()
+ 
+     m.get_package_details.return_value = ["pkg1", "pkg2"]
+     m.get_installed_pkgs_by_names.return_value = ["pkg2"]
+     m.get_installed_pkgs_by_repo.return_value = ["pkg1"]
+ 
+     get_packages_mock.return_value = m
 -
      cit_mock.return_value = True
      hvlc_mock.return_value = 1
      hvrc_mock.return_value = 1

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
----------------------------------------------------------------------
diff --cc ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
index 347e963,73b5dc1..5203407
--- a/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py
@@@ -26,15 -26,15 +26,15 @@@ import tempfil
  from resource_management.core.logger import Logger
  from resource_management.core import shell
  from resource_management.libraries.functions import stack_tools
- import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set.
  
  
- def get_component_version(stack_name, component_name):
+ def get_component_version_from_symlink(stack_name, component_name):
    """
-   For any stack name, returns the version currently installed for a given component.
-   Because each stack name may have different logic, the input is a generic dictionary.
+   Gets the version of the specified component by invoking the stack-select tool to query for the
+   version which is referenced by the symlink.
+ 
    :param stack_name: one of HDP, HDPWIN, BIGTOP, PHD, etc. usually retrieved from
 -  the command-#.json file's ["hostLevelParams"]["stack_name"]
 +  the command-#.json file's ["clusterLevelParams"]["stack_name"]
    :param component_name: Component name as a string necessary to get the version
    :return: Returns a string if found, e.g., 2.2.1.0-2175, otherwise, returns None
    """

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-common/src/main/python/resource_management/libraries/script/script.py
----------------------------------------------------------------------
diff --cc ambari-common/src/main/python/resource_management/libraries/script/script.py
index ee475a5,e612638..9a046b9
--- a/ambari-common/src/main/python/resource_management/libraries/script/script.py
+++ b/ambari-common/src/main/python/resource_management/libraries/script/script.py
@@@ -228,9 -247,12 +247,12 @@@ class Script(object)
  
          # if repository_version_id is passed, pass it back with the version
          from resource_management.libraries.functions.default import default
 -        repo_version_id = default("/hostLevelParams/repository_version_id", None)
 +        repo_version_id = default("/roleParams/repository_version_id", None)
          if repo_version_id:
            self.put_structured_out({"repository_version_id": repo_version_id})
+       else:
+         if not self.is_hook():
+           Logger.error("Component '{0}' did not advertise a version. This may indicate a problem with the component packaging.".format(stack_select_package_name))
  
  
    def should_expose_component_version(self, command_name):
@@@ -449,19 -486,37 +486,37 @@@
                stack_tools.get_stack_tool_package(stack_tools.STACK_SELECTOR_NAME))
  
      return Script.stack_version_from_distro_select
-   
-   def format_package_name(self, name):
+ 
+ 
+   def get_package_from_available(self, name, available_packages_in_repos):
+     """
+     This function matches package names with ${stack_version} placeholder to actual package names from
+     Ambari-managed repository.
+     Package names without ${stack_version} placeholder are returned as is.
+     """
+     if STACK_VERSION_PLACEHOLDER not in name:
+       return name
+     package_delimiter = '-' if OSCheck.is_ubuntu_family() else '_'
+     package_regex = name.replace(STACK_VERSION_PLACEHOLDER, '(\d|{0})+'.format(package_delimiter)) + "$"
+     for package in available_packages_in_repos:
+       if re.match(package_regex, package):
+         return package
+     Logger.warning("No package found for {0}({1})".format(name, package_regex))
+ 
+ 
+   def format_package_name(self, name, repo_version=None):
      from resource_management.libraries.functions.default import default
      """
-     This function replaces ${stack_version} placeholder into actual version.  If the package
+     This function replaces ${stack_version} placeholder with actual version.  If the package
      version is passed from the server, use that as an absolute truth.
 -    
++
+     :param name name of the package
+     :param repo_version actual version of the repo currently installing
      """
+     stack_version_package_formatted = ""
  
-     # two different command types put things in different objects.  WHY.
-     # package_version is the form W_X_Y_Z_nnnn
-     package_version = default("roleParams/package_version", None)
-     if not package_version:
-       package_version = default("hostLevelParams/package_version", None)
+     if not repo_version:
+       repo_version = self.get_stack_version_before_packages_installed()
  
      package_delimiter = '-' if OSCheck.is_ubuntu_family() else '_'
  
@@@ -536,7 -629,11 +629,11 @@@
      :return: a stack name or None
      """
      from resource_management.libraries.functions.default import default
-     return default("/clusterLevelParams/stack_name", "HDP")
 -    stack_name = default("/hostLevelParams/stack_name", None)
++    stack_name = default("/clusterLevelParams/stack_name", None)
+     if stack_name is None:
+       stack_name = default("/configurations/cluster-env/stack_name", "HDP")
+ 
+     return stack_name
  
    @staticmethod
    def get_stack_root():
@@@ -648,16 -756,22 +756,22 @@@
      """
      config = self.get_config()
  
 -    if 'host_sys_prepped' in config['hostLevelParams']:
 +    if 'host_sys_prepped' in config['ambariLevelParams']:
        # do not install anything on sys-prepped host
-       if config['ambariLevelParams']['host_sys_prepped'] == True:
 -      if config['hostLevelParams']['host_sys_prepped'] is True:
++      if config['ambariLevelParams']['host_sys_prepped'] is True:
          Logger.info("Node has all packages pre-installed. Skipping.")
          return
+       pass
      try:
 -      package_list_str = config['hostLevelParams']['package_list']
 -      agent_stack_retry_on_unavailability = bool(config['hostLevelParams']['agent_stack_retry_on_unavailability'])
 -      agent_stack_retry_count = int(config['hostLevelParams']['agent_stack_retry_count'])
 +      package_list_str = config['commandParams']['package_list']
 +      agent_stack_retry_on_unavailability = bool(config['ambariLevelParams']['agent_stack_retry_on_unavailability'])
 +      agent_stack_retry_count = int(config['ambariLevelParams']['agent_stack_retry_count'])
- 
+       pkg_provider = get_provider("Package")
+       try:
+         available_packages_in_repos = pkg_provider.get_available_packages_in_repos(config['repositoryFile']['repositories'])
+       except Exception as err:
+         Logger.exception("Unable to load available packages")
+         available_packages_in_repos = []
        if isinstance(package_list_str, basestring) and len(package_list_str) > 0:
          package_list = json.loads(package_list_str)
          for package in package_list:
@@@ -679,18 -793,18 +793,18 @@@
      if OSCheck.is_windows_family():
        #TODO hacky install of windows msi, remove it or move to old(2.1) stack definition when component based install will be implemented
        hadoop_user = config["configurations"]["cluster-env"]["hadoop.user.name"]
 -      install_windows_msi(config['hostLevelParams']['jdk_location'],
 -                          config["hostLevelParams"]["agentCacheDir"], ["hdp-2.3.0.0.winpkg.msi", "hdp-2.3.0.0.cab", "hdp-2.3.0.0-01.cab"],
 +      install_windows_msi(config['ambariLevelParams']['jdk_location'],
 +                          config["agentLevelParams"]["agentCacheDir"], ["hdp-2.3.0.0.winpkg.msi", "hdp-2.3.0.0.cab", "hdp-2.3.0.0-01.cab"],
                            hadoop_user, self.get_password(hadoop_user),
 -                          str(config['hostLevelParams']['stack_version']))
 +                          str(config['clusterLevelParams']['stack_version']))
        reload_windows_env()
-       
+ 
    def check_package_condition(self, package):
      condition = package['condition']
-     
+ 
      if not condition:
        return True
-     
+ 
      return self.should_install_package(package)
  
    def should_install_package(self, package):

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
----------------------------------------------------------------------
diff --cc ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
index 0000000,2675bd9..e0356bb
mode 000000,100644..100644
--- a/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
+++ b/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
@@@ -1,0 -1,735 +1,725 @@@
+ #!/usr/bin/python
+ 
+ '''
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+     http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ '''
+ 
+ import hashlib
+ import json
+ import logging
+ import optparse
+ import os
+ import time
+ import signal
+ import sys
+ 
+ from datetime import datetime, timedelta
+ from subprocess import call, Popen, PIPE
+ from urllib import quote, unquote
+ from zipfile import ZipFile, ZIP_DEFLATED
+ import tarfile
+ import gzip
+ import shutil
+ 
+ VERSION = "1.0"
+ 
+ logger = logging.getLogger()
+ handler = logging.StreamHandler()
+ formatter = logging.Formatter("%(asctime)s - %(message)s")
+ handler.setFormatter(formatter)
+ logger.addHandler(handler)
+ verbose = False
+ 
+ def parse_arguments():
+   parser = optparse.OptionParser("usage: %prog [options]", version="Solr Data Manager {0}".format(VERSION))
+ 
 -  parser.add_option("-m", "--mode", dest="mode", type="string", help="archive | delete | save")
++  parser.add_option("-m", "--mode", dest="mode", type="string", help="delete | save")
+   parser.add_option("-s", "--solr-url", dest="solr_url", type="string", help="the url of the solr server including the port")
+   parser.add_option("-c", "--collection", dest="collection", type="string", help="the name of the solr collection")
+   parser.add_option("-f", "--filter-field", dest="filter_field", type="string", help="the name of the field to filter on")
+   parser.add_option("-r", "--read-block-size", dest="read_block_size", type="int", help="block size to use for reading from solr",
+                     default=1000)
+   parser.add_option("-w", "--write-block-size", dest="write_block_size", type="int", help="number of records in the output files",
+                     default=100000)
+   parser.add_option("-i", "--id-field", dest="id_field", type="string", help="the name of the id field", default="id")
+ 
+   end_group = optparse.OptionGroup(parser, "specifying the end of the range")
+   end_group.add_option("-e", "--end", dest="end", type="string", help="end of the range")
+   end_group.add_option("-d", "--days", dest="days", type="int", help="number of days to keep")
+   parser.add_option_group(end_group)
+ 
+   parser.add_option("-o", "--date-format", dest="date_format", type="string", help="the date format to use for --days",
+                     default="%Y-%m-%dT%H:%M:%S.%fZ")
+   
+   parser.add_option("-q", "--additional-filter", dest="additional_filter", type="string", help="additional solr filter")
+   parser.add_option("-j", "--name", dest="name", type="string", help="name included in result files")
+   
+   parser.add_option("-g", "--ignore-unfinished-uploading", dest="ignore_unfinished_uploading", action="store_true", default=False)
+   
+   parser.add_option("--json-file", dest="json_file", help="create a json file instead of line delimited json", action="store_true", default=False)
+   parser.add_option("-z", "--compression", dest="compression", help="none | tar.gz | tar.bz2 | zip | gz", default="gz")
+   
+   parser.add_option("-k", "--solr-keytab", dest="solr_keytab", type="string", help="the keytab for a kerberized solr")
+   parser.add_option("-n", "--solr-principal", dest="solr_principal", type="string", help="the principal for a kerberized solr")
+   
+   parser.add_option("-a", "--hdfs-keytab", dest="hdfs_keytab", type="string", help="the keytab for a kerberized hdfs")
+   parser.add_option("-l", "--hdfs-principal", dest="hdfs_principal", type="string", help="the principal for a kerberized hdfs")
+   
+   parser.add_option("-u", "--hdfs-user", dest="hdfs_user", type="string", help="the user for accessing hdfs")
+   parser.add_option("-p", "--hdfs-path", dest="hdfs_path", type="string", help="the hdfs path to upload to")
+   
+   parser.add_option("-t", "--key-file-path", dest="key_file_path", type="string", help="the file that contains S3 <accessKey>,<secretKey>")
+   parser.add_option("-b", "--bucket", dest="bucket", type="string", help="the bucket name for S3 upload")
+   parser.add_option("-y", "--key-prefix", dest="key_prefix", type="string", help="the key prefix for S3 upload")
+   
+   parser.add_option("-x", "--local-path", dest="local_path", type="string", help="the local path to save the files to")
+   
+   parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False)
+   
+   (options, args) = parser.parse_args()
+   
+   for r in ["mode", "solr_url", "collection", "filter_field"]:
+     if options.__dict__[r] is None:
+       print "argument '{0}' is mandatory".format(r)
+       parser.print_help()
+       sys.exit()
+   
 -  mode_values = ["archive", "delete", "save"]
++  mode_values = ["delete", "save"]
+   if options.mode not in mode_values:
+     print "mode must be one of {0}".format(" | ".join(mode_values))
+     parser.print_help()
+     sys.exit()
+ 
+   if options.mode == "delete":
 -    for r in ["name", "hdfs_keytab", "hdfs_principal", "hdfs_user", "hdfs_path", "key_file_path", "bucket", "key_prefix", "local_path"]:
++    for r in ["name", "compression", "hdfs_keytab", "hdfs_principal", "hdfs_user", "hdfs_path", "key_file_path", "bucket", "key_prefix", "local_path"]:
+       if options.__dict__[r] is not None:
+         print "argument '{0}' may not be specified in delete mode".format(r)
+         parser.print_help()
+         sys.exit()
+ 
+   if options.__dict__["end"] is None and options.__dict__["days"] is None or \
+      options.__dict__["end"] is not None and options.__dict__["days"] is not None:
+     print "exactly one of 'end' or 'days' must be specfied"
+     parser.print_help()
+     sys.exit()
+ 
+   is_any_solr_kerberos_property = options.__dict__["solr_keytab"] is not None or options.__dict__["solr_principal"] is not None
+   is_all_solr_kerberos_property = options.__dict__["solr_keytab"] is not None and options.__dict__["solr_principal"] is not None
+   if is_any_solr_kerberos_property and not is_all_solr_kerberos_property:
+     print "either both 'solr-keytab' and 'solr-principal' must be specfied, or neither of them"
+     parser.print_help()
+     sys.exit()
+ 
+   compression_values = ["none", "tar.gz", "tar.bz2", "zip", "gz"]
+   if options.compression not in compression_values:
+     print "compression must be one of {0}".format(" | ".join(compression_values))
+     parser.print_help()
+     sys.exit()
+ 
+   is_any_hdfs_kerberos_property = options.__dict__["hdfs_keytab"] is not None or options.__dict__["hdfs_principal"] is not None
+   is_all_hdfs_kerberos_property = options.__dict__["hdfs_keytab"] is not None and options.__dict__["hdfs_principal"] is not None
+   if is_any_hdfs_kerberos_property and not is_all_hdfs_kerberos_property:
+     print "either both 'hdfs_keytab' and 'hdfs_principal' must be specfied, or neither of them"
+     parser.print_help()
+     sys.exit()
+ 
+   is_any_hdfs_property = options.__dict__["hdfs_user"] is not None or options.__dict__["hdfs_path"] is not None
+   is_all_hdfs_property = options.__dict__["hdfs_user"] is not None and options.__dict__["hdfs_path"] is not None
+   if is_any_hdfs_property and not is_all_hdfs_property:
+     print "either both 'hdfs_user' and 'hdfs_path' must be specfied, or neither of them"
+     parser.print_help()
+     sys.exit()
+ 
+   is_any_s3_property = options.__dict__["key_file_path"] is not None or options.__dict__["bucket"] is not None or \
+                        options.__dict__["key_prefix"] is not None
+   is_all_s3_property = options.__dict__["key_file_path"] is not None and options.__dict__["bucket"] is not None and \
+                        options.__dict__["key_prefix"] is not None
+   if is_any_s3_property and not is_all_s3_property:
+     print "either all the S3 arguments ('key_file_path', 'bucket', 'key_prefix') must be specfied, or none of them"
+     parser.print_help()
+     sys.exit()
+ 
 -  if options.mode in ["archive", "save"]:
++  if options.mode == "save":
+     count = (1 if is_any_hdfs_property else 0) + (1 if is_any_s3_property else 0) + \
+             (1 if options.__dict__["local_path"] is not None else 0)
+     if count != 1:
+       print "exactly one of the HDFS arguments ('hdfs_user', 'hdfs_path') or the S3 arguments ('key_file_path', 'bucket', 'key_prefix') or the 'local_path' argument must be specified"
+       parser.print_help()
+       sys.exit()
+ 
+   if options.__dict__["hdfs_keytab"] is not None and options.__dict__["hdfs_user"] is None:
+     print "HDFS kerberos keytab and principal may only be specified if the upload target is HDFS"
+     parser.print_help()
+     sys.exit()
+ 
+   print("You are running Solr Data Manager {0} with arguments:".format(VERSION))
+   print("  mode: " + options.mode)
+   print("  solr-url: " + options.solr_url)
+   print("  collection: " + options.collection)
+   print("  filter-field: " + options.filter_field)
 -  if options.mode in ["archive", "save"]:
++  if options.mode == "save":
+     print("  id-field: " + options.id_field)
+   if options.__dict__["end"] is not None:
+     print("  end: " + options.end)
+   else:
+     print("  days: " + str(options.days))
+     print("  date-format: " + options.date_format)
+   if options.__dict__["additional_filter"] is not None:
+     print("  additional-filter: " + str(options.additional_filter))
+   if options.__dict__["name"] is not None:
+     print("  name: " + str(options.name))
 -  if options.mode in ["archive", "save"]:
++  if options.mode == "save":
+     print("  read-block-size: " + str(options.read_block_size))
+     print("  write-block-size: " + str(options.write_block_size))
+     print("  ignore-unfinished-uploading: " + str(options.ignore_unfinished_uploading))
+   if (options.__dict__["solr_keytab"] is not None):
+     print("  solr-keytab: " + options.solr_keytab)
+     print("  solr-principal: " + options.solr_principal)
 -  if options.mode in ["archive", "save"]:
++  if options.mode == "save":
+     print("  output: " + ("json" if options.json_file else "line-delimited-json"))
+     print("  compression: " + options.compression)
+   if (options.__dict__["hdfs_keytab"] is not None):
+     print("  hdfs-keytab: " + options.hdfs_keytab)
+     print("  hdfs-principal: " + options.hdfs_principal)
+   if (options.__dict__["hdfs_user"] is not None):
+     print("  hdfs-user: " + options.hdfs_user)
+     print("  hdfs-path: " + options.hdfs_path)
+   if (options.__dict__["key_file_path"] is not None):
+     print("  key-file-path: " + options.key_file_path)
+     print("  bucket: " + options.bucket)
+     print("  key-prefix: " + options.key_prefix)
+   if (options.__dict__["local_path"] is not None):
+     print("  local-path: " + options.local_path)
+   print("  verbose: " + str(options.verbose))
+   print
+ 
+   if options.__dict__["additional_filter"] is not None and options.__dict__["name"] is None:
+     go = False
+     while not go:
+       sys.stdout.write("It is recommended to set --name in case of any additional filter is set.\n")
+       sys.stdout.write("Are you sure that you want to proceed without a name (yes/no)? ")
+       choice = raw_input().lower()
+       if choice in ['yes', 'ye', 'y']:
+         go = True
+       elif choice in ['no', 'n']:
+         sys.exit()
+ 
+   return options
+ 
+ def set_log_level():
+   if verbose:
+     logger.setLevel(logging.DEBUG)
+   else:
+     logger.setLevel(logging.INFO)
+ 
+ def get_end(options):
+   if options.end:
+     return options.end
+   else:
+     d = datetime.now() - timedelta(days=options.days)
+     end = d.strftime(options.date_format)
+     logger.info("The end date will be: %s", end)
+     return end
+ 
+ def delete(solr_url, collection, filter_field, end, solr_keytab, solr_principal):
+   logger.info("Deleting data where %s <= %s", filter_field, end)
+   solr_kinit_command = None
+   if solr_keytab:
+     solr_kinit_command = "kinit -kt {0} {1}".format(solr_keytab, solr_principal)
+     curl_prefix = "curl -k --negotiate -u : "
+   else:
+     curl_prefix = "curl -k"
+   
+   delete_range = "{0}:[*+TO+\"{1}\"]".format(filter_field, end)
+   delete_query = quote("{0}:[*+TO+\"{1}\"]".format(filter_field, end), safe="/+\"*")
+   delete_command = "{0}/{1}/update?stream.body=<delete><query>{2}</query></delete>&commit=true&wt=json" \
+     .format(solr_url, collection, delete_query)
+   
+   query_solr(solr_kinit_command, delete_command, "{0} {1}".format(curl_prefix, delete_command), "Deleting")
+ 
 -def save(mode, solr_url, collection, filter_field, id_field, range_end, read_block_size, write_block_size,
++def save(solr_url, collection, filter_field, id_field, range_end, read_block_size, write_block_size,
+          ignore_unfinished_uploading, additional_filter, name, solr_keytab, solr_principal, json_file,
+          compression, hdfs_keytab, hdfs_principal, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
+   solr_kinit_command = None
+   if solr_keytab:
+     solr_kinit_command = "kinit -kt {0} {1}".format(solr_keytab, solr_principal)
+     curl_prefix = "curl -k --negotiate -u : "
+   else:
+     curl_prefix = "curl -k"
+   
+   hdfs_kinit_command = None
+   if hdfs_keytab:
+     hdfs_kinit_command = "sudo -u {0} kinit -kt {1} {2}".format(hdfs_user, hdfs_keytab, hdfs_principal)
+   
+   if options.hdfs_path:
+     ensure_hdfs_path(hdfs_kinit_command, hdfs_user, hdfs_path)
+ 
+   working_dir = get_working_dir(solr_url, collection)
 -  if mode == "archive":
 -    handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_prefix, working_dir, ignore_unfinished_uploading)
 -  
 -  save_data(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
 -            range_end, read_block_size, write_block_size, working_dir, additional_filter, name, json_file, compression,
++  handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_prefix, working_dir, ignore_unfinished_uploading)
++  save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field, range_end,
++            read_block_size, write_block_size, working_dir, additional_filter, name, json_file, compression,
+             hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path)
+ 
+ def ensure_hdfs_path(hdfs_kinit_command, hdfs_user, hdfs_path):
+   if hdfs_kinit_command:
+     run_kinit(hdfs_kinit_command, "HDFS")
+   
+   try:
+     hdfs_create_dir_command = "sudo -u {0} hadoop fs -mkdir -p {1}".format(hdfs_user, hdfs_path)
+     logger.debug("Ensuring that the HDFS path %s exists:\n%s", hdfs_path, hdfs_create_dir_command)
+     result = call(hdfs_create_dir_command.split())
+   except Exception as e:
+     print
+     logger.warn("Could not execute hdfs ensure dir command:\n%s", hdfs_create_dir_command)
+     logger.warn(str(e))
+     sys.exit()
+   
+   if result != 0:
+     print
+     logger.warn("Could not ensure HDFS dir command:\n%s", hdfs_create_dir_command)
+     logger.warn(str(err))
+     sys.exit()
+ 
+ def get_working_dir(solr_url, collection):
+   md5 = hashlib.md5()
+   md5.update(solr_url)
+   md5.update(collection)
+   hash = md5.hexdigest()
+   working_dir = "/tmp/solrDataManager/{0}".format(hash)
+   
+   if not(os.path.isdir(working_dir)):
+     os.makedirs(working_dir)
+   
+   logger.debug("Working directory is %s", working_dir)
+   return working_dir
+ 
+ def handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_prefix, working_dir, ignore_unfinished_uploading):
+   command_json_path = "{0}/command.json".format(working_dir)
+   if os.path.isfile(command_json_path):
+     with open(command_json_path) as command_file:
+       command = json.load(command_file)
+     
+     if "upload" in command.keys() and ignore_unfinished_uploading:
+       logger.info("Ignoring unfinished uploading left by previous run")
+       os.remove(command_json_path)
+       return
+     
+     if "upload" in command.keys():
+       logger.info("Previous run has left unfinished uploading")
+       logger.info("You may try to run the program with '-g' or '--ignore-unfinished-uploading' to ignore it if it keeps on failing")
+       
+       if command["upload"]["type"] == "hdfs":
+         upload_file_hdfs(hdfs_kinit_command, command["upload"]["command"], command["upload"]["upload_file_path"],
+                          command["upload"]["hdfs_path"], command["upload"]["hdfs_user"])
+       elif command["upload"]["type"] == "s3":
+         upload_file_s3(command["upload"]["command"], command["upload"]["upload_file_path"], command["upload"]["bucket"],
+                        command["upload"]["key_prefix"])
+       elif command["upload"]["type"] == "local":
+         upload_file_local(command["upload"]["command"], command["upload"]["upload_file_path"], command["upload"]["local_path"])
+       else:
+         logger.warn("Unknown upload type: %s", command["upload"]["type"])
+         sys.exit()
+     
+     if "delete" in command.keys():
+       delete_data(solr_kinit_command, curl_prefix, command["delete"]["command"], command["delete"]["collection"],
+                   command["delete"]["filter_field"], command["delete"]["id_field"], command["delete"]["prev_lot_end_value"],
+                   command["delete"]["prev_lot_end_id"])
+     
+     os.remove(command_json_path)
+ 
 -def save_data(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
++def save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
+               range_end, read_block_size, write_block_size, working_dir, additional_filter, name, json_file,
+               compression, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
+   logger.info("Starting to save data")
+   
+   tmp_file_path = "{0}/tmp.json".format(working_dir)
+   
+   prev_lot_end_value = None
+   prev_lot_end_id = None
+   
+   if additional_filter:
+     q = quote("{0}+AND+{1}:[*+TO+\"{2}\"]".format(additional_filter, filter_field, range_end), safe="/+\"*")
+   else:
+     q = quote("{0}:[*+TO+\"{1}\"]".format(filter_field, range_end), safe="/+\"*")
+   
+   sort = quote("{0}+asc,{1}+asc".format(filter_field, id_field), safe="/+\"*")
+   solr_query_url_prefix = "{0}/{1}/select?q={2}&sort={3}&rows={4}&wt=json".format(solr_url, collection, q, sort, read_block_size)
+   
+   done = False
+   total_records = 0
+   while not done:
+     results = create_block(tmp_file_path, solr_kinit_command, curl_prefix, solr_query_url_prefix, filter_field,
+                            id_field, range_end, write_block_size, prev_lot_end_value, prev_lot_end_id, json_file)
+     done = results[0]
+     records = results[1]
+     prev_lot_end_value = results[2]
+     prev_lot_end_id = results[3]
+     
+     if records > 0:
 -      upload_block(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field,
 -                   id_field, working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user,
 -                   hdfs_path, key_file_path, bucket, key_prefix, local_path, compression)
++      upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
++                   working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
++                   key_file_path, bucket, key_prefix, local_path, compression)
+       total_records += records
+       logger.info("A total of %d records are saved", total_records)
+ 
+ def create_block(tmp_file_path, solr_kinit_command, curl_prefix, solr_query_url_prefix, filter_field, id_field, range_end,
+                  write_block_size, prev_lot_end_value, prev_lot_end_id, json_file):
+   if os.path.exists(tmp_file_path):
+     os.remove(tmp_file_path)
+   tmp_file = open(tmp_file_path, 'w')
+   logger.debug("Created tmp file %s", tmp_file_path)
+   
+   init_file(tmp_file, json_file)
+   records = 0
+   done = False
+   while records < write_block_size:
+     if prev_lot_end_value:
+       fq_prev_end_rest = "({0}:\"{1}\"+AND+{2}:{{\"{3}\"+TO+*])".format(filter_field, prev_lot_end_value, id_field,
+                                                                         prev_lot_end_id)
+       fq_new = "{0}:{{\"{1}\"+TO+\"{2}\"]".format(filter_field, prev_lot_end_value, range_end)
+       fq = "{0}+OR+{1}".format(fq_prev_end_rest, fq_new)
+     else:
+       fq = "{0}:[*+TO+\"{1}\"]".format(filter_field, range_end)
+ 
+     url = "{0}&fq={1}".format(solr_query_url_prefix, quote(fq, safe="/+\"*"))
+     curl_command = "{0} {1}".format(curl_prefix, url)
+     
+     rsp = query_solr(solr_kinit_command, url, curl_command, "Obtaining")
+     
+     if rsp['response']['numFound'] == 0:
+       done = True
+       break
+ 
+     for doc in rsp['response']['docs']:
+       last_doc = doc
+       add_line(tmp_file, doc, json_file, records)
+       records += 1
+       if records == write_block_size:
+         break
+ 
+     prev_lot_end_value = last_doc[filter_field]
+     prev_lot_end_id = last_doc[id_field]
+     sys.stdout.write("\r{0} records are written".format(records))
+     sys.stdout.flush()
+     if verbose and records < write_block_size:
+       print
+       logger.debug("Collecting next lot of data")
+ 
+   finish_file(tmp_file, json_file)
+   sys.stdout.write("\n")
+   logger.debug("Finished data collection")
+   return [done, records, prev_lot_end_value, prev_lot_end_id]
+ 
+ def init_file(tmp_file, json_file):
+   if json_file:
+     tmp_file.write("{\n")
+ 
+ def add_line(tmp_file, doc, json_file, records):
+   if records > 0:
+     if json_file:
+       tmp_file.write(",\n")
+     else:
+       tmp_file.write("\n")
+     
+   tmp_file.write(json.dumps(doc))
+ 
+ def finish_file(tmp_file, json_file):
+   if json_file:
+     tmp_file.write("\n}")
+ 
 -def upload_block(mode, solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field,
 -                 id_field, working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
++def upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
++                 working_dir, tmp_file_path, name, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
+                  key_file_path, bucket, key_prefix, local_path, compression):
+   if name:
+     file_name = "{0}_-_{1}_-_{2}_-_{3}".format(collection, name, prev_lot_end_value, prev_lot_end_id).replace(':', '_')
+   else:
+     file_name = "{0}_-_{1}_-_{2}".format(collection, prev_lot_end_value, prev_lot_end_id).replace(':', '_')
+   
+   upload_file_path = compress_file(working_dir, tmp_file_path, file_name, compression)
+   
 -  upload_command = create_command_file(mode, True, working_dir, upload_file_path, solr_url, collection, filter_field,
 -                                       id_field, prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path,
 -                                       key_file_path, bucket, key_prefix, local_path)
++  upload_command = create_command_file(True, working_dir, upload_file_path, solr_url, collection, filter_field, id_field,
++                                       prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path, key_file_path, bucket,
++                                       key_prefix, local_path)
+   if hdfs_user:
+     upload_file_hdfs(hdfs_kinit_command, upload_command, upload_file_path, hdfs_path, hdfs_user)
+   elif key_file_path:
+     upload_file_s3(upload_command, upload_file_path, bucket, key_prefix)
+   elif local_path:
+     upload_file_local(upload_command, upload_file_path, local_path)
+   else:
+     logger.warn("Unknown upload destination")
+     sys.exit()
+   
 -  delete_command = create_command_file(mode, False, working_dir, upload_file_path, solr_url, collection, filter_field,
 -                                       id_field, prev_lot_end_value, prev_lot_end_id, None, None, None, None, None, None)
 -  if mode == "archive":
 -    delete_data(solr_kinit_command, curl_prefix, delete_command, collection, filter_field, id_field, prev_lot_end_value,
 -                prev_lot_end_id)
 -    os.remove("{0}/command.json".format(working_dir))
++  delete_command = create_command_file(False, working_dir, upload_file_path, solr_url, collection, filter_field, id_field,
++                                       prev_lot_end_value, prev_lot_end_id, None, None, None, None, None, None)
++  delete_data(solr_kinit_command, curl_prefix, delete_command, collection, filter_field, id_field, prev_lot_end_value, prev_lot_end_id)
++  
++  os.remove("{0}/command.json".format(working_dir))
+ 
+ def compress_file(working_dir, tmp_file_path, file_name, compression):
+   data_file_name = "{0}.json".format(file_name)
+   if compression == "none":
+     upload_file_path = "{0}/{1}.json".format(working_dir, file_name)
+     os.rename(tmp_file_path, upload_file_path)
+   elif compression == "tar.gz":
+     upload_file_path = "{0}/{1}.json.tar.gz".format(working_dir, file_name)
+     tar = tarfile.open(upload_file_path, mode="w:gz")
+     try:
+       tar.add(tmp_file_path, arcname=data_file_name)
+     finally:
+       tar.close()
+   elif compression == "tar.bz2":
+     upload_file_path = "{0}/{1}.json.tar.bz2".format(working_dir, file_name)
+     tar = tarfile.open(upload_file_path, mode="w:bz2")
+     try:
+       tar.add(tmp_file_path, arcname=data_file_name)
+     finally:
+       tar.close()
+   elif compression == "zip":
+     upload_file_path = "{0}/{1}.json.zip".format(working_dir, file_name)
+     zip = ZipFile(upload_file_path, 'w')
+     zip.write(tmp_file_path, data_file_name, ZIP_DEFLATED)
+   elif compression == "gz":
+     upload_file_path = "{0}/{1}.json.gz".format(working_dir, file_name)
+     gz = gzip.open(upload_file_path, mode="wb")
+     f = open(tmp_file_path)
+     try:
+       shutil.copyfileobj(f, gz)
+     finally:
+       gz.close()
+       f.close()
+   else:
+     logger.warn("Unknown compression type")
+     sys.exit()
+   
+   logger.info("Created data file %s", data_file_name)
+ 
+   
+   return upload_file_path
+ 
 -def create_command_file(mode, upload, working_dir, upload_file_path, solr_url, collection, filter_field, id_field,
 -                        prev_lot_end_value, prev_lot_end_id, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix,
 -                        local_path):
++def create_command_file(upload, working_dir, upload_file_path, solr_url, collection, filter_field, id_field, prev_lot_end_value,
++                        prev_lot_end_id, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
+   commands = {}
+   
+   if upload:
+     logger.debug("Creating command file with upload and delete instructions in case of an interruption")
+   else:
+     logger.debug("Creating command file with delete instructions in case of an interruption")
+   
+   if upload:
+     if hdfs_path:
+       upload_command = "sudo -u {0} hadoop fs -put {1} {2}".format(hdfs_user, upload_file_path, hdfs_path)
+       upload_command_data = {}
+       upload_command_data["type"] = "hdfs"
+       upload_command_data["command"] = upload_command
+       upload_command_data["upload_file_path"] = upload_file_path
+       upload_command_data["hdfs_path"] = hdfs_path
+       upload_command_data["hdfs_user"] = hdfs_user
+       commands["upload"] = upload_command_data
+     elif key_file_path:
+       upload_command = "java -cp {0}/libs/* org.apache.ambari.infra.solr.S3Uploader {1} {2} {3} {4}".format( \
+           os.path.dirname(os.path.realpath(__file__)), key_file_path, bucket, key_prefix, upload_file_path)
+       upload_command_data = {}
+       upload_command_data["type"] = "s3"
+       upload_command_data["command"] = upload_command
+       upload_command_data["upload_file_path"] = upload_file_path
+       upload_command_data["bucket"] = bucket
+       upload_command_data["key_prefix"] = key_prefix
+       commands["upload"] = upload_command_data
+     elif local_path:
+       upload_command = "mv {0} {1}".format(upload_file_path, local_path)
+       upload_command_data = {}
+       upload_command_data["type"] = "local"
+       upload_command_data["command"] = upload_command
+       upload_command_data["upload_file_path"] = upload_file_path
+       upload_command_data["local_path"] = local_path
+       commands["upload"] = upload_command_data
+     else:
+       logger.warn("Unknown upload destination")
+       sys.exit()
 -    
 -    if mode == "save":
 -      return upload_command
+ 
+   
+   delete_prev = "{0}:[*+TO+\"{1}\"]".format(filter_field, prev_lot_end_value)
+   delete_last = "({0}:\"{1}\"+AND+{2}:[*+TO+\"{3}\"])".format(filter_field, prev_lot_end_value, id_field, prev_lot_end_id)
+   delete_query = quote("{0}+OR+{1}".format(delete_prev, delete_last), safe="/+\"*")
+   delete_command = "{0}/{1}/update?stream.body=<delete><query>{2}</query></delete>&commit=true&wt=json" \
+     .format(solr_url, collection, delete_query)
 -  if mode == "save":
 -    return delete_command
 -  
+   delete_command_data = {}
+   delete_command_data["command"] = delete_command
+   delete_command_data["collection"] = collection
+   delete_command_data["filter_field"] = filter_field
+   delete_command_data["id_field"] = id_field
+   delete_command_data["prev_lot_end_value"] = prev_lot_end_value
+   delete_command_data["prev_lot_end_id"] = prev_lot_end_id
+   commands["delete"] = delete_command_data
+   
+   command_file_path = "{0}/command.json".format(working_dir)
+   command_file_path_tmp = "{0}.tmp".format(command_file_path)
+   cft = open(command_file_path_tmp, 'w')
+   cft.write(json.dumps(commands, indent=4))
+   os.rename(command_file_path_tmp, command_file_path)
+   
+   logger.debug("Command file %s was created", command_file_path)
+   
+   if upload:
+     return upload_command
+   else:
+     return delete_command
+ 
+ def upload_file_hdfs(hdfs_kinit_command, upload_command, upload_file_path, hdfs_path, hdfs_user):
+   if hdfs_kinit_command:
+     run_kinit(hdfs_kinit_command, "HDFS")
+   
+   try:
+     hdfs_file_exists_command = "sudo -u {0} hadoop fs -test -e {1}".format(hdfs_user, hdfs_path + os.path.basename(upload_file_path))
+     logger.debug("Checking if file already exists on hdfs:\n%s", hdfs_file_exists_command)
+     hdfs_file_exists = (0 == call(hdfs_file_exists_command.split()))
+   except Exception as e:
+     print
+     logger.warn("Could not execute command to check if file already exists on HDFS:\n%s", hdfs_file_exists_command)
+     logger.warn(str(e))
+     sys.exit()
+   
+   if os.path.isfile(upload_file_path) and not hdfs_file_exists:
+     try:
+       logger.debug("Uploading file to hdfs:\n%s", upload_command)
+       result = call(upload_command.split())
+     except Exception as e:
+       print
+       logger.warn("Could not execute command to upload file to HDFS:\n%s", upload_command)
+       logger.warn(str(e))
+       sys.exit()
+     
+     if result != 0:
+       logger.warn("Could not upload file to HDFS with command:\n%s", upload_command)
+       sys.exit()
+     
+     logger.info("File %s was uploaded to hdfs %s", os.path.basename(upload_file_path), hdfs_path)
+     os.remove(upload_file_path)
+ 
+ def upload_file_s3(upload_command, upload_file_path, bucket, key_prefix):
+   if os.path.isfile(upload_file_path):
+     try:
+       logger.debug("Uploading file to s3:\n%s", upload_command)
+       result = call(upload_command.split())
+     except Exception as e:
+       print
+       logger.warn("Could not execute command to upload file to S3:\n%s", upload_command)
+       logger.warn(str(e))
+       sys.exit()
+ 
+     if result != 0:
+       logger.warn("Could not upload file to S3 with command:\n%s", upload_command)
+       sys.exit()
+ 
+     logger.info("File %s was uploaded to s3 bucket '%s', key '%s'", os.path.basename(upload_file_path), bucket,
+                 key_prefix + os.path.basename(upload_file_path))
+     os.remove(upload_file_path)
+ 
+ def upload_file_local(upload_command, upload_file_path, local_path):
+   if os.path.exists(local_path) and not os.path.isdir(local_path):
+     logger.warn("Local path %s exists, but not a directory, can not save there", local_path)
+   if not os.path.isdir(local_path):
+     os.mkdir(local_path)
+     logger.debug("Directory %s was created", local_path)
+   
+   try:
+     logger.debug("Moving file to local directory %s with command\n%s", local_path, upload_command)
+     call(upload_command.split())
+     logger.info("File %s was moved to local directory %s", os.path.basename(upload_file_path), local_path)
+   except Exception as e:
+     print
+     logger.warn("Could not execute move command command:\n%s", upload_command)
+     logger.warn(str(e))
+     sys.exit()
+ 
+ def delete_data(solr_kinit_command, curl_prefix, delete_command, collection, filter_field, id_field, prev_lot_end_value,
+                 prev_lot_end_id):
+   query_solr(solr_kinit_command, delete_command, "{0} {1}".format(curl_prefix, delete_command), "Deleting")
+   logger.info("Deleted data from collection %s where %s,%s < %s,%s", collection, filter_field, id_field, prev_lot_end_value,
+               prev_lot_end_id)
+ 
+ def query_solr(solr_kinit_command, url, curl_command, action):
+   if solr_kinit_command:
+     run_kinit(solr_kinit_command, "Solr")
+ 
+   try:
+     logger.debug("%s data from solr:\n%s", action, curl_command)
+     process = Popen(curl_command.split(), stdin=PIPE, stdout=PIPE, stderr=PIPE)
+   except Exception as e:
+     print
+     logger.warn("Could not execute curl command:\n%s", curl_command)
+     logger.warn(str(e))
+     sys.exit()
+ 
+   out, err = process.communicate()
+   if process.returncode != 0:
+     print
+     logger.warn("Could not execute curl command:\n%s", curl_command)
+     logger.warn(str(err))
+     sys.exit()
+ 
+   true = True # needed to be able to eval 'true' in the returned json
+   rsp = eval(str(out))
+   if rsp["responseHeader"]["status"] != 0:
+     print
+     logger.warn("Could not execute solr query:\n%s", unquote(url))
+     logger.warn(rsp["error"]["msg"])
+     sys.exit()
+ 
+   return rsp
+ 
+ def run_kinit(kinit_command, program):
+   try:
+     logger.debug("Running kinit for %s:\n%s", program, kinit_command)
+     result = call(kinit_command.split())
+   except Exception as e:
+     print
+     logger.warn("Could not execute %s kinit command:\n%s", program, kinit_command)
+     logger.warn(str(e))
+     sys.exit()
+   
+   if result != 0:
+     print
+     logger.warn("%s kinit command was not successful:\n%s", program, kinit_command)
+     sys.exit()
+ 
+ if __name__ == '__main__':
+   try:
+     start_time = time.time()
+     
+     options = parse_arguments()
+     verbose = options.verbose
+     set_log_level()
+     
+     end = get_end(options)
+     
+     if options.mode == "delete":
+       delete(options.solr_url, options.collection, options.filter_field, end, options.solr_keytab, options.solr_principal)
 -    elif options.mode in ["archive", "save"]:
 -      save(options.mode, options.solr_url, options.collection, options.filter_field, options.id_field, end,
 -           options.read_block_size, options.write_block_size, options.ignore_unfinished_uploading,
 -           options.additional_filter, options.name, options.solr_keytab, options.solr_principal, options.json_file,
 -           options.compression, options.hdfs_keytab, options.hdfs_principal, options.hdfs_user, options.hdfs_path,
 -           options.key_file_path, options.bucket, options.key_prefix, options.local_path)
++    elif options.mode == "save":
++      save(options.solr_url, options.collection, options.filter_field, options.id_field, end, options.read_block_size,
++           options.write_block_size, options.ignore_unfinished_uploading, options.additional_filter, options.name,
++           options.solr_keytab, options.solr_principal, options.json_file, options.compression,
++           options.hdfs_keytab, options.hdfs_principal, options.hdfs_user, options.hdfs_path, options.key_file_path,
++           options.bucket, options.key_prefix, options.local_path)
+     else:
+       logger.warn("Unknown mode: %s", options.mode)
+     
+     print("--- %s seconds ---" % (time.time() - start_time))
+   except KeyboardInterrupt:
+     print
+     sys.exit(128 + signal.SIGINT)

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-project/pom.xml
----------------------------------------------------------------------
diff --cc ambari-project/pom.xml
index e4668f3,00ba1bc..d9ad50b
--- a/ambari-project/pom.xml
+++ b/ambari-project/pom.xml
@@@ -30,10 -30,14 +30,14 @@@
      <solr.version>5.5.2</solr.version>
      <ambari.dir>${project.parent.basedir}</ambari.dir>
      <powermock.version>1.6.3</powermock.version>
 -    <jetty.version>8.1.19.v20160209</jetty.version>
 +    <jetty.version>9.4.2.v20170220</jetty.version>
      <checkstyle.version>6.19</checkstyle.version> <!-- last version that does not require Java 8 -->
+     <swagger.version>1.5.10</swagger.version>
+     <swagger.maven.plugin.version>3.1.4</swagger.maven.plugin.version>
+     <slf4j.version>1.7.20</slf4j.version>
      <forkCount>4</forkCount>
      <reuseForks>false</reuseForks>
+     <surefire.argLine>-Xmx1024m -Xms512m</surefire.argLine>
    </properties>
    <profiles>
      <profile>

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/pom.xml
----------------------------------------------------------------------
diff --cc ambari-server/pom.xml
index 694f7c7,3d22044..de6ff51
--- a/ambari-server/pom.xml
+++ b/ambari-server/pom.xml
@@@ -1227,20 -1358,9 +1362,16 @@@
      <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
 -      <version>${jetty.version}</version>
 +    </dependency>
 +    <dependency>
 +      <groupId>org.eclipse.jetty.websocket</groupId>
 +      <artifactId>websocket-servlet</artifactId>
 +    </dependency>
 +    <dependency>
 +      <groupId>org.eclipse.jetty.websocket</groupId>
 +      <artifactId>websocket-server</artifactId>
      </dependency>
      <dependency>
-       <groupId>commons-logging</groupId>
-       <artifactId>commons-logging</artifactId>
-     </dependency>
-     <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
      </dependency>
@@@ -1607,8 -1684,14 +1767,8 @@@
      <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
-       <version>4.1.0</version>
+       <version>4.2.2</version>
      </dependency>
 -    <dependency>
 -      <groupId>com.networknt</groupId>
 -      <artifactId>json-schema-validator</artifactId>
 -      <version>0.1.10</version>
 -      <scope>test</scope>
 -    </dependency>
    </dependencies>
  
    <pluginRepositories>

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
index f9daf8d,0157f8b..595edcd
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
@@@ -892,12 -918,17 +922,15 @@@ class ActionScheduler implements Runnab
      boolean areCommandDependenciesFinished = true;
      RoleCommandOrder rco = roleCommandOrderProvider.getRoleCommandOrder(stage.getClusterId());
      if (rco != null) {
-       Set<RoleCommandPair> roleCommandDependencies = rco.getDependencies().get(new
-         RoleCommandPair(Role.valueOf(command.getRole()), command.getRoleCommand()));
+       RoleCommandPair roleCommand = new
+               RoleCommandPair(Role.valueOf(command.getRole()), command.getRoleCommand());
+       Set<RoleCommandPair> roleCommandDependencies = rco.getDependencies().get(roleCommand);
++      // remove eventual references to the same RoleCommand
++      roleCommandDependencies.remove(roleCommand);
  
        // check if there are any dependencies IN_PROGRESS
 -      if (roleCommandDependencies != null) {
 -        // remove eventual references to the same RoleCommand
 -        roleCommandDependencies.remove(roleCommand);
 -        if (CollectionUtils.containsAny(rolesCommandsInProgress, roleCommandDependencies)) {
 -          areCommandDependenciesFinished = false;
 -        }
 +      if (roleCommandDependencies != null && CollectionUtils.containsAny(rolesCommandsInProgress, roleCommandDependencies)) {
 +        areCommandDependenciesFinished = false;
        }
      }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
index 1f92ce7,47aa093..ea208e8
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
@@@ -17,14 -17,24 +17,24 @@@
   */
  package org.apache.ambari.server.actionmanager;
  
+ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER;
+ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER;
 -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.VERSION;
+ 
+ import java.util.HashMap;
  import java.util.Map;
  import java.util.TreeMap;
  
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.ClusterNotFoundException;
+ import org.apache.ambari.server.RoleCommand;
+ import org.apache.ambari.server.ServiceNotFoundException;
  import org.apache.ambari.server.agent.AgentCommand.AgentCommandType;
  import org.apache.ambari.server.agent.ExecutionCommand;
++import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
+ import org.apache.ambari.server.api.services.AmbariMetaInfo;
  import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+ import org.apache.ambari.server.orm.entities.UpgradeEntity;
  import org.apache.ambari.server.state.Cluster;
  import org.apache.ambari.server.state.Clusters;
  import org.apache.ambari.server.state.ConfigHelper;
@@@ -136,9 -165,58 +165,79 @@@ public class ExecutionCommandWrapper 
        // now that the tags have been updated (if necessary), fetch the
        // configurations
        Map<String, Map<String, String>> configurationTags = executionCommand.getConfigurationTags();
 +      configHelper.getAndMergeHostConfigs(configurations, configurationTags, cluster);
 +      configHelper.getAndMergeHostConfigAttributes(executionCommand.getConfigurationAttributes(),
 +          configurationTags, cluster);
++
++      // set the repository version for the component this command is for -
++      // always use the current desired version
++      try {
++        RepositoryVersionEntity repositoryVersion = null;
++        String serviceName = executionCommand.getServiceName();
++        if (!StringUtils.isEmpty(serviceName)) {
++          Service service = cluster.getService(serviceName);
++          if (null != service) {
++            repositoryVersion = service.getDesiredRepositoryVersion();
++          }
+ 
 -      if (MapUtils.isNotEmpty(configurationTags)) {
 -        Map<String, Map<String, String>> configProperties = configHelper
 -            .getEffectiveConfigProperties(cluster, configurationTags);
 -
 -        // Apply the configurations saved with the Execution Cmd on top of
 -        // derived configs - This will take care of all the hacks
 -        for (Map.Entry<String, Map<String, String>> entry : configProperties.entrySet()) {
 -          String type = entry.getKey();
 -          Map<String, String> allLevelMergedConfig = entry.getValue();
++          String componentName = executionCommand.getComponentName();
++          if (!StringUtils.isEmpty(componentName)) {
++            ServiceComponent serviceComponent = service.getServiceComponent(
++                executionCommand.getComponentName());
+ 
 -          if (configurations.containsKey(type)) {
 -            Map<String, String> mergedConfig = configHelper.getMergedConfig(allLevelMergedConfig,
 -                configurations.get(type));
++            if (null != serviceComponent) {
++              repositoryVersion = serviceComponent.getDesiredRepositoryVersion();
++            }
++          }
++        }
+ 
 -            configurations.get(type).clear();
 -            configurations.get(type).putAll(mergedConfig);
++        Map<String, String> commandParams = executionCommand.getCommandParams();
+ 
 -          } else {
 -            configurations.put(type, new HashMap<>());
 -            configurations.get(type).putAll(allLevelMergedConfig);
++        if (null != repositoryVersion) {
++          // only set the version if it's not set and this is NOT an install
++          // command
++          if (!commandParams.containsKey(KeyNames.VERSION)
++              && executionCommand.getRoleCommand() != RoleCommand.INSTALL) {
++            commandParams.put(KeyNames.VERSION, repositoryVersion.getVersion());
+           }
 -        }
+ 
 -        Map<String, Map<String, Map<String, String>>> configAttributes = configHelper.getEffectiveConfigAttributes(
 -            cluster, executionCommand.getConfigurationTags());
++          StackId stackId = repositoryVersion.getStackId();
++          StackInfo stackInfo = ambariMetaInfo.getStack(stackId.getStackName(),
++              stackId.getStackVersion());
+ 
 -        for (Map.Entry<String, Map<String, Map<String, String>>> attributesOccurrence : configAttributes.entrySet()) {
 -          String type = attributesOccurrence.getKey();
 -          Map<String, Map<String, String>> attributes = attributesOccurrence.getValue();
++          if (!commandParams.containsKey(HOOKS_FOLDER)) {
++            commandParams.put(HOOKS_FOLDER, stackInfo.getStackHooksFolder());
++          }
+ 
 -          if (executionCommand.getConfigurationAttributes() != null) {
 -            if (!executionCommand.getConfigurationAttributes().containsKey(type)) {
 -              executionCommand.getConfigurationAttributes().put(type, new TreeMap<>());
 -            }
 -            configHelper.cloneAttributesMap(attributes,
 -                executionCommand.getConfigurationAttributes().get(type));
++          if (!commandParams.containsKey(SERVICE_PACKAGE_FOLDER)) {
++            if (!StringUtils.isEmpty(serviceName)) {
++              ServiceInfo serviceInfo = ambariMetaInfo.getService(stackId.getStackName(),
++                  stackId.getStackVersion(), serviceName);
++
++              commandParams.put(SERVICE_PACKAGE_FOLDER, serviceInfo.getServicePackageFolder());
+             }
++          }
+         }
++      } catch (ServiceNotFoundException serviceNotFoundException) {
++        // it's possible that there are commands specified for a service where
++        // the service doesn't exist yet
++        LOG.warn(
++            "The service {} is not installed in the cluster. No repository version will be sent for this command.",
++            executionCommand.getServiceName());
+       }
+ 
 -      setVersions(cluster);
++      // set the desired versions of versionable components.  This is safe even during an upgrade because
++      // we are "loading-late": components that have not yet upgraded in an EU will have the correct versions.
++      executionCommand.setComponentVersions(cluster);
+ 
+       // provide some basic information about a cluster upgrade if there is one
+       // in progress
+       UpgradeEntity upgrade = cluster.getUpgradeInProgress();
+       if (null != upgrade) {
+         UpgradeContext upgradeContext = upgradeContextFactory.create(cluster, upgrade);
+         UpgradeSummary upgradeSummary = upgradeContext.getUpgradeSummary();
+         executionCommand.setUpgradeSummary(upgradeSummary);
+       }
 -
      } catch (ClusterNotFoundException cnfe) {
        // it's possible that there are commands without clusters; in such cases,
        // just return the de-serialized command and don't try to read configs

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/ActionQueue.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/ActionQueue.java
index 9c2df47,f063451..6c9380b
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ActionQueue.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ActionQueue.java
@@@ -34,10 -36,9 +34,10 @@@ import org.slf4j.LoggerFactory
  import com.google.inject.Singleton;
  
  @Singleton
 +//TODO remove this entity in future
  public class ActionQueue {
  
-   private static Logger LOG = LoggerFactory.getLogger(ActionQueue.class);
+   private static final Logger LOG = LoggerFactory.getLogger(ActionQueue.class);
  
    private static HashSet<String> EMPTY_HOST_LIST = new HashSet<>();
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentEnv.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
index 07029c7,be837db..a4324ee
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
@@@ -45,11 -44,12 +45,14 @@@ public class AlertDefinitionCommand ext
    private final String m_clusterName;
  
    @SerializedName("hostName")
 +  @com.fasterxml.jackson.annotation.JsonProperty("hostName")
    private final String m_hostName;
  
+   @SerializedName("publicHostName")
+   private final String m_publicHostName;
+ 
    @SerializedName("hash")
 +  @com.fasterxml.jackson.annotation.JsonProperty("hash")
    private final String m_hash;
  
    @SerializedName("alertDefinitions")

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertExecutionCommand.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/CancelCommand.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandReport.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java
index 0000000,301f475..858a55f
mode 000000,100644..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java
@@@ -1,0 -1,247 +1,202 @@@
+ /**
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.ambari.server.agent;
+ 
+ import java.util.ArrayList;
+ import java.util.Collection;
+ import java.util.List;
+ 
+ import org.apache.ambari.server.orm.entities.RepositoryEntity;
+ import org.apache.ambari.server.state.RepositoryInfo;
+ import org.apache.commons.lang.builder.ToStringBuilder;
+ 
+ import com.google.gson.annotations.SerializedName;
+ 
+ /**
+  * Wraps the information required to create repositories from a command.  This was added
+  * as a top level command object.
+  */
+ public class CommandRepository {
+ 
+   @SerializedName("repositories")
+   private List<Repository> m_repositories = new ArrayList<>();
+ 
+   @SerializedName("repoVersion")
+   private String m_repoVersion;
+ 
+   @SerializedName("repoVersionId")
+   private long m_repoVersionId;
+ 
+   @SerializedName("stackName")
+   private String m_stackName;
+ 
+   /**
 -   * {@code true} if Ambari believes that this repository has reported back it's
 -   * version after distribution.
 -   */
 -  @SerializedName("resolved")
 -  private boolean m_resolved;
 -
 -  /**
+    * @param version the repo version
+    */
+   public void setRepositoryVersion(String version) {
+     m_repoVersion = version;
+   }
+ 
+   /**
+    * @param id the repository id
+    */
+   public void setRepositoryVersionId(long id) {
+     m_repoVersionId = id;
+   }
+ 
+   /**
+    * @param name the stack name
+    */
+   public void setStackName(String name) {
+     m_stackName = name;
+   }
+ 
+   /**
+    * @param repositories the repositories if sourced from the stack instead of the repo_version.
+    */
+   public void setRepositories(Collection<RepositoryInfo> repositories) {
+     m_repositories = new ArrayList<>();
+ 
+     for (RepositoryInfo info : repositories) {
+       m_repositories.add(new Repository(info));
+     }
+   }
+ 
+   /**
+    * @param osType        the OS type for the repositories
+    * @param repositories  the repository entities that should be processed into a file
+    */
+   public void setRepositories(String osType, Collection<RepositoryEntity> repositories) {
+     m_repositories = new ArrayList<>();
+ 
+     for (RepositoryEntity entity : repositories) {
+       m_repositories.add(new Repository(osType, entity));
+     }
+   }
+ 
+   /**
+    * @return the repositories that the command should process into a file.
+    */
+   public Collection<Repository> getRepositories() {
+     return m_repositories;
+   }
+ 
+   /**
+    * Sets a uniqueness on the repo ids.
+    *
+    * @param suffix  the repo id suffix
+    */
+   public void setUniqueSuffix(String suffix) {
+     for (Repository repo : m_repositories) {
+       repo.m_repoId = repo.m_repoId + suffix;
+     }
+   }
+ 
+   /**
+    * Sets fields for non-managed
+    */
+   public void setNonManaged() {
+     for (Repository repo : m_repositories) {
+       repo.m_baseUrl = null;
+       repo.m_mirrorsList = null;
+       repo.m_ambariManaged = false;
+     }
+   }
+ 
+   /**
 -   * Gets whether this repository has been marked as having its version
 -   * resolved.
 -   *
 -   * @return {@code true} if this repository has been confirmed to have the
 -   *         right version.
 -   */
 -  public boolean isResolved() {
 -    return m_resolved;
 -  }
 -
 -  /**
 -   * Gets whether this repository has had its version resolved.
 -   *
 -   * @param resolved
 -   *          {@code true} to mark this repository as being resolved.
 -   */
 -  public void setResolved(boolean resolved) {
 -    m_resolved = resolved;
 -  }
 -
 -  /**
+    * Minimal information required to generate repo files on the agent.  These are copies
+    * of the repository objects from repo versions that can be changed for URL overrides, etc.
+    */
+   public static class Repository {
+ 
+     @SerializedName("baseUrl")
+     private String m_baseUrl;
+ 
+     @SerializedName("repoId")
+     private String m_repoId;
+ 
+     @SerializedName("ambariManaged")
+     private boolean m_ambariManaged = true;
+ 
 -
++    /**
++     * The name should not change.  Ubuntu requires that it match exactly as the repo was built.
++     */
+     @SerializedName("repoName")
+     private final String m_repoName;
+ 
 -    @SerializedName("distribution")
 -    private final String m_distribution;
 -
 -    @SerializedName("components")
 -    private final String m_components;
 -
+     @SerializedName("mirrorsList")
+     private String m_mirrorsList;
+ 
+     private transient String m_osType;
+ 
+     private Repository(RepositoryInfo info) {
+       m_baseUrl = info.getBaseUrl();
+       m_osType = info.getOsType();
+       m_repoId = info.getRepoId();
+       m_repoName = info.getRepoName();
 -      m_distribution = info.getDistribution();
 -      m_components = info.getComponents();
+       m_mirrorsList = info.getMirrorsList();
+     }
+ 
+     private Repository(String osType, RepositoryEntity entity) {
+       m_baseUrl = entity.getBaseUrl();
+       m_repoId = entity.getRepositoryId();
+       m_repoName = entity.getName();
 -      m_distribution = entity.getDistribution();
 -      m_components = entity.getComponents();
+       m_mirrorsList = entity.getMirrorsList();
+       m_osType = osType;
+     }
+ 
+     public void setBaseUrl(String url) {
+       m_baseUrl = url;
+     }
+ 
+     public String getOsType() {
+       return m_osType;
+     }
+ 
+     public String getRepoId() {
+       return m_repoId;
+     }
+ 
+     public String getRepoName() {
+       return m_repoName;
+     }
+ 
 -    public String getDistribution() {
 -      return m_distribution;
 -    }
 -
 -    public String getComponents() {
 -      return m_components;
 -    }
+ 
+     public String getBaseUrl() {
+       return m_baseUrl;
+     }
+ 
+     public boolean isAmbariManaged() {
+       return m_ambariManaged;
+     }
+ 
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public String toString() {
+       return new ToStringBuilder(null)
+           .append("os", m_osType)
+           .append("name", m_repoName)
 -          .append("distribution", m_distribution)
 -          .append("components", m_components)
+           .append("id", m_repoId)
+           .append("baseUrl", m_baseUrl)
+           .toString();
+     }
+ 
+   }
+ }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/ComponentStatus.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/ComponentStatus.java
index 74e134c,b5af218..293f4a3
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ComponentStatus.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ComponentStatus.java
@@@ -158,8 -132,8 +132,8 @@@ public class ComponentStatus 
    @Override
    public String toString() {
      return "ComponentStatus [componentName=" + componentName + ", msg=" + msg
-         + ", status=" + status + ", securityState=" + securityState
+         + ", status=" + status
 -        + ", serviceName=" + serviceName + ", clusterName=" + clusterName
 +        + ", serviceName=" + serviceName + ", clusterId=" + clusterId
          + ", stackVersion=" + stackVersion + ", configurationTags="
          + configurationTags + ", extra=" + extra + "]";
    }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/DiskInfo.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
index c6e569b,fd27169..8cddd95
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
@@@ -24,14 -24,18 +24,20 @@@ import java.util.List
  import java.util.Map;
  import java.util.Set;
  
+ import org.apache.ambari.annotations.Experimental;
+ import org.apache.ambari.annotations.ExperimentalFeature;
+ import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.RoleCommand;
- import org.apache.ambari.server.state.ServiceInfo;
+ import org.apache.ambari.server.state.Cluster;
+ import org.apache.ambari.server.state.Service;
+ import org.apache.ambari.server.state.ServiceComponent;
+ import org.apache.ambari.server.state.UpgradeContext.UpgradeSummary;
  import org.apache.ambari.server.utils.StageUtils;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
  
 +import com.fasterxml.jackson.annotation.JsonIgnore;
 +import com.fasterxml.jackson.annotation.JsonInclude;
  import com.google.gson.annotations.SerializedName;
  
  
@@@ -39,10 -43,9 +45,10 @@@
   * Execution commands are scheduled by action manager, and these are
   * persisted in the database for recovery.
   */
 +@JsonInclude(JsonInclude.Include.NON_EMPTY)
  public class ExecutionCommand extends AgentCommand {
  
-   private static Log LOG = LogFactory.getLog(ExecutionCommand.class);
+   private static final Logger LOG = LoggerFactory.getLogger(ExecutionCommand.class);
  
    public ExecutionCommand() {
      super(AgentCommandType.EXECUTION_COMMAND);
@@@ -171,9 -144,22 +177,23 @@@
     *   </pre>
     */
    @SerializedName("configuration_credentials")
 +  @JsonIgnore
    private Map<String, Map<String, String>> configurationCredentials;
  
+ 
+   /**
+    * Provides information regarding the content of repositories.  This structure replaces
+    * the deprecated use of {@link KeyNames#REPO_INFO}
+    */
+   @SerializedName("repositoryFile")
+   private CommandRepository commandRepository;
+ 
+   @SerializedName("componentVersionMap")
+   private Map<String, Map<String, String>> componentVersionMap = new HashMap<>();
+ 
+   @SerializedName("upgradeSummary")
+   private UpgradeSummary upgradeSummary;
+ 
    public void setConfigurationCredentials(Map<String, Map<String, String>> configurationCredentials) {
      this.configurationCredentials = configurationCredentials;
    }
@@@ -424,15 -398,21 +432,29 @@@
      kerberosCommandParams =  params;
    }
  
 +  public String getClusterId() {
 +    return clusterId;
 +  }
 +
 +  public void setClusterId(String clusterId) {
 +    this.clusterId = clusterId;
 +  }
 +
    /**
+    * @return the repository file that is to be written.
+    */
+   public CommandRepository getRepositoryFile() {
+     return commandRepository;
+   }
+ 
+   /**
+    * @param repository  the command repository instance.
+    */
+   public void setRepositoryFile(CommandRepository repository) {
+     commandRepository = repository;
+   }
+ 
+   /**
     * Contains key name strings. These strings are used inside maps
     * incapsulated inside command.
     */
@@@ -505,7 -497,72 +539,73 @@@
       * The agent will return this value back in its response so the repository
       * can be looked up and possibly have its version updated.
       */
+     @Deprecated
+     @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES)
      String REPO_VERSION_ID = "repository_version_id";
 +    String CLUSTER_NAME = "cluster_name";
+ 
+     /**
+      * The version of the component to send down with the command. Normally,
+      * this is simply the repository version of the component. However, during
+      * upgrades, this value may change depending on the progress of the upgrade
+      * and the type/direction.
+      */
+     @Experimental(
+         feature = ExperimentalFeature.PATCH_UPGRADES,
+         comment = "Change this to reflect the component version")
+     String VERSION = "version";
+   }
+ 
+   /**
+    * @return
+    */
+   public Map<String, Map<String, String>> getComponentVersionMap() {
+     return componentVersionMap;
+   }
+ 
+   /**
+    * Used to set a map of {service -> { component -> version}}.  This is necessary when performing
+    * an upgrade to correct build paths of required binaries.
+    * @param cluster the cluster from which to build the map
+    */
+   public void setComponentVersions(Cluster cluster) throws AmbariException {
+     Map<String, Map<String, String>> componentVersionMap = new HashMap<>();
+ 
+     for (Service service : cluster.getServices().values()) {
+       Map<String, String> componentMap = new HashMap<>();
+ 
+       boolean shouldSet = false;
+       for (ServiceComponent component : service.getServiceComponents().values()) {
+         if (component.isVersionAdvertised()) {
+           shouldSet = true;
+           componentMap.put(component.getName(), component.getDesiredVersion());
+         }
+       }
+ 
+       if (shouldSet) {
+         componentVersionMap.put(service.getName(), componentMap);
+       }
+     }
+ 
+     this.componentVersionMap = componentVersionMap;
+   }
+ 
+   /**
+    * Sets the upgrade summary if there is an active upgrade in the cluster.
+    *
+    * @param upgradeSummary
+    *          the upgrade or {@code null} for none.
+    */
+   public void setUpgradeSummary(UpgradeSummary upgradeSummary) {
+     this.upgradeSummary = upgradeSummary;
+   }
+ 
+   /**
+    * Gets the upgrade summary if there is an active upgrade in the cluster.
+    *
+    * @return the upgrade or {@code null} for none.
+    */
+   public UpgradeSummary getUpgradeSummary() {
+     return upgradeSummary;
    }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java
----------------------------------------------------------------------


[18/50] [abbrv] ambari git commit: AMBARI-22046. Infra Manager: Integrate with Spring Boot (oleewere)

Posted by ao...@apache.org.
AMBARI-22046. Infra Manager: Integrate with Spring Boot (oleewere)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6633a7bd
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6633a7bd
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6633a7bd

Branch: refs/heads/branch-3.0-perf
Commit: 6633a7bd44fcbc660956a7e188e2ac63472c6de3
Parents: 520d8fc
Author: Oliver Szabo <ol...@gmail.com>
Authored: Sun Sep 24 14:22:14 2017 +0200
Committer: Oliver Szabo <ol...@gmail.com>
Committed: Mon Sep 25 20:18:03 2017 +0200

----------------------------------------------------------------------
 ambari-infra/ambari-infra-manager/.gitignore    |   2 +
 .../ambari-infra-manager/docker/bin/start.sh    |   2 +-
 ambari-infra/ambari-infra-manager/pom.xml       | 172 ++++++++-------
 .../org/apache/ambari/infra/InfraManager.java   | 208 +++----------------
 .../infra/common/InfraManagerConstants.java     |  31 ---
 .../infra/conf/InfraManagerDataConfig.java      |  37 ++++
 .../conf/InfraManagerJerseyResourceConfig.java  |  37 ++++
 .../infra/conf/InfraManagerServletConfig.java   |  83 ++++++++
 .../infra/conf/StaticResourceConfiguration.java |  49 +++++
 .../infra/doc/InfraManagerApiDocStorage.java    |  90 ++++++++
 .../ambari/infra/job/dummy/DummyItemWriter.java |  15 +-
 .../ambari/infra/rest/ApiDocResource.java       |  56 +++++
 .../src/main/resources/infra-manager.properties |   4 +-
 .../src/main/resources/log4j.xml                |  31 ---
 .../src/main/resources/log4j2.xml               |  41 ++++
 .../src/main/resources/static/index.html        |  24 +++
 .../src/main/resources/swagger/swagger.html     |  36 ++--
 .../src/main/resources/webapp/index.html        |  24 ---
 18 files changed, 556 insertions(+), 386 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/.gitignore
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/.gitignore b/ambari-infra/ambari-infra-manager/.gitignore
new file mode 100644
index 0000000..ba4e51d
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/.gitignore
@@ -0,0 +1,2 @@
+out/*
+*.pid
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/docker/bin/start.sh
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/docker/bin/start.sh b/ambari-infra/ambari-infra-manager/docker/bin/start.sh
index 076c06f..2402778 100755
--- a/ambari-infra/ambari-infra-manager/docker/bin/start.sh
+++ b/ambari-infra/ambari-infra-manager/docker/bin/start.sh
@@ -16,6 +16,6 @@
 
 export INFRA_MANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=5007,server=y,suspend=n"
 touch /root/infra-manager.log
-/root/ambari-infra-manager/infraManager.sh --port 61890 > /root/infra-manager.log
+/root/ambari-infra-manager/infraManager.sh > /root/infra-manager.log
 tail -f /root/infra-manager.log
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/pom.xml b/ambari-infra/ambari-infra-manager/pom.xml
index b9f2a77..aa86da8 100644
--- a/ambari-infra/ambari-infra-manager/pom.xml
+++ b/ambari-infra/ambari-infra-manager/pom.xml
@@ -30,15 +30,17 @@
   <artifactId>ambari-infra-manager</artifactId>
 
   <properties>
-    <spring.version>4.2.5.RELEASE</spring.version>
-    <spring.security.version>4.0.4.RELEASE</spring.security.version>
-    <jersey.version>2.23.2</jersey.version>
-    <jetty-version>9.2.11.v20150529</jetty-version>
-    <swagger.version>1.5.8</swagger.version>
-    <spring-data-solr.version>2.0.2.RELEASE</spring-data-solr.version>
-    <jjwt.version>0.6.0</jjwt.version>
+    <spring.version>4.3.10.RELEASE</spring.version>
+    <spring.security.version>4.2.3.RELEASE</spring.security.version>
+    <spring.ldap.version>2.0.4.RELEASE</spring.ldap.version>
+    <jersey.version>2.25.1</jersey.version>
+    <jetty.version>9.4.6.v20170531</jetty.version>
     <spring-batch.version>3.0.7.RELEASE</spring-batch.version>
     <sqlite.version>3.8.11.2</sqlite.version>
+    <spring-data-solr.version>2.0.2.RELEASE</spring-data-solr.version>
+    <spring-boot.version>1.5.6.RELEASE</spring-boot.version>
+    <swagger.version>1.5.16</swagger.version>
+    <jjwt.version>0.6.0</jjwt.version>
   </properties>
 
   <build>
@@ -69,6 +71,21 @@
         </configuration>
       </plugin>
       <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <version>${spring-boot.version}</version>
+        <configuration>
+          <classifier>exec</classifier>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.8</version>
@@ -161,53 +178,70 @@
       <artifactId>spring-security-ldap</artifactId>
       <version>${spring.security.version}</version>
     </dependency>
+
     <dependency>
-      <groupId>org.glassfish.jersey.ext</groupId>
-      <artifactId>jersey-spring3</artifactId>
-      <version>2.23.2</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+      <version>${spring-boot.version}</version>
       <exclusions>
         <exclusion>
-          <groupId>org.springframework</groupId>
-          <artifactId>*</artifactId>
+          <groupId>org.springframework.boot</groupId>
+          <artifactId>spring-boot-starter-logging</artifactId>
         </exclusion>
       </exclusions>
     </dependency>
     <dependency>
-      <groupId>org.glassfish.jersey.connectors</groupId>
-      <artifactId>jersey-apache-connector</artifactId>
-      <version>${jersey.version}</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-log4j2</artifactId>
+      <version>${spring-boot.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.glassfish.jersey.core</groupId>
-      <artifactId>jersey-client</artifactId>
-      <version>${jersey.version}</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <version>${spring-boot.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.glassfish.jersey.media</groupId>
-      <artifactId>jersey-media-json-jettison</artifactId>
-      <version>${jersey.version}</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+      <version>${spring-boot.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.glassfish.jersey.media</groupId>
-      <artifactId>jersey-media-json-jackson</artifactId>
-      <version>${jersey.version}</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+      <version>${spring-boot.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.glassfish.jersey.core</groupId>
-      <artifactId>jersey-common</artifactId>
-      <version>${jersey.version}</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-jetty</artifactId>
+      <version>${spring-boot.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-jersey</artifactId>
+      <version>${spring-boot.version}</version>
     </dependency>
     <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>3.1.0</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-freemarker</artifactId>
+      <version>${spring-boot.version}</version>
     </dependency>
     <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.17</version>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-autoconfigure</artifactId>
+      <version>${spring-boot.version}</version>
     </dependency>
     <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-configuration-processor</artifactId>
+      <version>${spring-boot.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.media</groupId>
+      <artifactId>jersey-media-json-jettison</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+    
+    <dependency>
       <groupId>org.apache.solr</groupId>
       <artifactId>solr-solrj</artifactId>
       <version>${solr.version}</version>
@@ -267,6 +301,10 @@
           <groupId>com.sun.jersey</groupId>
           <artifactId>jersey-server</artifactId>
         </exclusion>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-log4j12</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>
@@ -303,53 +341,6 @@
       <version>1.0.1.RELEASE</version>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlets</artifactId>
-      <version>${jetty-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty-version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.springframework</groupId>
-          <artifactId>*</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-annotations</artifactId>
-      <version>${jetty-version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.springframework</groupId>
-          <artifactId>*</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
       <groupId>cglib</groupId>
       <artifactId>cglib</artifactId>
       <version>3.2.4</version>
@@ -386,11 +377,6 @@
       <version>2.1.0</version>
     </dependency>
     <dependency>
-      <groupId>org.springframework.data</groupId>
-      <artifactId>spring-data-solr</artifactId>
-      <version>${spring-data-solr.version}</version>
-    </dependency>
-    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context-support</artifactId>
       <version>${spring.version}</version>
@@ -411,11 +397,6 @@
       <version>${jjwt.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.glassfish.jersey.ext</groupId>
-      <artifactId>jersey-bean-validation</artifactId>
-      <version>2.25</version>
-    </dependency>
-    <dependency>
       <groupId>org.xerial</groupId>
       <artifactId>sqlite-jdbc</artifactId>
       <version>${sqlite.version}</version>
@@ -424,6 +405,17 @@
       <groupId>org.springframework.batch</groupId>
       <artifactId>spring-batch-admin-manager</artifactId>
       <version>1.3.1.RELEASE</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-log4j12</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <artifactId>guava</artifactId>
+      <groupId>com.google.guava</groupId>
+      <version>20.0</version>
     </dependency>
   </dependencies>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java
index 186f98c..185e344 100644
--- a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java
@@ -18,192 +18,32 @@
  */
 package org.apache.ambari.infra;
 
-import org.apache.ambari.infra.conf.InfraManagerConfig;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.DefaultParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.handler.HandlerList;
-import org.eclipse.jetty.server.handler.ResourceHandler;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.resource.ResourceCollection;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.web.context.ContextLoaderListener;
-import org.springframework.web.context.request.RequestContextListener;
-import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-import static org.apache.ambari.infra.common.InfraManagerConstants.DATA_FOLDER_LOCATION_PARAM;
-import static org.apache.ambari.infra.common.InfraManagerConstants.DEFAULT_DATA_FOLDER_LOCATION;
-import static org.apache.ambari.infra.common.InfraManagerConstants.DEFAULT_PORT;
-import static org.apache.ambari.infra.common.InfraManagerConstants.DEFAULT_PROTOCOL;
-import static org.apache.ambari.infra.common.InfraManagerConstants.INFRA_MANAGER_SESSION_ID;
-import static org.apache.ambari.infra.common.InfraManagerConstants.PROTOCOL_SSL;
-import static org.apache.ambari.infra.common.InfraManagerConstants.ROOT_CONTEXT;
-import static org.apache.ambari.infra.common.InfraManagerConstants.SESSION_TIMEOUT;
-import static org.apache.ambari.infra.common.InfraManagerConstants.WEB_RESOURCE_FOLDER;
-
+import org.springframework.boot.Banner;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.system.ApplicationPidFileWriter;
+
+@SpringBootApplication(
+  scanBasePackages = {"org.apache.ambari.infra"},
+  exclude = {
+    RepositoryRestMvcAutoConfiguration.class,
+    WebMvcAutoConfiguration.class,
+    BatchAutoConfiguration.class,
+    SecurityAutoConfiguration.class
+  }
+)
 public class InfraManager {
 
-  private static final Logger LOG = LoggerFactory.getLogger(InfraManager.class);
-
   public static void main(String[] args) {
-    Options options = new Options();
-    HelpFormatter helpFormatter = new HelpFormatter();
-    helpFormatter.setDescPadding(10);
-    helpFormatter.setWidth(200);
-
-    final Option helpOption = Option.builder("h")
-      .longOpt("help")
-      .desc("Print commands")
-      .build();
-
-    final Option portOption = Option.builder("p")
-      .longOpt("port")
-      .desc("Infra Manager port")
-      .numberOfArgs(1)
-      .argName("port_number")
-      .build();
-
-    final Option dataFolderOption = Option.builder("df")
-      .longOpt("data-folder")
-      .desc("Infra Manager data folder location")
-      .numberOfArgs(1)
-      .argName("data_folder")
-      .build();
-
-    final Option protocolOption = Option.builder("t")
-      .longOpt("tls-enabled")
-      .desc("TLS enabled for Infra Manager")
-      .build();
-
-    options.addOption(helpOption);
-    options.addOption(portOption);
-    options.addOption(protocolOption);
-    options.addOption(dataFolderOption);
-
-    try {
-      CommandLineParser cmdLineParser = new DefaultParser();
-      CommandLine cli = cmdLineParser.parse(options, args);
-      int port = cli.hasOption('p') ? Integer.parseInt(cli.getOptionValue('p')) : DEFAULT_PORT;
-      String protocol = cli.hasOption("t") ? PROTOCOL_SSL : DEFAULT_PROTOCOL;
-      String dataFolder = cli.hasOption("df") ? cli.getOptionValue("df"): DEFAULT_DATA_FOLDER_LOCATION;
-
-      System.setProperty(DATA_FOLDER_LOCATION_PARAM, dataFolder); // be able to access it from jobs
-
-      Server server = buildServer(port, protocol);
-      HandlerList handlers = new HandlerList();
-      handlers.addHandler(createSwaggerContext());
-      handlers.addHandler(createBaseWebappContext(dataFolder));
-
-      server.setHandler(handlers);
-      server.start();
-
-      LOG.debug("============================Server Dump=======================================");
-      LOG.debug(server.dump());
-      LOG.debug("==============================================================================");
-      server.join();
-    } catch (Exception e) {
-      // TODO
-      e.printStackTrace();
-    }
-  }
-
-  private static Server buildServer(int port, String protocol) {
-    Server server = new Server();
-    HttpConfiguration httpConfiguration = new HttpConfiguration();
-    httpConfiguration.setRequestHeaderSize(65535);
-    // TODO: tls
-    ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration));
-    connector.setPort(port);
-    server.setConnectors(new Connector[]{connector});
-    URI infraManagerURI = URI.create(String.format("%s://0.0.0.0:%s", protocol, String.valueOf(port)));
-    LOG.info("Starting infra manager URI=" + infraManagerURI);
-    return server;
-  }
-
-  private static WebAppContext createBaseWebappContext(String dataFolder) throws MalformedURLException {
-    URI webResourceBase = findWebResourceBase();
-    WebAppContext context = new WebAppContext();
-    ResourceCollection resources = new ResourceCollection(Resource.newResource(webResourceBase));
-    context.setBaseResource(resources);
-    context.setContextPath(ROOT_CONTEXT);
-    context.setParentLoaderPriority(true);
-
-    // Data folder servlet
-    ServletHolder dataServlet = new ServletHolder("static-data", DefaultServlet.class);
-    dataServlet.setInitParameter("dirAllowed","true");
-    dataServlet.setInitParameter("pathInfoOnly","true");
-    dataServlet.setInitParameter("resourceBase", dataFolder);
-
-    context.addServlet(dataServlet,"/files/*");
-
-    // Configure Spring
-    context.addEventListener(new ContextLoaderListener());
-    context.addEventListener(new RequestContextListener());
-    // TODO: security, add: context.addFilter(new FilterHolder(new DelegatingFilterProxy("springSecurityFilterChain")), "/*", EnumSet.allOf(DispatcherType.class));
-    context.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName());
-    context.setInitParameter("contextConfigLocation", InfraManagerConfig.class.getName());
-
-    // Configure Jersey
-    ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/api/v1/*");
-    jerseyServlet.setInitOrder(1);
-    jerseyServlet.setInitParameter("jersey.config.server.provider.packages","org.apache.ambari.infra.rest,io.swagger.jaxrs.listing");
-
-    context.getSessionHandler().getSessionManager().setMaxInactiveInterval(SESSION_TIMEOUT);
-    context.getSessionHandler().getSessionManager().getSessionCookieConfig().setName(INFRA_MANAGER_SESSION_ID);
-
-    return context;
-  }
-
-  private static URI findWebResourceBase() {
-    URL fileCompleteUrl = Thread.currentThread().getContextClassLoader().getResource(WEB_RESOURCE_FOLDER);
-    String errorMessage = "Web Resource Folder " + WEB_RESOURCE_FOLDER + " not found in classpath";
-    if (fileCompleteUrl != null) {
-      try {
-        return fileCompleteUrl.toURI().normalize();
-      } catch (URISyntaxException e) {
-        LOG.error(errorMessage, e);
-        System.exit(1);
-      }
-    } else {
-      LOG.error(errorMessage);
-      System.exit(1);
-    }
-    throw new IllegalStateException(errorMessage);
-  }
-
-  private static ServletContextHandler createSwaggerContext() throws URISyntaxException {
-    ResourceHandler resourceHandler = new ResourceHandler();
-    ResourceCollection resources = new ResourceCollection(new String[] {
-      InfraManager.class.getClassLoader()
-        .getResource("META-INF/resources/webjars/swagger-ui/2.1.0")
-        .toURI().toString(),
-      InfraManager.class.getClassLoader()
-        .getResource("swagger")
-        .toURI().toString()
-    });
-    resourceHandler.setBaseResource(resources);
-    resourceHandler.setWelcomeFiles(new String[]{"swagger.html"}); // rewrite index.html from swagger-ui webjar
-    ServletContextHandler context = new ServletContextHandler();
-    context.setContextPath("/docs/");
-    context.setHandler(resourceHandler);
-    return context;
+    String pidFile = System.getenv("PID_FILE") == null ? "infra-manager.pid" : System.getenv("PID_FILE");
+    new SpringApplicationBuilder(InfraManager.class)
+      .bannerMode(Banner.Mode.OFF)
+      .listeners(new ApplicationPidFileWriter(pidFile))
+      .web(true)
+      .run(args);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java
deleted file mode 100644
index 105f20e..0000000
--- a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.ambari.infra.common;
-
-public final class InfraManagerConstants {
-  public static final int DEFAULT_PORT = 61890;
-  public static final String DEFAULT_PROTOCOL = "http";
-  public static final String INFRA_MANAGER_SESSION_ID = "INFRA_MANAGER_SESSIONID";
-  public static final String PROTOCOL_SSL = "https";
-  public static final String ROOT_CONTEXT = "/";
-  public static final String WEB_RESOURCE_FOLDER = "webapp";
-  public static final String DEFAULT_DATA_FOLDER_LOCATION = "/opt/ambari-infra-manager/data";
-  public static final String DATA_FOLDER_LOCATION_PARAM = "dataFolderLocation";
-  public static final Integer SESSION_TIMEOUT = 60 * 30;
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerDataConfig.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerDataConfig.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerDataConfig.java
new file mode 100644
index 0000000..b5b215e
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerDataConfig.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ambari.infra.conf;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class InfraManagerDataConfig {
+
+  @Value("${infra-manager.server.data.folder:/opt/ambari-infra-manager/data}")
+  private String dataFolder;
+
+  public String getDataFolder() {
+    return dataFolder;
+  }
+
+  public void setDataFolder(String dataFolder) {
+    this.dataFolder = dataFolder;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerJerseyResourceConfig.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerJerseyResourceConfig.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerJerseyResourceConfig.java
new file mode 100644
index 0000000..3a4c00f
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerJerseyResourceConfig.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ambari.infra.conf;
+
+import org.apache.ambari.infra.rest.JobResource;
+import org.glassfish.jersey.jackson.JacksonFeature;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.servlet.ServletProperties;
+
+import javax.ws.rs.ApplicationPath;
+
+@ApplicationPath("/api/v1")
+public class InfraManagerJerseyResourceConfig extends ResourceConfig {
+
+  public InfraManagerJerseyResourceConfig() {
+    packages(JobResource.class.getPackage().getName());
+    register(JacksonFeature.class);
+    property(ServletProperties.FILTER_FORWARD_ON_404, true);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerServletConfig.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerServletConfig.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerServletConfig.java
new file mode 100644
index 0000000..06aea79
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerServletConfig.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ambari.infra.conf;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.glassfish.jersey.servlet.ServletContainer;
+import org.glassfish.jersey.servlet.ServletProperties;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
+import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer;
+import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.inject.Inject;
+
+@Configuration
+public class InfraManagerServletConfig {
+
+  private static final Integer SESSION_TIMEOUT = 60 * 30;
+  private static final String INFRA_MANAGER_SESSIONID = "INFRAMANAGER_SESSIONID";
+  private static final String INFRA_MANAGER_APPLICATION_NAME = "infra-manager";
+
+  @Value("${infra-manager.server.port:61890}")
+  private int port;
+
+  @Inject
+  private ServerProperties serverProperties;
+
+  @Inject
+  private InfraManagerDataConfig infraManagerDataConfig;
+
+
+  @Bean
+  public ServletRegistrationBean jerseyServlet() {
+    ServletRegistrationBean jerseyServletBean = new ServletRegistrationBean(new ServletContainer(), "/api/v1/*");
+    jerseyServletBean.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, InfraManagerJerseyResourceConfig.class.getName());
+    return jerseyServletBean;
+  }
+
+  @Bean
+  public ServletRegistrationBean dataServlet() {
+    ServletRegistrationBean dataServletBean = new ServletRegistrationBean(new DefaultServlet(), "/files/*");
+    dataServletBean.addInitParameter("dirAllowed","true");
+    dataServletBean.addInitParameter("pathInfoOnly","true");
+    dataServletBean.addInitParameter("resourceBase", infraManagerDataConfig.getDataFolder());
+    return dataServletBean;
+  }
+
+  @Bean
+  public EmbeddedServletContainerFactory containerFactory() {
+    final JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory = new JettyEmbeddedServletContainerFactory() {
+      @Override
+      protected JettyEmbeddedServletContainer getJettyEmbeddedServletContainer(Server server) {
+        return new JettyEmbeddedServletContainer(server);
+      }
+    };
+    jettyEmbeddedServletContainerFactory.setSessionTimeout(SESSION_TIMEOUT);
+    serverProperties.getSession().getCookie().setName(INFRA_MANAGER_SESSIONID);
+    serverProperties.setDisplayName(INFRA_MANAGER_APPLICATION_NAME);
+    jettyEmbeddedServletContainerFactory.setPort(port);
+    return jettyEmbeddedServletContainerFactory;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/StaticResourceConfiguration.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/StaticResourceConfiguration.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/StaticResourceConfiguration.java
new file mode 100644
index 0000000..f0cd3cf
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/StaticResourceConfiguration.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ambari.infra.conf;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+@EnableWebMvc
+@Configuration
+public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
+
+  private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
+    "classpath:/static/", "classpath:/swagger/","classpath:META-INF/resources/webjars/"
+  };
+
+  @Override
+  public void addResourceHandlers(ResourceHandlerRegistry registry) {
+    registry.addResourceHandler("/**")
+      .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
+  }
+
+  @Override
+  public void addViewControllers(ViewControllerRegistry registry) {
+    registry.addViewController("/").setViewName(
+      "forward:/index.html");
+    registry.addViewController("/docs").setViewName(
+      "forward:/swagger.html");
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/doc/InfraManagerApiDocStorage.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/doc/InfraManagerApiDocStorage.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/doc/InfraManagerApiDocStorage.java
new file mode 100644
index 0000000..e536d9a
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/doc/InfraManagerApiDocStorage.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ambari.infra.doc;
+
+import io.swagger.jaxrs.config.BeanConfig;
+import io.swagger.models.Swagger;
+import io.swagger.util.Yaml;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+import javax.inject.Named;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Named
+public class InfraManagerApiDocStorage {
+
+  private static final Logger LOG = LoggerFactory.getLogger(InfraManagerApiDocStorage.class);
+
+  private final Map<String, Object> swaggerMap = new ConcurrentHashMap<>();
+
+  @Inject
+  private BeanConfig beanConfig;
+
+  @PostConstruct
+  private void postConstruct() {
+    Thread loadApiDocThread = new Thread("load_swagger_api_doc") {
+      @Override
+      public void run() {
+        LOG.info("Start thread to scan REST API doc from endpoints.");
+        Swagger swagger = beanConfig.getSwagger();
+        beanConfig.configure(swagger);
+        beanConfig.scanAndRead();
+        setSwagger(swagger);
+        try {
+          if (swagger != null) {
+            String yaml = Yaml.mapper().writeValueAsString(swagger);
+            StringBuilder b = new StringBuilder();
+            String[] parts = yaml.split("\n");
+            for (String part : parts) {
+              b.append(part);
+              b.append("\n");
+            }
+            setSwaggerYaml(b.toString());
+          }
+        } catch (Exception e) {
+          e.printStackTrace();
+        }
+        LOG.info("Scanning REST API endpoints and generating docs has been successful.");
+      }
+    };
+    loadApiDocThread.setDaemon(true);
+    loadApiDocThread.start();
+  }
+
+  public Swagger getSwagger() {
+    return (Swagger) swaggerMap.get("swaggerObject");
+  }
+
+  public void setSwagger(final Swagger swagger) {
+    swaggerMap.put("swaggerObject", swagger);
+  }
+
+  public void setSwaggerYaml(final String swaggerYaml) {
+    swaggerMap.put("swaggerYaml", swaggerYaml);
+  }
+
+  public String getSwaggerYaml() {
+    return (String) swaggerMap.get("swaggerYaml");
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyItemWriter.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyItemWriter.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyItemWriter.java
index 444f0d1..89ad013 100644
--- a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyItemWriter.java
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/job/dummy/DummyItemWriter.java
@@ -18,12 +18,14 @@
  */
 package org.apache.ambari.infra.job.dummy;
 
+import org.apache.ambari.infra.conf.InfraManagerDataConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.batch.core.StepExecution;
 import org.springframework.batch.core.annotation.BeforeStep;
 import org.springframework.batch.item.ItemWriter;
 
+import javax.inject.Inject;
 import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -31,27 +33,28 @@ import java.nio.file.Paths;
 import java.util.Date;
 import java.util.List;
 
-import static org.apache.ambari.infra.common.InfraManagerConstants.DATA_FOLDER_LOCATION_PARAM;
-
 public class DummyItemWriter implements ItemWriter<String> {
 
   private static final Logger LOG = LoggerFactory.getLogger(DummyItemWriter.class);
 
   private StepExecution stepExecution;
 
+  @Inject
+  private InfraManagerDataConfig infraManagerDataConfig;
+
   @Override
   public void write(List<? extends String> values) throws Exception {
     LOG.info("DummyItem writer called (values: {})... wait 1 seconds", values.toString());
     Thread.sleep(1000);
-    String outputDirectoryLocation = String.format("%s%s%s%s", System.getProperty(DATA_FOLDER_LOCATION_PARAM), File.separator, "dummyOutput-", new Date().getTime());
+    String outputDirectoryLocation = String.format("%s%s%s%s", infraManagerDataConfig.getDataFolder(), File.separator, "dummyOutput-", new Date().getTime());
     Path pathToDirectory = Paths.get(outputDirectoryLocation);
     Path pathToFile = Paths.get(String.format("%s%s%s", outputDirectoryLocation, File.separator, "dummyOutput.txt"));
     Files.createDirectories(pathToDirectory);
     LOG.info("Write location to step execution context...");
-    stepExecution.getExecutionContext().put("stepOutputLocation", pathToFile.getFileName().toAbsolutePath().toString());
+    stepExecution.getExecutionContext().put("stepOutputLocation", pathToFile.toAbsolutePath().toString());
     LOG.info("Write location to job execution context...");
-    stepExecution.getJobExecution().getExecutionContext().put("jobOutputLocation", pathToFile.getFileName().toAbsolutePath().toString());
-    LOG.info("Write to file: {}", pathToFile.getFileName().toAbsolutePath().toString());
+    stepExecution.getJobExecution().getExecutionContext().put("jobOutputLocation", pathToFile.toAbsolutePath().toString());
+    LOG.info("Write to file: {}", pathToFile.toAbsolutePath());
     Files.write(pathToFile, values.toString().getBytes());
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/ApiDocResource.java
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/ApiDocResource.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/ApiDocResource.java
new file mode 100644
index 0000000..18dfdd9
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/ApiDocResource.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ambari.infra.rest;
+
+import io.swagger.annotations.ApiOperation;
+import org.apache.ambari.infra.doc.InfraManagerApiDocStorage;
+import org.springframework.context.annotation.Scope;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("swagger.{type:json|yaml}")
+@Named
+@Scope("request")
+public class ApiDocResource {
+
+  @Inject
+  private InfraManagerApiDocStorage infraManagerApiDocStorage;
+
+  @GET
+  @Produces({MediaType.APPLICATION_JSON, "application/yaml"})
+  @ApiOperation(value = "The swagger definition in either JSON or YAML", hidden = true)
+  public Response swaggerDefinitionResponse(@PathParam("type") String type) {
+    Response response = Response.status(404).build();
+    if (infraManagerApiDocStorage.getSwagger() != null) {
+      if ("yaml".equalsIgnoreCase(type)) {
+        response = Response.ok().entity(infraManagerApiDocStorage.getSwaggerYaml()).type("application/yaml").build();
+      } else {
+        response = Response.ok().entity(infraManagerApiDocStorage.getSwagger()).build();
+      }
+    }
+    return response;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties b/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties
index fbeac78..8162376 100644
--- a/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties
+++ b/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties
@@ -15,4 +15,6 @@
 infra-manager.batch.db.file=job-repository.db
 infra-manager.batch.db.init=true
 infra-manager.batch.db.username=admin
-infra-manager.batch.db.password=admin
\ No newline at end of file
+infra-manager.batch.db.password=admin
+management.security.enabled=false
+management.health.solr.enabled=false

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml b/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml
deleted file mode 100644
index 0450454..0000000
--- a/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-  <appender name="console" class="org.apache.log4j.ConsoleAppender">
-    <param name="Target" value="System.out" />
-    <layout class="org.apache.log4j.PatternLayout">
-      <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n" />
-    </layout>
-  </appender>
-
-  <root>
-    <level value="INFO" />
-    <appender-ref ref="console" />
-  </root>
-</log4j:configuration>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/resources/log4j2.xml
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/log4j2.xml b/ambari-infra/ambari-infra-manager/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..ad1adcd
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/resources/log4j2.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<Configuration monitorinterval="30" status="info" strict="true">
+  <Properties>
+    <Property name="logging.file">out/infra-manager.log</Property>
+  </Properties>
+  <Appenders>
+    <Appender type="Console" name="Console">
+      <Layout type="PatternLayout" pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n" />
+    </Appender>
+    <RollingFile name="File" fileName="${logging.file}" filePattern="${logging.file}-%i-%d{yyyy-MM-dd}">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n" />
+      <Policies>
+        <TimeBasedTriggeringPolicy />
+        <SizeBasedTriggeringPolicy size="10 MB"/>
+      </Policies>
+      <DefaultRolloverStrategy max="10"/>
+    </RollingFile>
+  </Appenders>
+  <Loggers>
+    <Root level="info">
+      <AppenderRef ref="File" />
+      <AppenderRef ref="Console" />
+    </Root>
+  </Loggers>
+</Configuration>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/resources/static/index.html
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/static/index.html b/ambari-infra/ambari-infra-manager/src/main/resources/static/index.html
new file mode 100644
index 0000000..3e64867
--- /dev/null
+++ b/ambari-infra/ambari-infra-manager/src/main/resources/static/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+  <head>
+  </head>
+  <body>
+    <h1>Welcome!</h1>
+  </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html b/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html
index 8580e1a..52ebf61 100644
--- a/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html
+++ b/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html
@@ -18,24 +18,24 @@
 <html>
 <head>
     <title>Infra Manager REST API</title>
-    <link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32" />
-    <link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16" />
-    <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
-    <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
-    <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
-    <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
-    <link href='css/print.css' media='print' rel='stylesheet' type='text/css'/>
-    <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
-    <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
-    <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
-    <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
-    <script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>
-    <script src='lib/underscore-min.js' type='text/javascript'></script>
-    <script src='lib/backbone-min.js' type='text/javascript'></script>
-    <script src='swagger-ui.js' type='text/javascript'></script>
-    <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
-    <script src='lib/marked.js' type='text/javascript'></script>
-    <script src='lib/swagger-oauth.js' type='text/javascript'></script>
+    <link rel="icon" type="image/png" href="swagger-ui/2.1.0/images/favicon-32x32.png" sizes="32x32" />
+    <link rel="icon" type="image/png" href="swagger-ui/2.1.0/images/favicon-16x16.png" sizes="16x16" />
+    <link href='swagger-ui/2.1.0/css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
+    <link href='swagger-ui/2.1.0/css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
+    <link href='swagger-ui/2.1.0/css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
+    <link href='swagger-ui/2.1.0/css/reset.css' media='print' rel='stylesheet' type='text/css'/>
+    <link href='swagger-ui/2.1.0/css/print.css' media='print' rel='stylesheet' type='text/css'/>
+    <script src='swagger-ui/2.1.0/lib/jquery-1.8.0.min.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/jquery.slideto.min.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/jquery.wiggle.min.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/handlebars-2.0.0.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/underscore-min.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/backbone-min.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/swagger-ui.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/highlight.7.3.pack.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/marked.js' type='text/javascript'></script>
+    <script src='swagger-ui/2.1.0/lib/swagger-oauth.js' type='text/javascript'></script>
 
     <script type="text/javascript">
         $(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6633a7bd/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html b/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html
deleted file mode 100644
index 3e64867..0000000
--- a/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<html>
-  <head>
-  </head>
-  <body>
-    <h1>Welcome!</h1>
-  </body>
-</html>
\ No newline at end of file


[46/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index c62b4ce,5373ffe..c36e107
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
@@@ -164,14 -147,9 +158,12 @@@ public class HostResourceProvider exten
    protected static final String FORCE_DELETE_COMPONENTS = "force_delete_components";
  
  
-   private static Set<String> pkPropertyIds =
-     new HashSet<>(Arrays.asList(new String[]{
-       HOST_NAME_PROPERTY_ID}));
+   private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(HOST_HOST_NAME_PROPERTY_ID);
  
    @Inject
 +  private MaintenanceStateHelper maintenanceStateHelper;
 +
 +  @Inject
    private OsFamily osFamily;
  
    @Inject
@@@ -542,41 -497,80 +525,106 @@@
          clusterSet.add(hostRequest.getClusterName());
          allClusterSet.add(hostRequest.getClusterName());
          hostClustersMap.put(hostRequest.getHostname(), clusterSet);
-         if (hostRequest.getHostAttributes() != null) {
-           hostAttributes.put(hostRequest.getHostname(), hostRequest.getHostAttributes());
-         }
 +        Cluster cl = clusters.getCluster(hostRequest.getClusterName());
 +        String clusterId = Long.toString(cl.getClusterId());
 +        if (!addedTopologies.containsKey(clusterId)) {
 +          addedTopologies.put(clusterId, new TopologyCluster());
 +        }
 +        Host addedHost = clusters.getHost(hostRequest.getHostname());
 +        addedTopologies.get(clusterId).addTopologyHost(new TopologyHost(addedHost.getHostId(),
 +            addedHost.getHostName(),
 +            addedHost.getRackInfo(),
 +            addedHost.getIPv4()));
++        //TODO fix repo info param
 +        HostLevelParamsUpdateEvent hostLevelParamsUpdateEvent = new HostLevelParamsUpdateEvent(clusterId, new HostLevelParamsCluster(
-             ambariMetaInfo.getRepoInfo(cl, addedHost),
++            null,//ambariMetaInfo.getRepoInfo(cl, addedHost),
 +            recoveryConfigHelper.getRecoveryConfig(clusters.getCluster(hostRequest.getClusterName()).getClusterName(),
 +                addedHost.getHostName())
 +        ));
 +        hostLevelParamsUpdateEvent.setHostName(addedHost.getHostName());
 +        hostLevelParamsUpdateEvents.add(hostLevelParamsUpdateEvent);
        }
      }
      clusters.updateHostWithClusterAndAttributes(hostClustersMap, hostAttributes);
  
-     for (String clusterName : allClusterSet) {
-       clusters.getCluster(clusterName).recalculateAllClusterVersionStates();
-     }
++    // TODO add rack change to topology update
+     updateHostRackInfoIfChanged(clusters, hostRequests);
+ 
 +    TopologyUpdateEvent topologyUpdateEvent =
 +        new TopologyUpdateEvent(addedTopologies, TopologyUpdateEvent.EventType.UPDATE);
 +    topologyHolder.updateData(topologyUpdateEvent);
 +    for (HostLevelParamsUpdateEvent hostLevelParamsUpdateEvent : hostLevelParamsUpdateEvents) {
 +      hostLevelParamsHolder.updateData(hostLevelParamsUpdateEvent);
 +    }
    }
  
+   /**
+    * Iterates through the provided host request and checks if there is rack info provided.
+    * If the rack info differs from the rack info of the host than updates it with the value from
+    * the host request.
+    * @param clusters
 -   * @param hostRequests 
++   * @param hostRequests
+    * @throws AmbariException
+    * @throws AuthorizationException
+    */
+   private void updateHostRackInfoIfChanged(Clusters clusters, Set<HostRequest> hostRequests)
+     throws AmbariException, AuthorizationException {
+ 
+     HashSet<String> rackChangeAffectedClusters = new HashSet<>();
+ 
+     for (HostRequest hostRequest : hostRequests) {
+       String clusterName = hostRequest.getClusterName();
+ 
+       if (StringUtils.isNotBlank(clusterName)) {
+         Cluster cluster = clusters.getCluster(clusterName);
+         Host host = clusters.getHost(hostRequest.getHostname());
+ 
+         if (updateHostRackInfoIfChanged(cluster, host, hostRequest))
+           rackChangeAffectedClusters.add(clusterName);
+       }
+     }
 -
++    // TODO rack change topology update
+     for (String clusterName: rackChangeAffectedClusters) {
+       getManagementController().registerRackChange(clusterName);
+     }
+   }
+ 
+ 
+ 
+   /**
+    * If the rack info provided in the request differs from the rack info of the host
+    * update the rack info of the host with the value from the host request
+    *
+    * @param cluster The cluster to check user privileges against. User is required
+    *                to have {@link RoleAuthorization#HOST_ADD_DELETE_HOSTS} rights on the cluster.
+    * @param host The host of which rack information is to be updated
+    * @param hostRequest
+    * @return true is host was updated otherwise false
+    * @throws AmbariException
+    * @throws AuthorizationException
+    */
+   private boolean updateHostRackInfoIfChanged(Cluster cluster, Host host, HostRequest hostRequest)
+     throws AmbariException, AuthorizationException {
+ 
+     Long resourceId = cluster.getResourceId();
+ 
+     String hostRackInfo = host.getRackInfo();
+     String requestRackInfo = hostRequest.getRackInfo();
+ 
+     boolean rackChange = requestRackInfo != null && !requestRackInfo.equals(hostRackInfo);
+ 
+     if (rackChange) {
+       if(!AuthorizationHelper.isAuthorized(ResourceType.CLUSTER, resourceId, RoleAuthorization.HOST_ADD_DELETE_HOSTS)) {
+         throw new AuthorizationException("The authenticated user is not authorized to update host rack information");
+       }
++      //TODO topology update
+ 
+       host.setRackInfo(requestRackInfo);
+     }
+ 
+     return rackChange;
+   }
+ 
    private void createHostResource(Clusters clusters, Set<String> duplicates,
                                    Set<String> unknowns, Set<String> allHosts,
                                    HostRequest request)
@@@ -751,14 -753,10 +807,12 @@@
        }
      }
  
 +    TreeMap<String, TopologyCluster> topologyUpdates = new TreeMap<>();
      for (HostRequest request : requests) {
        if (LOG.isDebugEnabled()) {
-         LOG.debug("Received an updateHost request"
-             + ", hostname=" + request.getHostname()
-             + ", request=" + request);
+         LOG.debug("Received an updateHost request, hostname={}, request={}", request.getHostname(), request);
        }
 +      TopologyHost topologyHost = new TopologyHost();
  
        Host host = clusters.getHost(request.getHostname());
  
@@@ -855,21 -835,11 +893,18 @@@
          }
        }
  
-       if (clusterName != null && !clusterName.isEmpty()) {
-         clusters.getCluster(clusterName).recalculateAllClusterVersionStates();
-         if (rackChange) {
-           // Authorization check for this update was performed before we got to this point.
-           controller.registerRackChange(clusterName);
-         }
+       if (StringUtils.isNotBlank(clusterName) && rackChange) {
+         // Authorization check for this update was performed before we got to this point.
+         controller.registerRackChange(clusterName);
        }
  
 +      if (!topologyUpdates.containsKey(clusterId.toString())) {
 +        topologyUpdates.put(clusterId.toString(), new TopologyCluster());
 +      }
 +      topologyUpdates.get(clusterId.toString()).addTopologyHost(topologyHost);
 +      TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(topologyUpdates,
 +          TopologyUpdateEvent.EventType.UPDATE);
 +      topologyHolder.updateData(topologyUpdateEvent);
        //todo: if attempt was made to update a property other than those
        //todo: that are allowed above, should throw exception
      }
@@@ -1000,12 -960,6 +1035,9 @@@
        }
      }
      clusters.publishHostsDeletion(allClustersWithHosts, hostNames);
-     for (String clustername : hostsClusters) {
-       clusters.getCluster(clustername).recalculateAllClusterVersionStates();
-     }
 +    TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(topologyUpdates,
 +        TopologyUpdateEvent.EventType.DELETE);
 +    topologyHolder.updateData(topologyUpdateEvent);
    }
  
    private void validateHostInDeleteFriendlyState(HostRequest hostRequest, Clusters clusters, boolean forceDelete) throws AmbariException {

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
index d2f3f8d,6455805..44ef9f7
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
@@@ -86,6 -86,8 +86,7 @@@ public class RepositoryVersionResourceP
    public static final String REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID      = PropertyHelper.getPropertyId("RepositoryVersions", "stack_version");
    public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("RepositoryVersions", "repository_version");
    public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID       = PropertyHelper.getPropertyId("RepositoryVersions", "display_name");
+   public static final String REPOSITORY_VERSION_HIDDEN_PROPERTY_ID             = PropertyHelper.getPropertyId("RepositoryVersions", "hidden");
 -  public static final String REPOSITORY_VERSION_RESOLVED_PROPERTY_ID           = PropertyHelper.getPropertyId("RepositoryVersions", "resolved");
    public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID         = new OperatingSystemResourceDefinition().getPluralName();
    public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID              = new RepositoryResourceDefinition().getPluralName();
  
@@@ -123,16 -122,15 +121,14 @@@
        REPOSITORY_VERSION_PARENT_ID,
        REPOSITORY_VERSION_HAS_CHILDREN,
        REPOSITORY_VERSION_AVAILABLE_SERVICES,
 -      REPOSITORY_VERSION_STACK_SERVICES,
 -      REPOSITORY_VERSION_RESOLVED_PROPERTY_ID);
 +      REPOSITORY_VERSION_STACK_SERVICES);
  
    @SuppressWarnings("serial")
-   public static Map<Type, String> keyPropertyIds = new HashMap<Type, String>() {
-     {
-       put(Type.Stack, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID);
-       put(Type.StackVersion, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID);
-       put(Type.RepositoryVersion, REPOSITORY_VERSION_ID_PROPERTY_ID);
-     }
-   };
+   public static Map<Type, String> keyPropertyIds = new ImmutableMap.Builder<Type, String>()
+       .put(Type.Stack, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID)
+       .put(Type.StackVersion, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID)
+       .put(Type.RepositoryVersion, REPOSITORY_VERSION_ID_PROPERTY_ID)
+       .build();
  
    @Inject
    private Gson gson;
@@@ -261,9 -256,10 +254,10 @@@
        setResourceProperty(resource, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, entity.getStackName(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, entity.getStackVersion(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, entity.getDisplayName(), requestedIds);
+       setResourceProperty(resource, REPOSITORY_VERSION_HIDDEN_PROPERTY_ID, entity.isHidden(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, entity.getVersion(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_TYPE_PROPERTY_ID, entity.getType(), requestedIds);
 -      setResourceProperty(resource, REPOSITORY_VERSION_RESOLVED_PROPERTY_ID, entity.isResolved(), requestedIds);
 +
        setResourceProperty(resource, REPOSITORY_VERSION_PARENT_ID, entity.getParentId(), requestedIds);
  
        List<RepositoryVersionEntity> children = entity.getChildren();

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
index 81dc340,81f283c..5a5d27c
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
@@@ -737,7 -790,37 +790,36 @@@ public class RequestResourceProvider ex
        setResourceProperty(resource, REQUEST_SOURCE_SCHEDULE, null, requestedPropertyIds);
      }
  
-     final CalculatedStatus status = CalculatedStatus.statusFromRequest(s_hostRoleCommandDAO, topologyManager, entity.getRequestId());
 -
+     Map<Long, HostRoleCommandStatusSummaryDTO> summary = s_hostRoleCommandDAO.findAggregateCounts(entity.getRequestId());
+ 
+     // get summaries from TopologyManager for logical requests
+     summary.putAll(topologyManager.getStageSummaries(entity.getRequestId()));
+ 
+     // summary might be empty due to delete host have cleared all
+     // HostRoleCommands or due to hosts haven't registered yet with the cluster
+     // when the cluster is provisioned with a Blueprint
+     final CalculatedStatus status;
+     LogicalRequest logicalRequest = topologyManager.getRequest(entity.getRequestId());
+     if (summary.isEmpty() && null != logicalRequest) {
+       // In this case, it appears that there are no tasks but this is a logical
+       // topology request, so it's a matter of hosts simply not registering yet
+       // for tasks to be created ==> status = PENDING.
+       // For a new LogicalRequest there should be at least one HostRequest,
+       // while if they were removed already ==> status = COMPLETED.
+       if (logicalRequest.getHostRequests().isEmpty()) {
+         status = CalculatedStatus.COMPLETED;
+       } else {
+         status = CalculatedStatus.PENDING;
+       }
+     } else {
+       // there are either tasks or this is not a logical request, so do normal
+       // status calculations
+       status = CalculatedStatus.statusFromStageSummary(summary, summary.keySet());
+     }
+ 
+     if (null != logicalRequest) {
+       setResourceProperty(resource, REQUEST_PENDING_HOST_REQUEST_COUNT_ID, logicalRequest.getPendingHostRequestCount(), requestedPropertyIds);
+     }
  
      setResourceProperty(resource, REQUEST_STATUS_PROPERTY_ID, status.getStatus().toString(), requestedPropertyIds);
      setResourceProperty(resource, REQUEST_PROGRESS_PERCENT_ID, status.getPercent(), requestedPropertyIds);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
index 33cab7c,76a4547..3f8b6e9
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
@@@ -72,7 -75,7 +75,8 @@@ import org.apache.ambari.server.state.S
  import org.apache.ambari.server.state.ServiceInfo;
  import org.apache.ambari.server.state.StackId;
  import org.apache.ambari.server.state.State;
 +import org.apache.ambari.server.topology.TopologyDeleteFormer;
+ import org.apache.commons.collections.CollectionUtils;
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.lang.Validate;
  
@@@ -124,9 -166,11 +167,14 @@@ public class ServiceResourceProvider ex
    @Inject
    private KerberosHelper kerberosHelper;
  
 +  @Inject
 +  private TopologyDeleteFormer topologyDeleteFormer;
 +
+   /**
+    * Used to lookup the repository when creating services.
+    */
+   private final RepositoryVersionDAO repositoryVersionDAO;
+ 
    // ----- Constructors ----------------------------------------------------
  
    /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
index b657f03,52f66bc..0ff21a2
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
@@@ -851,22 -731,12 +731,11 @@@ public class UpgradeResourceProvider ex
                itemEntity.setText(wrapper.getText());
                itemEntity.setTasks(wrapper.getTasksJson());
                itemEntity.setHosts(wrapper.getHostsJson());
 +              itemEntities.add(itemEntity);
  
-               // At this point, need to change the effective Stack Id so that subsequent tasks run on the newer value.
-               if (upgradeType == UpgradeType.NON_ROLLING && UpdateStackGrouping.class.equals(group.groupClass)) {
-                 if (direction.isUpgrade()) {
-                   upgradeContext.setEffectiveStackId(upgradeContext.getTargetStackId());
-                 } else {
-                   upgradeContext.setEffectiveStackId(upgradeContext.getOriginalStackId());
-                 }
-               } else if (UpdateStackGrouping.class.equals(group.groupClass)) {
-                 upgradeContext.setEffectiveStackId(upgradeContext.getTargetStackId());
-               }
- 
                injectVariables(configHelper, cluster, itemEntity);
-               makeServerSideStage(upgradeContext, req, itemEntity, (ServerSideActionTask) task,
-                   skippable, supportsAutoSkipOnFailure, allowRetry, pack, configUpgradePack);
 -              if (makeServerSideStage(group, upgradeContext, effectiveRepositoryVersion, req,
 -                  itemEntity, (ServerSideActionTask) task, configUpgradePack)) {
 -                itemEntities.add(itemEntity);
 -              }
++              makeServerSideStage(group, upgradeContext, effectiveRepositoryVersion, req,
++                  itemEntity, (ServerSideActionTask) task, configUpgradePack);
              }
            }
          } else {
@@@ -1511,13 -1185,13 +1184,13 @@@
     * upgrade
     * @throws AmbariException
     */
-   private void makeServerSideStage(UpgradeContext context, RequestStageContainer request,
-       UpgradeItemEntity entity, ServerSideActionTask task, boolean skippable,
-       boolean supportsAutoSkipOnFailure, boolean allowRetry,
-       UpgradePack upgradePack, ConfigUpgradePack configUpgradePack)
-           throws AmbariException {
 -  private boolean makeServerSideStage(UpgradeGroupHolder group, UpgradeContext context,
++  private void makeServerSideStage(UpgradeGroupHolder group, UpgradeContext context,
+       RepositoryVersionEntity effectiveRepositoryVersion, RequestStageContainer request,
+       UpgradeItemEntity entity, ServerSideActionTask task, ConfigUpgradePack configUpgradePack)
+       throws AmbariException {
  
      Cluster cluster = context.getCluster();
+     UpgradePack upgradePack = context.getUpgradePack();
  
      Map<String, String> commandParams = getNewParameterMap(request, context);
      commandParams.put(UpgradeContext.COMMAND_PARAM_UPGRADE_PACK, upgradePack.getName());
@@@ -1593,8 -1276,12 +1266,8 @@@
          break;
      }
  
 -    if (!process) {
 -      return false;
 -    }
 -
      ActionExecutionContext actionContext = new ActionExecutionContext(cluster.getClusterName(),
-         Role.AMBARI_SERVER_ACTION.toString(), Collections.<RequestResourceFilter> emptyList(),
+         Role.AMBARI_SERVER_ACTION.toString(), Collections.emptyList(),
          commandParams);
  
      actionContext.setTimeout(Short.valueOf((short) -1));

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/AlertReceivedEvent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariEvent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigFinishedEvent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertAggregateListener.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
index c40969e,230b943..1dd8a5b
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
@@@ -26,8 -26,8 +26,9 @@@ import java.util.Iterator
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
+ import java.util.concurrent.ConcurrentHashMap;
  
 +import org.apache.ambari.server.ClusterNotFoundException;
  import org.apache.ambari.server.EagerSingleton;
  import org.apache.ambari.server.Role;
  import org.apache.ambari.server.actionmanager.HostRoleCommand;
@@@ -51,8 -44,6 +52,7 @@@ import org.apache.ambari.server.orm.ent
  import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntity;
  import org.apache.ambari.server.orm.entities.StageEntity;
  import org.apache.ambari.server.orm.entities.StageEntityPK;
 +import org.apache.ambari.server.topology.TopologyManager;
- import org.jboss.netty.util.internal.ConcurrentHashMap;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
index cd82957,1944761..aa29894
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
@@@ -107,55 -103,39 +103,31 @@@ public class DistributeRepositoriesActi
            "Distribute repositories did not complete, will set all INSTALLING versions for host {} to INSTALL_FAILED.",
            event.getHostname());
      } else {
-       // Parse structured output
+ 
+       DistributeRepositoriesStructuredOutput structuredOutput = null;
        try {
+         structuredOutput = gson.fromJson(event.getCommandReport().getStructuredOut(),
+             DistributeRepositoriesStructuredOutput.class);
+       } catch (JsonSyntaxException e) {
+         LOG.error("Cannot parse structured output %s", e);
+       }
+ 
+       if (null == structuredOutput || null == structuredOutput.repositoryVersionId) {
+         LOG.error("Received an installation reponse, but it did not contain a repository version id");
+       } else {
          newHostState = RepositoryVersionState.INSTALLED;
-         DistributeRepositoriesStructuredOutput structuredOutput = StageUtils.getGson().fromJson(
-                 event.getCommandReport().getStructuredOut(),
-                 DistributeRepositoriesStructuredOutput.class);
- 
-         repositoryVersion = structuredOutput.getInstalledRepositoryVersion();
- 
-         // Handle the case in which the version to install did not contain the build number,
-         // but the structured output does contain the build number.
-         if (null != structuredOutput.getActualVersion() && !structuredOutput.getActualVersion().isEmpty() &&
-             null != structuredOutput.getInstalledRepositoryVersion() && !structuredOutput.getInstalledRepositoryVersion().isEmpty() &&
-             null != structuredOutput.getStackId() && !structuredOutput.getStackId().isEmpty() &&
-             !structuredOutput.getActualVersion().equals(structuredOutput.getInstalledRepositoryVersion())) {
- 
-           // !!! getInstalledRepositoryVersion() from the agent is the one
-           // entered in the UI.  getActualVersion() is computed.
- 
-           StackId stackId = new StackId(structuredOutput.getStackId());
-           RepositoryVersionEntity version = repoVersionDAO.findByStackAndVersion(
-               stackId, structuredOutput.getInstalledRepositoryVersion());
- 
-           if (null != version) {
-             LOG.info("Repository version {} was found, but {} is the actual value",
-                 structuredOutput.getInstalledRepositoryVersion(),
-                 structuredOutput.getActualVersion());
-             // !!! the entered version is not correct
-             version.setVersion(structuredOutput.getActualVersion());
-             repoVersionDAO.merge(version);
-             repositoryVersion = structuredOutput.getActualVersion();
-           } else {
-             // !!! extra check that the actual version is correct
-             stackId = new StackId(structuredOutput.getStackId());
-             version = repoVersionDAO.findByStackAndVersion(stackId,
-                 structuredOutput.getActualVersion());
- 
-             LOG.debug("Repository version {} was not found, check for {}.  Found={}",
-                 structuredOutput.getInstalledRepositoryVersion(),
-                 structuredOutput.getActualVersion(),
-                 Boolean.valueOf(null != version));
- 
-             if (null != version) {
-               repositoryVersion = structuredOutput.getActualVersion();
-             }
+ 
+         String actualVersion = structuredOutput.actualVersion;
+ 
+         RepositoryVersionEntity repoVersion = repoVersionDAO.findByPK(structuredOutput.repositoryVersionId);
+ 
+         if (null != repoVersion && StringUtils.isNotBlank(actualVersion)) {
+           if (!StringUtils.equals(repoVersion.getVersion(), actualVersion)) {
+             repoVersion.setVersion(actualVersion);
 -            repoVersion.setResolved(true);
+             repoVersionDAO.merge(repoVersion);
+             repositoryVersion = actualVersion;
 -          } else {
 -            // the reported versions are the same - we should ensure that the
 -            // repo is resolved
 -            if (!repoVersion.isResolved()) {
 -              repoVersion.setResolved(true);
 -              repoVersionDAO.merge(repoVersion);
 -            }
            }
          }
-       } catch (JsonSyntaxException e) {
-         LOG.error("Cannot parse structured output %s", e);
        }
      }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
index a35957d,e5298dc..394e9f9
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
@@@ -108,8 -98,16 +98,8 @@@ public class StackVersionListener 
        if (null != rve) {
          String currentRepoVersion = rve.getVersion();
          if (!StringUtils.equals(currentRepoVersion, newVersion)) {
--          rve.setVersion(newVersion);
 -          rve.setResolved(true);
--          repositoryVersionDAO.merge(rve);
 -        } else {
 -          // the reported versions are the same - we should ensure that the repo
 -          // is resolved
 -          if (!rve.isResolved()) {
 -            rve.setResolved(true);
++            rve.setVersion(newVersion);
+             repositoryVersionDAO.merge(rve);
 -          }
          }
        }
      }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
index ff874a6,096a395..1ef415a
--- a/ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
@@@ -36,9 -37,10 +36,9 @@@ import com.google.inject.Injector
   * RoleCommandOrderProvider which caches RoleCommandOrder objects for a cluster to avoid the cost of construction of
   * RoleCommandOrder objects each time.
   */
 -@Singleton
  public class CachedRoleCommandOrderProvider implements RoleCommandOrderProvider {
  
-   private static Logger LOG = LoggerFactory.getLogger(CachedRoleCommandOrderProvider.class);
+   private static final Logger LOG = LoggerFactory.getLogger(CachedRoleCommandOrderProvider.class);
  
    @Inject
    private Injector injector;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/MetricsServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertSummaryDTO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
index 6b34575,010ccec..f634d89
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
@@@ -1007,6 -1027,34 +1008,6 @@@ public class HostRoleCommandDAO 
        taskIds.addAll(daoUtils.selectList(hostRoleCommandQuery));
      }
  
-     return taskIds;
+     return Sets.newHashSet(taskIds);
    }
 -
 -  /**
 -   * A simple DTO for storing the most recent service check time for a given
 -   * {@link Role}.
 -   */
 -  public static class LastServiceCheckDTO {
 -
 -    /**
 -     * The role.
 -     */
 -    public final String role;
 -
 -    /**
 -     * The time that the service check ended.
 -     */
 -    public final long endTime;
 -
 -    /**
 -     * Constructor.
 -     *
 -     * @param role
 -     * @param endTime
 -     */
 -    public LastServiceCheckDTO(String role, long endTime) {
 -      this.role = role;
 -      this.endTime = endTime;
 -    }
 -  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RequestDAO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
index de2d25a,6bfad54..94f5fa5
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
@@@ -159,29 -145,9 +159,29 @@@ public class ServiceConfigDAO 
    }
  
    /**
 +   *  Gets the latest service config versions of default config group for a service
 +   * @param clusterId
 +   *          the cluster (not {@code null}).
 +   * @param serviceName
 +   *          Name of the service whose latest service config versions needs to be retrieved .
 +   * @return all default group service configurations for the cluster and service.
 +   */
 +  @RequiresSession
 +  public ServiceConfigEntity getLastServiceConfigForServiceDefaultGroup(Long clusterId, String serviceName) {
 +    TypedQuery<ServiceConfigEntity> query = entityManagerProvider.get().createNamedQuery(
 +        "ServiceConfigEntity.findLatestServiceConfigsByServiceDefaultGroup",
 +        ServiceConfigEntity.class);
 +
 +    query.setParameter("clusterId", clusterId);
 +    query.setParameter("serviceName", serviceName);
 +
 +    return daoUtils.selectOne(query);
 +  }
 +
 +  /**
-    * Get all service configurations for the specified cluster and stack. This
-    * will return different versions of the same configuration (HDFS v1 and v2)
-    * if they exist.
+    * Get service configurations for the specified cluster and stack. This will
+    * return different versions of the same configuration (HDFS v1 and v2) if
+    * they exist.
     *
     * @param clusterId
     *          the cluster (not {@code null}).

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertDefinitionEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
index 772b151,2b56b11..bf9e678
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
@@@ -130,6 -144,19 +144,9 @@@ public class RepositoryVersionEntity 
    @Column(name="version_xsd", insertable = true, updatable = true)
    private String versionXsd;
  
+   @Column(name = "hidden", nullable = false, insertable = true, updatable = true)
+   private short isHidden = 0;
+ 
 -  /**
 -   * Repositories can't be trusted until they have been deployed and we've
 -   * detected their actual version. Most of the time, things match up, but
 -   * editing a VDF could causes the version to be misrepresented. Once we have
 -   * received the correct version of the repository (normally after it's been
 -   * installed), then we can set this flag to {@code true}.
 -   */
 -  @Column(name = "resolved", nullable = false)
 -  private short resolved = 0;
 -
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private RepositoryVersionEntity parent;
@@@ -433,4 -455,45 +438,25 @@@
      return null == parent ? null : parent.getId();
    }
  
+   /**
+    * Gets whether this repository is hidden.
+    *
+    * @return
+    */
+   public boolean isHidden() {
+     return isHidden != 0;
+   }
+ 
+   /**
+    * Sets whether this repository is hidden. A repository can be hidden for
+    * several reasons, including if it has been removed (but needs to be kept
+    * around for foreign key relationships) or if it just is not longer desired
+    * to see it.
+    *
+    * @param isHidden
+    */
+   public void setHidden(boolean isHidden) {
+     this.isHidden = (short) (isHidden ? 1 : 0);
+   }
+ 
 -  /**
 -   * Gets whether this repository has been installed and has reported back its
 -   * actual version.
 -   *
 -   * @return {@code true} if the version for this repository can be trusted,
 -   *         {@code false} otherwise.
 -   */
 -  public boolean isResolved() {
 -    return resolved == 1;
 -  }
 -
 -  /**
 -   * Sets whether this repository has been installed and has reported back its
 -   * actual version.
 -   *
 -   * @param resolved
 -   */
 -  public void setResolved(boolean resolved) {
 -    this.resolved = resolved ? (short) 1 : (short) 0;
 -  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
index 50dcd1c,b1409ed..6df260d
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
@@@ -46,13 -46,24 +46,27 @@@ import javax.persistence.TableGenerator
    , initialValue = 1
  )
  @NamedQueries({
-     @NamedQuery(name = "ServiceConfigEntity.findAll", query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId ORDER BY serviceConfig.version DESC"),
-     @NamedQuery(name = "ServiceConfigEntity.findNextServiceConfigVersion", query = "SELECT COALESCE(MAX(serviceConfig.version), 0) + 1 AS nextVersion FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.serviceName=:serviceName AND serviceConfig.clusterId=:clusterId"),
-     @NamedQuery(name = "ServiceConfigEntity.findAllServiceConfigsByStack", query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId AND serviceConfig.stack=:stack"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByStack", query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId = :clusterId AND (serviceConfig.groupId = null OR serviceConfig.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND serviceConfig.version = (SELECT MAX(serviceConfig2.version) FROM ServiceConfigEntity serviceConfig2 WHERE serviceConfig2.clusterId= :clusterId AND serviceConfig2.stack = :stack AND serviceConfig2.serviceName = serviceConfig.serviceName)"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByService", query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND (scv.groupId = null OR scv.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND (scv2.groupId = scv.groupId OR (scv2.groupId IS NULL AND scv.groupId IS NULL)))"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByServiceDefaultGroup", query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND scv.groupId = null AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND scv2.groupId IS NULL)"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByCluster", query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceConfigId IN (SELECT MAX(scv1.serviceConfigId) FROM ServiceConfigEntity scv1 WHERE (scv1.clusterId = :clusterId) AND (scv1.groupId IS NULL) GROUP BY scv1.serviceName)")})
+     @NamedQuery(
+         name = "ServiceConfigEntity.findAll",
+         query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId ORDER BY serviceConfig.version DESC"),
+     @NamedQuery(
+         name = "ServiceConfigEntity.findNextServiceConfigVersion",
+         query = "SELECT COALESCE(MAX(serviceConfig.version), 0) + 1 AS nextVersion FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.serviceName=:serviceName AND serviceConfig.clusterId=:clusterId"),
+     @NamedQuery(
 -        name = "ServiceConfigEntity.findServiceConfigsByStack",
++        name = "ServiceConfigEntity.findAllServiceConfigsByStack",
+         query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId AND serviceConfig.stack=:stack AND serviceConfig.serviceName=:serviceName"),
+     @NamedQuery(
+         name = "ServiceConfigEntity.findLatestServiceConfigsByStack",
+         query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId = :clusterId AND (serviceConfig.groupId = null OR serviceConfig.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND serviceConfig.version = (SELECT MAX(serviceConfig2.version) FROM ServiceConfigEntity serviceConfig2 WHERE serviceConfig2.clusterId= :clusterId AND serviceConfig2.stack = :stack AND serviceConfig2.serviceName = serviceConfig.serviceName)"),
+     @NamedQuery(
+         name = "ServiceConfigEntity.findLatestServiceConfigsByService",
+         query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND (scv.groupId = null OR scv.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND (scv2.groupId = scv.groupId OR (scv2.groupId IS NULL AND scv.groupId IS NULL)))"),
+     @NamedQuery(
++        name = "ServiceConfigEntity.findLatestServiceConfigsByServiceDefaultGroup",
++        query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND scv.groupId = null AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND scv2.groupId IS NULL)"),
++    @NamedQuery(
+         name = "ServiceConfigEntity.findLatestServiceConfigsByCluster",
+         query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceConfigId IN (SELECT MAX(scv1.serviceConfigId) FROM ServiceConfigEntity scv1 WHERE (scv1.clusterId = :clusterId) AND (scv1.groupId IS NULL) GROUP BY scv1.serviceName)") })
  public class ServiceConfigEntity {
    @Id
    @Column(name = "service_config_id")

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/UpgradeItemEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
index cab467f,e804961..95fc973
--- a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
@@@ -664,7 -666,7 +663,7 @@@ public class ExecutionScheduleManager 
    }
  
    protected BatchRequestResponse performApiGetRequest(String relativeUri, boolean queryAllFields) {
-     WebResource webResource = ambariWebResource.path(relativeUri);
 -    WebResource webResource = extendApiResource(ambariWebResource, relativeUri);
++    WebResource webResource = ambariWebResource.path(completeRelativeUri(relativeUri));
      if (queryAllFields) {
        webResource = webResource.queryParam("fields", "*");
      }
@@@ -680,7 -682,8 +679,7 @@@
    protected BatchRequestResponse performApiRequest(String relativeUri, String body, String method, Integer userId) {
      ClientResponse response;
      try {
-       response = ambariWebResource.path(relativeUri).header(USER_ID_HEADER, userId).method(method, ClientResponse.class, body);
 -      response = extendApiResource(ambariWebResource, relativeUri)
 -          .header(USER_ID_HEADER, userId).method(method, ClientResponse.class, body);
++      response = ambariWebResource.path(completeRelativeUri(relativeUri)).header(USER_ID_HEADER, userId).method(method, ClientResponse.class, body);
      } catch (UniformInterfaceException e) {
        response = e.getResponse();
      }
@@@ -796,5 -799,19 +795,16 @@@
        requestExecution.updateStatus(RequestExecution.Status.COMPLETED);
      }
    }
+ 
 -  /**
 -   * Returns the absolute web resource with {@link #DEFAULT_API_PATH}
 -   * @param webResource Ambari WebResource as provided by the client {@link #ambariWebResource}
 -   * @param relativeUri relative request URI
 -   * @return  Extended WebResource
 -   */
 -  protected WebResource extendApiResource(WebResource webResource, String relativeUri) {
 -    WebResource result = webResource;
 -    if (StringUtils.isNotEmpty(relativeUri) && !CONTAINS_API_VERSION_PATTERN.matcher(relativeUri).matches()) {
 -      result = webResource.path(DEFAULT_API_PATH);
++  private String completeRelativeUri(String relativeUri){
++    if (StringUtils.isNotEmpty(relativeUri)
++        && !(relativeUri.startsWith("api/v1") || relativeUri.startsWith("/api/v1"))){
++      if (relativeUri.charAt(0) != '/') {
++        relativeUri = '/' + relativeUri;
++      }
++      return "api/v1" + relativeUri;
+     }
 -    return result.path(relativeUri);
++    return relativeUri;
+   }
  }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/security/authentication/AmbariDelegatingAuthenticationFilter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariUserAuthentication.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/AbstractServerAction.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
index 7aac346,3db844a..d6b8ffc
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
@@@ -75,7 -76,23 +76,21 @@@ public abstract class AbstractPrepareKe
                                      Map<String, Map<String, String>> currentConfigurations,
                                      Map<String, Map<String, String>> kerberosConfigurations,
                                      boolean includeAmbariIdentity,
 -                                    Map<String, Set<String>> propertiesToBeIgnored,
 -                                    boolean excludeHeadless) throws AmbariException {
 +                                    Map<String, Set<String>> propertiesToBeIgnored) throws AmbariException {
+     List<Component> components = new ArrayList<>();
+     for (ServiceComponentHost each : schToProcess) {
+       components.add(Component.fromServiceComponentHost(each));
+     }
 -    processServiceComponents(cluster, kerberosDescriptor, components, identityFilter, dataDirectory, currentConfigurations, kerberosConfigurations, includeAmbariIdentity, propertiesToBeIgnored, excludeHeadless);
++    processServiceComponents(cluster, kerberosDescriptor, components, identityFilter, dataDirectory, currentConfigurations, kerberosConfigurations, includeAmbariIdentity, propertiesToBeIgnored);
+   }
+ 
+   protected void processServiceComponents(Cluster cluster, KerberosDescriptor kerberosDescriptor,
+                                           List<Component> schToProcess,
+                                           Collection<String> identityFilter, String dataDirectory,
+                                           Map<String, Map<String, String>> currentConfigurations,
+                                           Map<String, Map<String, String>> kerberosConfigurations,
+                                           boolean includeAmbariIdentity,
 -                                          Map<String, Set<String>> propertiesToBeIgnored,
 -                                          boolean excludeHeadless) throws AmbariException {
++                                          Map<String, Set<String>> propertiesToBeIgnored) throws AmbariException {
  
      actionLog.writeStdOut("Processing Kerberos identities and configurations");
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
index 5b65833,f56e946..4e63f4a
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
@@@ -111,29 -105,25 +105,25 @@@ public class PrepareDisableKerberosServ
  
      // Calculate the current host-specific configurations. These will be used to replace
      // variables within the Kerberos descriptor data
-     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptorProperties);
+     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
  
      processServiceComponentHosts(cluster, kerberosDescriptor, schToProcess, identityFilter, dataDirectory,
 -        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore, false);
 +        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore);
  
      // Add auth-to-local configurations to the set of changes
-     Set<String> authToLocalProperties = kerberosDescriptor.getAllAuthToLocalProperties();
+     Map<String, Set<String>> authToLocalProperties = kerberosHelper.translateConfigurationSpecifications(kerberosDescriptor.getAllAuthToLocalProperties());
      if (authToLocalProperties != null) {
-       for (String authToLocalProperty : authToLocalProperties) {
-         Matcher m = KerberosDescriptor.AUTH_TO_LOCAL_PROPERTY_SPECIFICATION_PATTERN.matcher(authToLocalProperty);
- 
-         if (m.matches()) {
-           String configType = m.group(1);
-           String propertyName = m.group(2);
- 
-           if (configType == null) {
-             configType = "";
-           }
- 
-           // Add existing auth_to_local configuration, if set
-           Map<String, String> configuration = kerberosConfigurations.get(configType);
-           if (configuration != null) {
-             configuration.put(propertyName, "DEFAULT");
+       for (Map.Entry<String, Set<String>> entry : authToLocalProperties.entrySet()) {
+         String configType = entry.getKey();
+         Set<String> propertyNames = entry.getValue();
+ 
+         if (!CollectionUtils.isEmpty(propertyNames)) {
+           for (String propertyName : propertyNames) {
+             // Add existing auth_to_local configuration, if set
+             Map<String, String> configuration = kerberosConfigurations.get(configType);
+             if (configuration != null) {
+               configuration.put(propertyName, "DEFAULT");
+             }
            }
          }
        }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
index ca15695,3ec84fa..e13f033
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
@@@ -87,11 -114,15 +114,15 @@@ public class PrepareEnableKerberosServe
  
      // Calculate the current host-specific configurations. These will be used to replace
      // variables within the Kerberos descriptor data
-     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptorProperties);
+     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
  
      processServiceComponentHosts(cluster, kerberosDescriptor, schToProcess, identityFilter, dataDirectory,
 -        configurations, kerberosConfigurations, true, propertiesToIgnore, false);
 +        configurations, kerberosConfigurations, true, propertiesToIgnore);
  
+     // Calculate the set of configurations to update and replace any variables
+     // using the previously calculated Map of configurations for the host.
+     kerberosConfigurations = kerberosHelper.processPreconfiguredServiceConfigurations(kerberosConfigurations, configurations, cluster, kerberosDescriptor);
+ 
      kerberosHelper.applyStackAdvisorUpdates(cluster, services, configurations, kerberosConfigurations,
            propertiesToIgnore, propertiesToRemove, true);
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
index f239cff,49828cb..00c82a5
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
@@@ -92,16 -92,17 +91,17 @@@ public class PrepareKerberosIdentitiesS
  
      // Calculate the current host-specific configurations. These will be used to replace
      // variables within the Kerberos descriptor data
-     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptorProperties);
+     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
  
      processServiceComponentHosts(cluster, kerberosDescriptor, schToProcess, identityFilter, dataDirectory,
 -        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore, !CollectionUtils.isEmpty(getHostFilter()));
 +        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore);
  
      kerberosHelper.applyStackAdvisorUpdates(cluster, services, configurations, kerberosConfigurations,
-         propertiesToIgnore,  propertiesToRemove, true);
+         propertiesToIgnore, propertiesToRemove, true);
  
      if ("true".equalsIgnoreCase(getCommandParameterValue(commandParameters, UPDATE_CONFIGURATIONS))) {
-       processAuthToLocalRules(cluster, kerberosDescriptor, schToProcess, kerberosConfigurations, getDefaultRealm(commandParameters));
+       Map<String, Map<String, String>> calculatedConfigurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
+       processAuthToLocalRules(cluster, calculatedConfigurations, kerberosDescriptor, schToProcess, kerberosConfigurations, getDefaultRealm(commandParameters), false);
        processConfigurationChanges(dataDirectory, kerberosConfigurations, propertiesToRemove);
      }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
index 086055d,451f802..5ec0692
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
@@@ -300,12 -198,22 +198,17 @@@ public class FinalizeUpgradeAction exte
          }
        }
  
-       // Impacts all hosts that have a version
-       outSB.append(
-           String.format("Finalizing the version for %d host(s).\n", hostVersionsAllowed.size()));
-       cluster.mapHostVersions(hostsToUpdate, upgradingClusterVersion, RepositoryVersionState.CURRENT);
+       // move host versions from CURRENT to INSTALLED if their repos are no
+       // longer used
+       finalizeHostRepositoryVersions(cluster);
+ 
 -      if (upgradeContext.getOrchestrationType() == RepositoryType.STANDARD) {
 -        outSB.append(String.format("Finalizing the version for cluster %s.\n", cluster.getClusterName()));
 -        cluster.setCurrentStackVersion(cluster.getDesiredStackVersion());
 -      }
 -
+       // mark revertable
+       if (repositoryType.isRevertable() && direction == Direction.UPGRADE) {
+         UpgradeEntity upgrade = cluster.getUpgradeInProgress();
+         upgrade.setRevertAllowed(true);
+         upgrade = m_upgradeDAO.merge(upgrade);
+       }
  
-       versionEventPublisher.publish(new StackUpgradeFinishEvent(cluster));
        // Reset upgrade state
        cluster.setUpgradeEntity(null);
  


[37/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
index 0000000,cc58988..2a62f2e
mode 000000,100644..100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
@@@ -1,0 -1,871 +1,623 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ 
+ package org.apache.ambari.server.upgrade;
+ 
+ import static org.easymock.EasyMock.anyObject;
+ import static org.easymock.EasyMock.anyString;
+ import static org.easymock.EasyMock.capture;
+ import static org.easymock.EasyMock.createMock;
 -import static org.easymock.EasyMock.createMockBuilder;
 -import static org.easymock.EasyMock.createNiceMock;
+ import static org.easymock.EasyMock.eq;
+ import static org.easymock.EasyMock.expect;
+ import static org.easymock.EasyMock.expectLastCall;
+ import static org.easymock.EasyMock.newCapture;
+ import static org.easymock.EasyMock.replay;
+ import static org.easymock.EasyMock.reset;
+ import static org.easymock.EasyMock.verify;
 -import static org.junit.Assert.assertTrue;
+ 
 -import java.io.File;
 -import java.net.URL;
+ import java.sql.Connection;
+ import java.sql.ResultSet;
+ import java.sql.SQLException;
+ import java.sql.Statement;
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Collections;
 -import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+ 
+ import javax.persistence.EntityManager;
+ 
+ import org.apache.ambari.server.AmbariException;
+ import org.apache.ambari.server.actionmanager.ActionManager;
 -import org.apache.ambari.server.api.services.AmbariMetaInfo;
+ import org.apache.ambari.server.configuration.Configuration;
+ import org.apache.ambari.server.controller.AmbariManagementController;
 -import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
++import org.apache.ambari.server.controller.KerberosHelper;
+ import org.apache.ambari.server.controller.MaintenanceStateHelper;
 -import org.apache.ambari.server.controller.ServiceConfigVersionResponse;
+ import org.apache.ambari.server.orm.DBAccessor;
+ import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
 -import org.apache.ambari.server.orm.dao.ArtifactDAO;
 -import org.apache.ambari.server.orm.dao.WidgetDAO;
 -import org.apache.ambari.server.orm.entities.ArtifactEntity;
 -import org.apache.ambari.server.orm.entities.WidgetEntity;
 -import org.apache.ambari.server.stack.StackManagerFactory;
+ import org.apache.ambari.server.state.Cluster;
+ import org.apache.ambari.server.state.Clusters;
+ import org.apache.ambari.server.state.Config;
+ import org.apache.ambari.server.state.Service;
 -import org.apache.ambari.server.state.ServiceInfo;
+ import org.apache.ambari.server.state.StackId;
 -import org.apache.ambari.server.state.StackInfo;
 -import org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor;
 -import org.apache.ambari.server.state.kerberos.KerberosDescriptor;
 -import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory;
 -import org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor;
 -import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor;
+ import org.apache.ambari.server.state.stack.OsFamily;
 -import org.apache.commons.io.FileUtils;
+ import org.easymock.Capture;
 -import org.easymock.EasyMock;
+ import org.easymock.EasyMockRunner;
 -import org.easymock.EasyMockSupport;
+ import org.easymock.Mock;
+ import org.easymock.MockType;
+ import org.junit.After;
+ import org.junit.Assert;
+ import org.junit.Before;
 -import org.junit.Rule;
+ import org.junit.Test;
 -import org.junit.rules.TemporaryFolder;
+ import org.junit.runner.RunWith;
+ 
 -import com.google.common.collect.Maps;
+ import com.google.gson.Gson;
 -import com.google.inject.AbstractModule;
+ import com.google.inject.Binder;
+ import com.google.inject.Guice;
+ import com.google.inject.Injector;
+ import com.google.inject.Module;
+ import com.google.inject.Provider;
+ 
+ /**
+  * {@link UpgradeCatalog260} unit tests.
+  */
+ @RunWith(EasyMockRunner.class)
+ public class UpgradeCatalog260Test {
+ 
+   //  private Injector injector;
+   @Mock(type = MockType.STRICT)
+   private Provider<EntityManager> entityManagerProvider;
+ 
+   @Mock(type = MockType.NICE)
+   private EntityManager entityManager;
+ 
+   @Mock(type = MockType.NICE)
+   private DBAccessor dbAccessor;
+ 
+   @Mock(type = MockType.NICE)
+   private Configuration configuration;
+ 
+   @Mock(type = MockType.NICE)
+   private Connection connection;
+ 
+   @Mock(type = MockType.NICE)
+   private Statement statement;
+ 
+   @Mock(type = MockType.NICE)
+   private ResultSet resultSet;
+ 
+   @Mock(type = MockType.NICE)
+   private OsFamily osFamily;
+ 
 -  @Rule
 -  public TemporaryFolder temporaryFolder = new TemporaryFolder();
++  @Mock(type = MockType.NICE)
++  private KerberosHelper kerberosHelper;
++
++  @Mock(type = MockType.NICE)
++  private ActionManager actionManager;
++
++  @Mock(type = MockType.NICE)
++  private Config config;
++
++  @Mock(type = MockType.STRICT)
++  private Service service;
++
++  @Mock(type = MockType.NICE)
++  private Clusters clusters;
++
++  @Mock(type = MockType.NICE)
++  private Cluster cluster;
++
++  @Mock(type = MockType.NICE)
++  private Injector injector;
+ 
+   @Before
+   public void init() {
 -    reset(entityManagerProvider);
++    reset(entityManagerProvider, injector);
+ 
+     expect(entityManagerProvider.get()).andReturn(entityManager).anyTimes();
+ 
 -    replay(entityManagerProvider);
++    expect(injector.getInstance(Gson.class)).andReturn(null).anyTimes();
++    expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(null).anyTimes();
++    expect(injector.getInstance(KerberosHelper.class)).andReturn(kerberosHelper).anyTimes();
++
++    replay(entityManagerProvider, injector);
+   }
+ 
+   @After
+   public void tearDown() {
+   }
+ 
+   @Test
+   public void testExecuteDDLUpdates() throws Exception {
+ 
+     List<Integer> current = new ArrayList<>();
+     current.add(1);
+ 
+     expect(dbAccessor.getConnection()).andReturn(connection).anyTimes();
+     expect(connection.createStatement()).andReturn(statement).anyTimes();
+     expect(statement.executeQuery(anyObject(String.class))).andReturn(resultSet).anyTimes();
+     expect(configuration.getDatabaseType()).andReturn(Configuration.DatabaseType.POSTGRES).anyTimes();
+     expect(dbAccessor.tableHasColumn(UpgradeCatalog260.CLUSTER_CONFIG_TABLE, UpgradeCatalog260.SERVICE_DELETED_COLUMN)).andReturn(true).anyTimes();
+ 
+ 
+     Capture<String[]> scdcaptureKey = newCapture();
+     Capture<String[]> scdcaptureValue = newCapture();
+     expectGetCurrentVersionID(current, scdcaptureKey, scdcaptureValue);
+ 
+     Capture<DBColumnInfo> scdstadd1 = newCapture();
+     Capture<DBColumnInfo> scdstalter1 = newCapture();
+     Capture<DBColumnInfo> scdstadd2 = newCapture();
+     Capture<DBColumnInfo> scdstalter2 = newCapture();
+     expectUpdateServiceComponentDesiredStateTable(scdstadd1, scdstalter1, scdstadd2, scdstalter2);
+ 
+     Capture<DBColumnInfo> sdstadd = newCapture();
+     Capture<DBColumnInfo> sdstalter = newCapture();
+     expectUpdateServiceDesiredStateTable(sdstadd, sdstalter);
+ 
+     Capture<DBColumnInfo> selectedColumnInfo = newCapture();
+     Capture<DBColumnInfo> selectedmappingColumnInfo = newCapture();
+     Capture<DBColumnInfo> selectedTimestampColumnInfo = newCapture();
+     Capture<DBColumnInfo> createTimestampColumnInfo = newCapture();
+     expectAddSelectedCollumsToClusterconfigTable(selectedColumnInfo, selectedmappingColumnInfo, selectedTimestampColumnInfo, createTimestampColumnInfo);
+ 
+     expectUpdateHostComponentDesiredStateTable();
+     expectUpdateHostComponentStateTable();
+ 
+     Capture<DBColumnInfo> rvid = newCapture();
+     Capture<DBColumnInfo> orchestration = newCapture();
+     Capture<DBColumnInfo> revertAllowed = newCapture();
+     expectUpdateUpgradeTable(rvid, orchestration, revertAllowed);
+ 
+     Capture<List<DBAccessor.DBColumnInfo>> columns = newCapture();
+     expectCreateUpgradeHistoryTable(columns);
+ 
+     expectDropStaleTables();
+ 
+     Capture<DBColumnInfo> repoVersionHiddenColumnCapture = newCapture();
 -    Capture<DBColumnInfo> repoVersionResolvedColumnCapture = newCapture();
 -    expectUpdateRepositoryVersionTableTable(repoVersionHiddenColumnCapture, repoVersionResolvedColumnCapture);
++    expectUpdateRepositoryVersionTableTable(repoVersionHiddenColumnCapture);
+ 
+     Capture<DBColumnInfo> unapped = newCapture();
+     expectRenameServiceDeletedColumn(unapped);
+ 
 -    expectAddViewUrlPKConstraint();
 -    expectRemoveStaleConstraints();
 -    
+     replay(dbAccessor, configuration, connection, statement, resultSet);
+ 
 -    Injector injector = getInjector();
++    Module module = new Module() {
++      @Override
++      public void configure(Binder binder) {
++        binder.bind(DBAccessor.class).toInstance(dbAccessor);
++        binder.bind(OsFamily.class).toInstance(osFamily);
++        binder.bind(EntityManager.class).toInstance(entityManager);
++        binder.bind(Configuration.class).toInstance(configuration);
++      }
++    };
++
++    Injector injector = Guice.createInjector(module);
+     UpgradeCatalog260 upgradeCatalog260 = injector.getInstance(UpgradeCatalog260.class);
+     upgradeCatalog260.executeDDLUpdates();
+ 
+     verify(dbAccessor);
+ 
+     verifyGetCurrentVersionID(scdcaptureKey, scdcaptureValue);
+     verifyUpdateServiceComponentDesiredStateTable(scdstadd1, scdstalter1, scdstadd2, scdstalter2);
+     verifyUpdateServiceDesiredStateTable(sdstadd, sdstalter);
+     verifyAddSelectedCollumsToClusterconfigTable(selectedColumnInfo, selectedmappingColumnInfo, selectedTimestampColumnInfo, createTimestampColumnInfo);
+     verifyUpdateUpgradeTable(rvid, orchestration, revertAllowed);
+     verifyCreateUpgradeHistoryTable(columns);
 -    verifyUpdateRepositoryVersionTableTable(repoVersionHiddenColumnCapture, repoVersionResolvedColumnCapture);
 -  }
 -
 -  private void expectRemoveStaleConstraints() throws SQLException {
 -    dbAccessor.dropUniqueConstraint(eq(UpgradeCatalog260.USERS_TABLE), eq(UpgradeCatalog260.STALE_POSTGRESS_USERS_LDAP_USER_KEY));
 -  }
 -
 -  private void expectAddViewUrlPKConstraint() throws SQLException {
 -    dbAccessor.dropPKConstraint(eq(UpgradeCatalog260.VIEWURL_TABLE), eq(UpgradeCatalog260.STALE_POSTGRESS_VIEWURL_PKEY));
 -    expectLastCall().once();
 -    dbAccessor.addPKConstraint(eq(UpgradeCatalog260.VIEWURL_TABLE), eq(UpgradeCatalog260.PK_VIEWURL), eq(UpgradeCatalog260.URL_ID_COLUMN));
 -    expectLastCall().once();
++    verifyUpdateRepositoryVersionTableTable(repoVersionHiddenColumnCapture);
+   }
+ 
+   public void expectDropStaleTables() throws SQLException {
+     dbAccessor.dropTable(eq(UpgradeCatalog260.CLUSTER_CONFIG_MAPPING_TABLE));
+     expectLastCall().once();
+     dbAccessor.dropTable(eq(UpgradeCatalog260.CLUSTER_VERSION_TABLE));
+     expectLastCall().once();
+     dbAccessor.dropTable(eq(UpgradeCatalog260.SERVICE_COMPONENT_HISTORY_TABLE));
+     expectLastCall().once();
+   }
+ 
 -  public void expectRenameServiceDeletedColumn(Capture<DBColumnInfo> unmapped) throws SQLException {
++  public  void expectRenameServiceDeletedColumn(Capture<DBColumnInfo> unmapped) throws SQLException {
+     dbAccessor.renameColumn(eq(UpgradeCatalog260.CLUSTER_CONFIG_TABLE), eq(UpgradeCatalog260.SERVICE_DELETED_COLUMN), capture(unmapped));
+     expectLastCall().once();
+   }
+ 
+   public void verifyCreateUpgradeHistoryTable(Capture<List<DBColumnInfo>> columns) {
+     List<DBColumnInfo> columnsValue = columns.getValue();
+     Assert.assertEquals(columnsValue.size(), 6);
+ 
+     DBColumnInfo id = columnsValue.get(0);
+     Assert.assertEquals(UpgradeCatalog260.ID_COLUMN, id.getName());
+     Assert.assertEquals(Long.class, id.getType());
+     Assert.assertEquals(null, id.getLength());
+     Assert.assertEquals(null, id.getDefaultValue());
+     Assert.assertEquals(false, id.isNullable());
+ 
+     DBColumnInfo upgradeId = columnsValue.get(1);
+     Assert.assertEquals(UpgradeCatalog260.UPGRADE_ID_COLUMN, upgradeId.getName());
+     Assert.assertEquals(Long.class, upgradeId.getType());
+     Assert.assertEquals(null, upgradeId.getLength());
+     Assert.assertEquals(null, upgradeId.getDefaultValue());
+     Assert.assertEquals(false, upgradeId.isNullable());
+ 
+     DBColumnInfo serviceName = columnsValue.get(2);
+     Assert.assertEquals(UpgradeCatalog260.SERVICE_NAME_COLUMN, serviceName.getName());
+     Assert.assertEquals(String.class, serviceName.getType());
+     Assert.assertEquals(Integer.valueOf(255), serviceName.getLength());
+     Assert.assertEquals(null, serviceName.getDefaultValue());
+     Assert.assertEquals(false, serviceName.isNullable());
+ 
+     DBColumnInfo componentName = columnsValue.get(3);
+     Assert.assertEquals(UpgradeCatalog260.COMPONENT_NAME_COLUMN, componentName.getName());
+     Assert.assertEquals(String.class, componentName.getType());
+     Assert.assertEquals(Integer.valueOf(255), componentName.getLength());
+     Assert.assertEquals(null, componentName.getDefaultValue());
+     Assert.assertEquals(false, componentName.isNullable());
+ 
+     DBColumnInfo fromRepoID = columnsValue.get(4);
+     Assert.assertEquals(UpgradeCatalog260.FROM_REPO_VERSION_ID_COLUMN, fromRepoID.getName());
+     Assert.assertEquals(Long.class, fromRepoID.getType());
+     Assert.assertEquals(null, fromRepoID.getLength());
+     Assert.assertEquals(null, fromRepoID.getDefaultValue());
+     Assert.assertEquals(false, fromRepoID.isNullable());
+ 
+     DBColumnInfo targetRepoID = columnsValue.get(5);
+     Assert.assertEquals(UpgradeCatalog260.TARGET_REPO_VERSION_ID_COLUMN, targetRepoID.getName());
+     Assert.assertEquals(Long.class, targetRepoID.getType());
+     Assert.assertEquals(null, targetRepoID.getLength());
+     Assert.assertEquals(null, targetRepoID.getDefaultValue());
+     Assert.assertEquals(false, targetRepoID.isNullable());
+   }
+ 
+   public void expectCreateUpgradeHistoryTable(Capture<List<DBColumnInfo>> columns) throws SQLException {
+     dbAccessor.createTable(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), capture(columns));
+     expectLastCall().once();
+ 
+     dbAccessor.addPKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), eq(UpgradeCatalog260.PK_UPGRADE_HIST), eq(UpgradeCatalog260.ID_COLUMN));
+     expectLastCall().once();
+ 
+     dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), eq(UpgradeCatalog260.FK_UPGRADE_HIST_UPGRADE_ID), eq(UpgradeCatalog260.UPGRADE_ID_COLUMN), eq(UpgradeCatalog260.UPGRADE_TABLE), eq(UpgradeCatalog260.UPGRADE_ID_COLUMN), eq(false));
+     expectLastCall().once();
+     dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), eq(UpgradeCatalog260.FK_UPGRADE_HIST_FROM_REPO), eq(UpgradeCatalog260.FROM_REPO_VERSION_ID_COLUMN), eq(UpgradeCatalog260.REPO_VERSION_TABLE), eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+     expectLastCall().once();
+     dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), eq(UpgradeCatalog260.FK_UPGRADE_HIST_TARGET_REPO), eq(UpgradeCatalog260.TARGET_REPO_VERSION_ID_COLUMN), eq(UpgradeCatalog260.REPO_VERSION_TABLE), eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+     expectLastCall().once();
+     dbAccessor.addUniqueConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), eq(UpgradeCatalog260.UQ_UPGRADE_HIST), eq(UpgradeCatalog260.UPGRADE_ID_COLUMN), eq(UpgradeCatalog260.COMPONENT_NAME_COLUMN), eq(UpgradeCatalog260.SERVICE_NAME_COLUMN));
+     expectLastCall().once();
+   }
+ 
+   public void verifyUpdateUpgradeTable(Capture<DBColumnInfo> rvid,
+       Capture<DBColumnInfo> orchestration, Capture<DBColumnInfo> revertAllowed) {
+     DBColumnInfo rvidValue = rvid.getValue();
+     Assert.assertEquals(UpgradeCatalog260.REPO_VERSION_ID_COLUMN, rvidValue.getName());
+     Assert.assertEquals(Long.class, rvidValue.getType());
+     Assert.assertEquals(null, rvidValue.getLength());
+     Assert.assertEquals(null, rvidValue.getDefaultValue());
+     Assert.assertEquals(false, rvidValue.isNullable());
+ 
+     DBColumnInfo orchestrationValue = orchestration.getValue();
+     Assert.assertEquals(UpgradeCatalog260.ORCHESTRATION_COLUMN, orchestrationValue.getName());
+     Assert.assertEquals(String.class, orchestrationValue.getType());
+     Assert.assertEquals(Integer.valueOf(255), orchestrationValue.getLength());
+     Assert.assertEquals(UpgradeCatalog260.STANDARD, orchestrationValue.getDefaultValue());
+     Assert.assertEquals(false, orchestrationValue.isNullable());
+ 
+     DBColumnInfo revertAllowedValue = revertAllowed.getValue();
+     Assert.assertEquals(UpgradeCatalog260.ALLOW_REVERT_COLUMN, revertAllowedValue.getName());
+     Assert.assertEquals(Short.class, revertAllowedValue.getType());
+     Assert.assertEquals(null, revertAllowedValue.getLength());
+     Assert.assertEquals(0, revertAllowedValue.getDefaultValue());
+     Assert.assertEquals(false, revertAllowedValue.isNullable());
+   }
+ 
+   public void expectUpdateUpgradeTable(Capture<DBColumnInfo> rvid,
 -                                       Capture<DBColumnInfo> orchestration, Capture<DBColumnInfo> revertAllowed)
++      Capture<DBColumnInfo> orchestration, Capture<DBColumnInfo> revertAllowed)
+       throws SQLException {
+ 
+     dbAccessor.clearTable(eq(UpgradeCatalog260.UPGRADE_TABLE));
+     expectLastCall().once();
+ 
+     dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.UPGRADE_TABLE), eq(UpgradeCatalog260.FK_UPGRADE_FROM_REPO_ID));
+     expectLastCall().once();
+ 
+     dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.UPGRADE_TABLE), eq(UpgradeCatalog260.FK_UPGRADE_TO_REPO_ID));
+     expectLastCall().once();
+ 
+     dbAccessor.dropColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), eq(UpgradeCatalog260.FROM_REPO_VERSION_ID_COLUMN));
+     expectLastCall().once();
+ 
+     dbAccessor.dropColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), eq(UpgradeCatalog260.TO_REPO_VERSION_ID_COLUMN));
+     expectLastCall().once();
+ 
+     dbAccessor.addColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), capture(rvid));
+     expectLastCall().once();
+ 
+     dbAccessor.addColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), capture(orchestration));
+     expectLastCall().once();
+ 
+     dbAccessor.addColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), capture(revertAllowed));
+     expectLastCall().once();
+ 
+     dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_TABLE), eq(UpgradeCatalog260.FK_UPGRADE_REPO_VERSION_ID), eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(UpgradeCatalog260.REPO_VERSION_TABLE), eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+     expectLastCall().once();
+   }
+ 
+   public void expectUpdateHostComponentStateTable() throws SQLException {
+     dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.HOST_COMPONENT_STATE_TABLE), eq(UpgradeCatalog260.FK_HCS_CURRENT_STACK_ID));
+     expectLastCall().once();
+     dbAccessor.dropColumn(eq(UpgradeCatalog260.HOST_COMPONENT_STATE_TABLE), eq(UpgradeCatalog260.CURRENT_STACK_ID_COLUMN));
+     expectLastCall().once();
+   }
+ 
+   public void expectUpdateHostComponentDesiredStateTable() throws SQLException {
+     dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.HOST_COMPONENT_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.FK_HCDS_DESIRED_STACK_ID));
+     expectLastCall().once();
+     dbAccessor.dropColumn(eq(UpgradeCatalog260.HOST_COMPONENT_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.DESIRED_STACK_ID_COLUMN));
+     expectLastCall().once();
+   }
+ 
+   public void verifyAddSelectedCollumsToClusterconfigTable(Capture<DBColumnInfo> selectedColumnInfo, Capture<DBColumnInfo> selectedmappingColumnInfo, Capture<DBColumnInfo> selectedTimestampColumnInfo, Capture<DBColumnInfo> createTimestampColumnInfo) {
+     DBColumnInfo selectedColumnInfoValue = selectedColumnInfo.getValue();
+     Assert.assertEquals(UpgradeCatalog260.SELECTED_COLUMN, selectedColumnInfoValue.getName());
+     Assert.assertEquals(Short.class, selectedColumnInfoValue.getType());
+     Assert.assertEquals(null, selectedColumnInfoValue.getLength());
+     Assert.assertEquals(0, selectedColumnInfoValue.getDefaultValue());
+     Assert.assertEquals(false, selectedColumnInfoValue.isNullable());
+ 
+     DBColumnInfo selectedmappingColumnInfoValue = selectedmappingColumnInfo.getValue();
+     Assert.assertEquals(UpgradeCatalog260.SELECTED_COLUMN, selectedmappingColumnInfoValue.getName());
+     Assert.assertEquals(Integer.class, selectedmappingColumnInfoValue.getType());
+     Assert.assertEquals(null, selectedmappingColumnInfoValue.getLength());
+     Assert.assertEquals(0, selectedmappingColumnInfoValue.getDefaultValue());
+     Assert.assertEquals(false, selectedmappingColumnInfoValue.isNullable());
+ 
+     DBColumnInfo selectedTimestampColumnInfoValue = selectedTimestampColumnInfo.getValue();
+     Assert.assertEquals(UpgradeCatalog260.SELECTED_TIMESTAMP_COLUMN, selectedTimestampColumnInfoValue.getName());
+     Assert.assertEquals(Long.class, selectedTimestampColumnInfoValue.getType());
+     Assert.assertEquals(null, selectedTimestampColumnInfoValue.getLength());
+     Assert.assertEquals(0, selectedTimestampColumnInfoValue.getDefaultValue());
+     Assert.assertEquals(false, selectedTimestampColumnInfoValue.isNullable());
+ 
+     DBColumnInfo createTimestampColumnInfoValue = createTimestampColumnInfo.getValue();
+     Assert.assertEquals(UpgradeCatalog260.CREATE_TIMESTAMP_COLUMN, createTimestampColumnInfoValue.getName());
+     Assert.assertEquals(Long.class, createTimestampColumnInfoValue.getType());
+     Assert.assertEquals(null, createTimestampColumnInfoValue.getLength());
+     Assert.assertEquals(null, createTimestampColumnInfoValue.getDefaultValue());
+     Assert.assertEquals(false, createTimestampColumnInfoValue.isNullable());
+   }
+ 
+   public void expectAddSelectedCollumsToClusterconfigTable(Capture<DBColumnInfo> selectedColumnInfo, Capture<DBColumnInfo> selectedmappingColumnInfo, Capture<DBColumnInfo> selectedTimestampColumnInfo, Capture<DBColumnInfo> createTimestampColumnInfo) throws SQLException {
+     dbAccessor.copyColumnToAnotherTable(eq(UpgradeCatalog260.CLUSTER_CONFIG_MAPPING_TABLE), capture(selectedmappingColumnInfo),
+         eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), eq(UpgradeCatalog260.TYPE_NAME_COLUMN), eq(UpgradeCatalog260.VERSION_TAG_COLUMN), eq(UpgradeCatalog260.CLUSTER_CONFIG_TABLE), capture(selectedColumnInfo),
+         eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), eq(UpgradeCatalog260.TYPE_NAME_COLUMN), eq(UpgradeCatalog260.VERSION_TAG_COLUMN), eq(UpgradeCatalog260.SELECTED_COLUMN), eq(UpgradeCatalog260.SELECTED), eq(0));
+     expectLastCall().once();
+ 
+     dbAccessor.copyColumnToAnotherTable(eq(UpgradeCatalog260.CLUSTER_CONFIG_MAPPING_TABLE), capture(createTimestampColumnInfo),
+         eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), eq(UpgradeCatalog260.TYPE_NAME_COLUMN), eq(UpgradeCatalog260.VERSION_TAG_COLUMN), eq(UpgradeCatalog260.CLUSTER_CONFIG_TABLE), capture(selectedTimestampColumnInfo),
+         eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), eq(UpgradeCatalog260.TYPE_NAME_COLUMN), eq(UpgradeCatalog260.VERSION_TAG_COLUMN), eq(UpgradeCatalog260.SELECTED_COLUMN), eq(UpgradeCatalog260.SELECTED), eq(0));
+     expectLastCall().once();
+   }
+ 
+   public void verifyUpdateServiceDesiredStateTable(Capture<DBColumnInfo> sdstadd, Capture<DBColumnInfo> sdstalter) {
+     DBColumnInfo sdstaddValue = sdstadd.getValue();
+     Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, sdstaddValue.getName());
+     Assert.assertEquals(1, sdstaddValue.getDefaultValue());
+     Assert.assertEquals(Long.class, sdstaddValue.getType());
+     Assert.assertEquals(false, sdstaddValue.isNullable());
+     Assert.assertEquals(null, sdstaddValue.getLength());
+ 
+     DBColumnInfo sdstalterValue = sdstalter.getValue();
+     Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, sdstalterValue.getName());
+     Assert.assertEquals(null, sdstalterValue.getDefaultValue());
+     Assert.assertEquals(Long.class, sdstalterValue.getType());
+     Assert.assertEquals(false, sdstalterValue.isNullable());
+     Assert.assertEquals(null, sdstalterValue.getLength());
+   }
+ 
+   public void expectUpdateServiceDesiredStateTable(Capture<DBColumnInfo> sdstadd, Capture<DBColumnInfo> sdstalter) throws SQLException {
+     dbAccessor.addColumn(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), capture(sdstadd));
+     expectLastCall().once();
+     dbAccessor.alterColumn(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), capture(sdstalter));
+     expectLastCall().once();
+ 
+     dbAccessor.addFKConstraint(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.FK_REPO_VERSION_ID), eq(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN), eq(UpgradeCatalog260.REPO_VERSION_TABLE), eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+     expectLastCall().once();
+     dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.FK_SDS_DESIRED_STACK_ID));
+     expectLastCall().once();
+     dbAccessor.dropColumn(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.DESIRED_STACK_ID_COLUMN));
+     expectLastCall().once();
+   }
+ 
+   public void verifyUpdateServiceComponentDesiredStateTable(Capture<DBColumnInfo> scdstadd1, Capture<DBColumnInfo> scdstalter1, Capture<DBColumnInfo> scdstadd2, Capture<DBColumnInfo> scdstalter2) {
+     DBColumnInfo scdstaddValue1 = scdstadd1.getValue();
+     Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, scdstaddValue1.getName());
+     Assert.assertEquals(1, scdstaddValue1.getDefaultValue());
+     Assert.assertEquals(Long.class, scdstaddValue1.getType());
+     Assert.assertEquals(false, scdstaddValue1.isNullable());
+ 
+     DBColumnInfo scdstalterValue1 = scdstalter1.getValue();
+     Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, scdstalterValue1.getName());
+     Assert.assertEquals(null, scdstalterValue1.getDefaultValue());
+     Assert.assertEquals(Long.class, scdstalterValue1.getType());
+     Assert.assertEquals(false, scdstalterValue1.isNullable());
+ 
+     DBColumnInfo scdstaddValue2 = scdstadd2.getValue();
+     Assert.assertEquals(UpgradeCatalog260.REPO_STATE_COLUMN, scdstaddValue2.getName());
+     Assert.assertEquals(UpgradeCatalog260.CURRENT, scdstaddValue2.getDefaultValue());
+     Assert.assertEquals(String.class, scdstaddValue2.getType());
+     Assert.assertEquals(false, scdstaddValue2.isNullable());
+     Assert.assertEquals(Integer.valueOf(255), scdstaddValue2.getLength());
+ 
+     DBColumnInfo scdstalterValue2 = scdstalter2.getValue();
+     Assert.assertEquals(UpgradeCatalog260.REPO_STATE_COLUMN, scdstalterValue2.getName());
+     Assert.assertEquals(UpgradeCatalog260.NOT_REQUIRED, scdstalterValue2.getDefaultValue());
+     Assert.assertEquals(String.class, scdstalterValue2.getType());
+     Assert.assertEquals(false, scdstalterValue2.isNullable());
+     Assert.assertEquals(Integer.valueOf(255), scdstaddValue2.getLength());
+   }
+ 
+   public void verifyGetCurrentVersionID(Capture<String[]> scdcaptureKey, Capture<String[]> scdcaptureValue) {
 -    assertTrue(Arrays.equals(scdcaptureKey.getValue(), new String[]{UpgradeCatalog260.STATE_COLUMN}));
 -    assertTrue(Arrays.equals(scdcaptureValue.getValue(), new String[]{UpgradeCatalog260.CURRENT}));
++    Assert.assertTrue(Arrays.equals(scdcaptureKey.getValue(), new String[]{UpgradeCatalog260.STATE_COLUMN}));
++    Assert.assertTrue(Arrays.equals(scdcaptureValue.getValue(), new String[]{UpgradeCatalog260.CURRENT}));
+   }
+ 
+   public void expectUpdateServiceComponentDesiredStateTable(Capture<DBColumnInfo> scdstadd1, Capture<DBColumnInfo> scdstalter1, Capture<DBColumnInfo> scdstadd2, Capture<DBColumnInfo> scdstalter2) throws SQLException {
+     dbAccessor.addColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), capture(scdstadd1));
+     expectLastCall().once();
+ 
+     dbAccessor.alterColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), capture(scdstalter1));
+     expectLastCall().once();
+ 
+     dbAccessor.addColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), capture(scdstadd2));
+     expectLastCall().once();
+ 
+     dbAccessor.alterColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), capture(scdstalter2));
+     expectLastCall().once();
+ 
+     dbAccessor.addFKConstraint(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.FK_SCDS_DESIRED_REPO_ID), eq(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN), eq(UpgradeCatalog260.REPO_VERSION_TABLE), eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+     expectLastCall().once();
+ 
+     dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.FK_SCDS_DESIRED_STACK_ID));
+     expectLastCall().once();
+     dbAccessor.dropColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.DESIRED_STACK_ID_COLUMN));
+     expectLastCall().once();
+     dbAccessor.dropColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE), eq(UpgradeCatalog260.DESIRED_VERSION_COLUMN));
+     expectLastCall().once();
+   }
+ 
+   public void expectGetCurrentVersionID(List<Integer> current, Capture<String[]> scdcaptureKey, Capture<String[]> scdcaptureValue) throws SQLException {
+     expect(dbAccessor.getIntColumnValues(eq("cluster_version"), eq("repo_version_id"),
+         capture(scdcaptureKey), capture(scdcaptureValue), eq(false))).andReturn(current).once();
+   }
+ 
+   @Test
+   public void testRemoveDruidSuperset() throws Exception {
+ 
+     List<Integer> current = new ArrayList<>();
+     current.add(1);
+ 
+     expect(dbAccessor.getConnection()).andReturn(connection).anyTimes();
+     expect(connection.createStatement()).andReturn(statement).anyTimes();
+     expect(statement.executeQuery(anyObject(String.class))).andReturn(resultSet).anyTimes();
+     expect(configuration.getDatabaseType()).andReturn(Configuration.DatabaseType.POSTGRES).anyTimes();
+ 
+     dbAccessor.executeQuery("DELETE FROM serviceconfigmapping WHERE config_id IN (SELECT config_id from clusterconfig where type_name like 'druid-superset%')");
+     expectLastCall().once();
+     dbAccessor.executeQuery("DELETE FROM clusterconfig WHERE type_name like 'druid-superset%'");
+     expectLastCall().once();
+     dbAccessor.executeQuery("DELETE FROM hostcomponentdesiredstate WHERE component_name = 'DRUID_SUPERSET'");
+     expectLastCall().once();
+     dbAccessor.executeQuery("DELETE FROM hostcomponentstate WHERE component_name = 'DRUID_SUPERSET'");
+     expectLastCall().once();
+     dbAccessor.executeQuery("DELETE FROM servicecomponentdesiredstate WHERE component_name = 'DRUID_SUPERSET'");
+     expectLastCall().once();
+     replay(dbAccessor, configuration, connection, statement, resultSet);
+ 
 -    Injector injector = getInjector();
++    Module module = new Module() {
++      @Override
++      public void configure(Binder binder) {
++        binder.bind(DBAccessor.class).toInstance(dbAccessor);
++        binder.bind(OsFamily.class).toInstance(osFamily);
++        binder.bind(EntityManager.class).toInstance(entityManager);
++        binder.bind(Configuration.class).toInstance(configuration);
++      }
++    };
++
++    Injector injector = Guice.createInjector(module);
+     UpgradeCatalog260 upgradeCatalog260 = injector.getInstance(UpgradeCatalog260.class);
 -    upgradeCatalog260.executePreDMLUpdates();
++    upgradeCatalog260.removeSupersetFromDruid();
+ 
+     verify(dbAccessor);
+ 
+   }
+ 
+   /**
+    * Sets expectations for DDL work on the
+    * {@link UpgradeCatalog260#REPO_VERSION_TABLE}.
+    *
+    * @param hiddenColumnCapture
+    * @throws SQLException
+    */
 -  public void expectUpdateRepositoryVersionTableTable(Capture<DBColumnInfo> hiddenColumnCapture,
 -      Capture<DBColumnInfo> repoVersionResolvedColumnCapture) throws SQLException {
++  public void expectUpdateRepositoryVersionTableTable(Capture<DBColumnInfo> hiddenColumnCapture) throws SQLException {
+     dbAccessor.addColumn(eq(UpgradeCatalog260.REPO_VERSION_TABLE), capture(hiddenColumnCapture));
 -    dbAccessor.addColumn(eq(UpgradeCatalog260.REPO_VERSION_TABLE), capture(repoVersionResolvedColumnCapture));
+     expectLastCall().once();
+   }
+ 
 -  public void verifyUpdateRepositoryVersionTableTable(Capture<DBColumnInfo> hiddenColumnCapture,
 -      Capture<DBColumnInfo> resolvedColumnCapture) {
++  public void verifyUpdateRepositoryVersionTableTable(Capture<DBColumnInfo> hiddenColumnCapture) {
+     DBColumnInfo hiddenColumn = hiddenColumnCapture.getValue();
+     Assert.assertEquals(0, hiddenColumn.getDefaultValue());
+     Assert.assertEquals(UpgradeCatalog260.REPO_VERSION_HIDDEN_COLUMN, hiddenColumn.getName());
+     Assert.assertEquals(false, hiddenColumn.isNullable());
 -
 -    DBColumnInfo resolvedColumn = resolvedColumnCapture.getValue();
 -    Assert.assertEquals(0, resolvedColumn.getDefaultValue());
 -    Assert.assertEquals(UpgradeCatalog260.REPO_VERSION_RESOLVED_COLUMN, resolvedColumn.getName());
 -    Assert.assertEquals(false, resolvedColumn.isNullable());
+   }
+ 
+   @Test
+   public void testEnsureZeppelinProxyUserConfigs() throws AmbariException {
+ 
 -    Injector injector = getInjector();
 -
 -    final Clusters clusters = injector.getInstance(Clusters.class);
++    final Clusters clusters = createMock(Clusters.class);
+     final Cluster cluster = createMock(Cluster.class);
+     final Config zeppelinEnvConf = createMock(Config.class);
+     final Config coreSiteConf = createMock(Config.class);
+     final Config coreSiteConfNew = createMock(Config.class);
 -    final AmbariManagementController controller = injector.getInstance(AmbariManagementController.class);
++    final AmbariManagementController controller = createMock(AmbariManagementController.class);
+ 
+     Capture<? extends Map<String, String>> captureCoreSiteConfProperties = newCapture();
+ 
++    Module module = new Module() {
++      @Override
++      public void configure(Binder binder) {
++        binder.bind(DBAccessor.class).toInstance(dbAccessor);
++        binder.bind(OsFamily.class).toInstance(osFamily);
++        binder.bind(EntityManager.class).toInstance(entityManager);
++        binder.bind(Configuration.class).toInstance(configuration);
++        binder.bind(Clusters.class).toInstance(clusters);
++        binder.bind(AmbariManagementController.class).toInstance(controller);
++      }
++    };
++
+     expect(clusters.getClusters()).andReturn(Collections.singletonMap("c1", cluster)).once();
+ 
+     expect(cluster.getClusterName()).andReturn("c1").atLeastOnce();
+     expect(cluster.getDesiredStackVersion()).andReturn(new StackId("HDP-2.6")).atLeastOnce();
+     expect(cluster.getDesiredConfigByType("zeppelin-env")).andReturn(zeppelinEnvConf).atLeastOnce();
+     expect(cluster.getDesiredConfigByType("core-site")).andReturn(coreSiteConf).atLeastOnce();
+     expect(cluster.getConfigsByType("core-site")).andReturn(Collections.singletonMap("tag1", coreSiteConf)).atLeastOnce();
+     expect(cluster.getConfig(eq("core-site"), anyString())).andReturn(coreSiteConfNew).atLeastOnce();
+     expect(cluster.getServiceByConfigType("core-site")).andReturn("HDFS").atLeastOnce();
+     expect(cluster.addDesiredConfig(eq("ambari-upgrade"), anyObject(Set.class), anyString())).andReturn(null).atLeastOnce();
+ 
+     expect(zeppelinEnvConf.getProperties()).andReturn(Collections.singletonMap("zeppelin_user", "zeppelin_user")).once();
+ 
+     expect(coreSiteConf.getProperties()).andReturn(Collections.singletonMap("hadoop.proxyuser.zeppelin_user.hosts", "existing_value")).atLeastOnce();
+     expect(coreSiteConf.getPropertiesAttributes()).andReturn(Collections.<String, Map<String, String>>emptyMap()).atLeastOnce();
+ 
+     expect(controller.createConfig(eq(cluster), anyObject(StackId.class), eq("core-site"), capture(captureCoreSiteConfProperties), anyString(), anyObject(Map.class)))
+         .andReturn(coreSiteConfNew)
+         .once();
+ 
+     replay(clusters, cluster, zeppelinEnvConf, coreSiteConf, coreSiteConfNew, controller);
+ 
++    Injector injector = Guice.createInjector(module);
+     UpgradeCatalog260 upgradeCatalog260 = injector.getInstance(UpgradeCatalog260.class);
+     upgradeCatalog260.ensureZeppelinProxyUserConfigs();
+ 
+     verify(clusters, cluster, zeppelinEnvConf, coreSiteConf, coreSiteConfNew, controller);
+ 
 -    assertTrue(captureCoreSiteConfProperties.hasCaptured());
++    Assert.assertTrue(captureCoreSiteConfProperties.hasCaptured());
+     Assert.assertEquals("existing_value", captureCoreSiteConfProperties.getValue().get("hadoop.proxyuser.zeppelin_user.hosts"));
+     Assert.assertEquals("*", captureCoreSiteConfProperties.getValue().get("hadoop.proxyuser.zeppelin_user.groups"));
+   }
 -
 -  @Test
 -  public void testUpdateKerberosDescriptorArtifact() throws Exception {
 -
 -    Injector injector = getInjector();
 -
 -    URL systemResourceURL = ClassLoader.getSystemResource("kerberos/test_kerberos_descriptor_ranger_kms.json");
 -    Assert.assertNotNull(systemResourceURL);
 -
 -    final KerberosDescriptor kerberosDescriptor = new KerberosDescriptorFactory().createInstance(new File(systemResourceURL.getFile()));
 -    Assert.assertNotNull(kerberosDescriptor);
 -
 -    KerberosServiceDescriptor serviceDescriptor;
 -    serviceDescriptor = kerberosDescriptor.getService("RANGER_KMS");
 -    Assert.assertNotNull(serviceDescriptor);
 -    Assert.assertNotNull(serviceDescriptor.getIdentity("/smokeuser"));
 -    Assert.assertNotNull(serviceDescriptor.getIdentity("/spnego"));
 -
 -    KerberosComponentDescriptor componentDescriptor;
 -    componentDescriptor = serviceDescriptor.getComponent("RANGER_KMS_SERVER");
 -    Assert.assertNotNull(componentDescriptor);
 -    Assert.assertNotNull(componentDescriptor.getIdentity("/smokeuser"));
 -    Assert.assertNotNull(componentDescriptor.getIdentity("/spnego"));
 -    Assert.assertNotNull(componentDescriptor.getIdentity("/spnego").getPrincipalDescriptor());
 -    Assert.assertEquals("invalid_name@${realm}", componentDescriptor.getIdentity("/spnego").getPrincipalDescriptor().getValue());
 -
 -    ArtifactEntity artifactEntity = createMock(ArtifactEntity.class);
 -
 -    expect(artifactEntity.getArtifactData()).andReturn(kerberosDescriptor.toMap()).once();
 -
 -    Capture<Map<String, Object>> captureMap = newCapture();
 -    expect(artifactEntity.getForeignKeys()).andReturn(Collections.singletonMap("cluster", "2"));
 -    artifactEntity.setArtifactData(capture(captureMap));
 -    expectLastCall().once();
 -
 -    ArtifactDAO artifactDAO = createMock(ArtifactDAO.class);
 -    expect(artifactDAO.merge(artifactEntity)).andReturn(artifactEntity).atLeastOnce();
 -
 -    Map<String, String> properties = new HashMap<>();
 -    properties.put("ranger.ks.kerberos.principal", "correct_value@EXAMPLE.COM");
 -    properties.put("xasecure.audit.jaas.Client.option.principal", "wrong_value@EXAMPLE.COM");
 -
 -    Config config = createMock(Config.class);
 -    expect(config.getProperties()).andReturn(properties).anyTimes();
 -    expect(config.getPropertiesAttributes()).andReturn(Collections.<String, Map<String, String>>emptyMap()).anyTimes();
 -    expect(config.getTag()).andReturn("version1").anyTimes();
 -    expect(config.getType()).andReturn("ranger-kms-audit").anyTimes();
 -
 -    Config newConfig = createMock(Config.class);
 -    expect(newConfig.getTag()).andReturn("version2").anyTimes();
 -    expect(newConfig.getType()).andReturn("ranger-kms-audit").anyTimes();
 -
 -    ServiceConfigVersionResponse response = createMock(ServiceConfigVersionResponse.class);
 -
 -    StackId stackId = createMock(StackId.class);
 -
 -    Cluster cluster = createMock(Cluster.class);
 -    expect(cluster.getDesiredStackVersion()).andReturn(stackId).anyTimes();
 -    expect(cluster.getDesiredConfigByType("dbks-site")).andReturn(config).anyTimes();
 -    expect(cluster.getDesiredConfigByType("ranger-kms-audit")).andReturn(config).anyTimes();
 -    expect(cluster.getConfigsByType("ranger-kms-audit")).andReturn(Collections.singletonMap("version1", config)).anyTimes();
 -    expect(cluster.getServiceByConfigType("ranger-kms-audit")).andReturn("RANGER").anyTimes();
 -    expect(cluster.getClusterName()).andReturn("cl1").anyTimes();
 -    expect(cluster.getConfig(eq("ranger-kms-audit"), anyString())).andReturn(newConfig).once();
 -    expect(cluster.addDesiredConfig("ambari-upgrade", Collections.singleton(newConfig), "Updated ranger-kms-audit during Ambari Upgrade from 2.5.2 to 2.6.0.")).andReturn(response).once();
 -
 -    final Clusters clusters = injector.getInstance(Clusters.class);
 -    expect(clusters.getCluster(2L)).andReturn(cluster).anyTimes();
 -
 -    Capture<? extends Map<String, String>> captureProperties = newCapture();
 -
 -    AmbariManagementController controller = injector.getInstance(AmbariManagementController.class);
 -    expect(controller.createConfig(eq(cluster), eq(stackId), eq("ranger-kms-audit"), capture(captureProperties), anyString(), anyObject(Map.class)))
 -        .andReturn(null)
 -        .once();
 -
 -    replay(artifactDAO, artifactEntity, cluster, clusters, config, newConfig, response, controller, stackId);
 -
 -    UpgradeCatalog260 upgradeCatalog260 = injector.getInstance(UpgradeCatalog260.class);
 -    upgradeCatalog260.updateKerberosDescriptorArtifact(artifactDAO, artifactEntity);
 -    verify(artifactDAO, artifactEntity, cluster, clusters, config, newConfig, response, controller, stackId);
 -
 -    KerberosDescriptor kerberosDescriptorUpdated = new KerberosDescriptorFactory().createInstance(captureMap.getValue());
 -    Assert.assertNotNull(kerberosDescriptorUpdated);
 -
 -    Assert.assertNull(kerberosDescriptorUpdated.getService("RANGER_KMS").getIdentity("/smokeuser"));
 -    Assert.assertNull(kerberosDescriptorUpdated.getService("RANGER_KMS").getComponent("RANGER_KMS_SERVER").getIdentity("/smokeuser"));
 -
 -    KerberosIdentityDescriptor identity;
 -
 -    Assert.assertNull(kerberosDescriptorUpdated.getService("RANGER_KMS").getIdentity("/spnego"));
 -    identity = kerberosDescriptorUpdated.getService("RANGER_KMS").getIdentity("ranger_kms_spnego");
 -    Assert.assertNotNull(identity);
 -    Assert.assertEquals("/spnego", identity.getReference());
 -
 -    Assert.assertNull(kerberosDescriptorUpdated.getService("RANGER_KMS").getComponent("RANGER_KMS_SERVER").getIdentity("/spnego"));
 -    identity = kerberosDescriptorUpdated.getService("RANGER_KMS").getComponent("RANGER_KMS_SERVER").getIdentity("ranger_kms_ranger_kms_server_spnego");
 -    Assert.assertNotNull(identity);
 -    Assert.assertEquals("/spnego", identity.getReference());
 -    Assert.assertNotNull(identity.getPrincipalDescriptor());
 -    Assert.assertNull(identity.getPrincipalDescriptor().getValue());
 -
 -    Assert.assertTrue(captureProperties.hasCaptured());
 -    Map<String, String> newProperties = captureProperties.getValue();
 -    Assert.assertEquals("correct_value@EXAMPLE.COM", newProperties.get("xasecure.audit.jaas.Client.option.principal"));
 -  }
 -
 -  @Test
 -  public void testUpdateAmsConfigs() throws Exception {
 -
 -    Map<String, String> oldProperties = new HashMap<String, String>() {
 -      {
 -        put("ssl.client.truststore.location", "/some/location");
 -        put("ssl.client.truststore.alias", "test_alias");
 -      }
 -    };
 -    Map<String, String> newProperties = new HashMap<String, String>() {
 -      {
 -        put("ssl.client.truststore.location", "/some/location");
 -      }
 -    };
 -
 -    EasyMockSupport easyMockSupport = new EasyMockSupport();
 -
 -    Clusters clusters = easyMockSupport.createNiceMock(Clusters.class);
 -    final Cluster cluster = easyMockSupport.createNiceMock(Cluster.class);
 -    Config mockAmsSslClient = easyMockSupport.createNiceMock(Config.class);
 -
 -    expect(clusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
 -      put("normal", cluster);
 -    }}).once();
 -    expect(cluster.getDesiredConfigByType("ams-ssl-client")).andReturn(mockAmsSslClient).atLeastOnce();
 -    expect(mockAmsSslClient.getProperties()).andReturn(oldProperties).anyTimes();
 -
 -    Injector injector = easyMockSupport.createNiceMock(Injector.class);
 -    expect(injector.getInstance(Gson.class)).andReturn(null).anyTimes();
 -    expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(null).anyTimes();
 -
 -    replay(injector, clusters, mockAmsSslClient, cluster);
 -
 -    AmbariManagementControllerImpl controller = createMockBuilder(AmbariManagementControllerImpl.class)
 -      .addMockedMethod("createConfiguration")
 -      .addMockedMethod("getClusters", new Class[] { })
 -      .addMockedMethod("createConfig")
 -      .withConstructor(createNiceMock(ActionManager.class), clusters, injector)
 -      .createNiceMock();
 -
 -    Injector injector2 = easyMockSupport.createNiceMock(Injector.class);
 -    Capture<Map> propertiesCapture = EasyMock.newCapture();
 -
 -    expect(injector2.getInstance(AmbariManagementController.class)).andReturn(controller).anyTimes();
 -    expect(controller.getClusters()).andReturn(clusters).anyTimes();
 -    expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), anyString(), capture(propertiesCapture), anyString(),
 -      anyObject(Map.class))).andReturn(createNiceMock(Config.class)).once();
 -
 -    replay(controller, injector2);
 -    new UpgradeCatalog260(injector2).updateAmsConfigs();
 -    easyMockSupport.verifyAll();
 -
 -    Map<String, String> updatedProperties = propertiesCapture.getValue();
 -    assertTrue(Maps.difference(newProperties, updatedProperties).areEqual());
 -  }
 -
 -  @Test
 -   public void testHDFSWidgetUpdate() throws Exception {
 -         final Clusters clusters = createNiceMock(Clusters.class);
 -         final Cluster cluster = createNiceMock(Cluster.class);
 -         final AmbariManagementController controller = createNiceMock(AmbariManagementController.class);
 -         final Gson gson = new Gson();
 -         final WidgetDAO widgetDAO = createNiceMock(WidgetDAO.class);
 -         final AmbariMetaInfo metaInfo = createNiceMock(AmbariMetaInfo.class);
 -         WidgetEntity widgetEntity = createNiceMock(WidgetEntity.class);
 -         StackId stackId = new StackId("HDP", "2.0.0");
 -         StackInfo stackInfo = createNiceMock(StackInfo.class);
 -         ServiceInfo serviceInfo = createNiceMock(ServiceInfo.class);
 -         Service service  = createNiceMock(Service.class);
 -
 -           String widgetStr = "{\n" +
 -             "  \"layouts\": [\n" +
 -             "      {\n" +
 -             "      \"layout_name\": \"default_hdfs_heatmap\",\n" +
 -             "      \"display_name\": \"Standard HDFS HeatMaps\",\n" +
 -             "      \"section_name\": \"HDFS_HEATMAPS\",\n" +
 -             "      \"widgetLayoutInfo\": [\n" +
 -             "        {\n" +
 -             "          \"widget_name\": \"HDFS Bytes Read\",\n" +
 -             "          \"metrics\": [],\n" +
 -             "          \"values\": []\n" +
 -             "        }\n" +
 -             "      ]\n" +
 -             "    }\n" +
 -             "  ]\n" +
 -             "}";
 -
 -           File dataDirectory = temporaryFolder.newFolder();
 -         File file = new File(dataDirectory, "hdfs_widget.json");
 -         FileUtils.writeStringToFile(file, widgetStr);
 -
 -           final Injector mockInjector = Guice.createInjector(new AbstractModule() {
 -       @Override
 -       protected void configure() {
 -                 bind(EntityManager.class).toInstance(createNiceMock(EntityManager.class));
 -                 bind(AmbariManagementController.class).toInstance(controller);
 -                 bind(Clusters.class).toInstance(clusters);
 -                 bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
 -                 bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
 -                 bind(Gson.class).toInstance(gson);
 -                 bind(WidgetDAO.class).toInstance(widgetDAO);
 -                 bind(StackManagerFactory.class).toInstance(createNiceMock(StackManagerFactory.class));
 -                 bind(AmbariMetaInfo.class).toInstance(metaInfo);
 -               }
 -     });
 -         expect(controller.getClusters()).andReturn(clusters).anyTimes();
 -         expect(clusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
 -             put("normal", cluster);
 -           }}).anyTimes();
 -         expect(cluster.getServices()).andReturn(Collections.singletonMap("HDFS", service)).anyTimes();
 -         expect(cluster.getClusterId()).andReturn(1L).anyTimes();
 -         expect(service.getDesiredStackId()).andReturn(stackId).anyTimes();
 -         expect(stackInfo.getService("HDFS")).andReturn(serviceInfo);
 -         expect(cluster.getDesiredStackVersion()).andReturn(stackId).anyTimes();
 -         expect(metaInfo.getStack("HDP", "2.0.0")).andReturn(stackInfo).anyTimes();
 -         expect(serviceInfo.getWidgetsDescriptorFile()).andReturn(file).anyTimes();
 -
 -           expect(widgetDAO.findByName(1L, "HDFS Bytes Read", "ambari", "HDFS_HEATMAPS"))
 -             .andReturn(Collections.singletonList(widgetEntity));
 -         expect(widgetDAO.merge(widgetEntity)).andReturn(null);
 -         expect(widgetEntity.getWidgetName()).andReturn("HDFS Bytes Read").anyTimes();
 -
 -           replay(clusters, cluster, controller, widgetDAO, metaInfo, widgetEntity, stackInfo, serviceInfo, service);
 -
 -           mockInjector.getInstance(UpgradeCatalog260.class).updateHDFSWidgetDefinition();
 -
 -           verify(clusters, cluster, controller, widgetDAO, widgetEntity, stackInfo, serviceInfo);
 -       }
 -
 -  private Injector getInjector() {
 -
 -    return Guice.createInjector(new Module() {
 -      @Override
 -      public void configure(Binder binder) {
 -        binder.bind(DBAccessor.class).toInstance(dbAccessor);
 -        binder.bind(OsFamily.class).toInstance(osFamily);
 -        binder.bind(EntityManager.class).toInstance(entityManager);
 -        binder.bind(Configuration.class).toInstance(configuration);
 -        binder.bind(Clusters.class).toInstance(createMock(Clusters.class));
 -        binder.bind(AmbariManagementController.class).toInstance(createMock(AmbariManagementController.class));
 -      }
 -    });
 -  }
 -
+ }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
index fec041c,25e9dbf..95a04de
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
@@@ -55,9 -51,10 +51,11 @@@ import org.apache.ambari.server.orm.DBA
  import org.apache.ambari.server.state.Cluster;
  import org.apache.ambari.server.state.Clusters;
  import org.apache.ambari.server.state.Config;
+ import org.apache.ambari.server.state.ConfigHelper;
+ import org.apache.ambari.server.state.StackId;
  import org.apache.ambari.server.state.stack.OsFamily;
  import org.easymock.Capture;
 +import org.easymock.CaptureType;
  import org.easymock.EasyMock;
  import org.easymock.EasyMockRunner;
  import org.easymock.EasyMockSupport;
@@@ -192,108 -186,182 +187,238 @@@ public class UpgradeCatalog300Test 
      verify(dbAccessor);
    }
  
-   /**
-    * Tests pre-DML executions.
-    *
-    * @throws Exception
-    */
    @Test
-   public void testExecutePreDMLUpdates() throws Exception {
-     Module module = new Module() {
-       @Override
-       public void configure(Binder binder) {
-         binder.bind(DBAccessor.class).toInstance(dbAccessor);
-         binder.bind(OsFamily.class).toInstance(osFamily);
-         binder.bind(EntityManager.class).toInstance(entityManager);
-         binder.bind(Configuration.class).toInstance(configuration);
-       }
-     };
- 
-     EntityManagerFactory emFactory = EasyMock.createNiceMock(EntityManagerFactory.class);
-     Cache emCache = EasyMock.createNiceMock(Cache.class);
- 
-     expect(entityManager.getEntityManagerFactory()).andReturn(emFactory).atLeastOnce();
-     expect(emFactory.getCache()).andReturn(emCache).atLeastOnce();
- 
-     EntityTransaction mockTransaction = EasyMock.createNiceMock(EntityTransaction.class);
-     Connection mockConnection = EasyMock.createNiceMock(Connection.class);
-     Statement mockStatement = EasyMock.createNiceMock(Statement.class);
+   public void testLogSearchUpdateConfigs() throws Exception {
+     reset(clusters, cluster);
+     expect(clusters.getClusters()).andReturn(ImmutableMap.of("normal", cluster)).once();
  
-     expect(dbAccessor.getConnection()).andReturn(mockConnection).once();
-     expect(mockConnection.createStatement()).andReturn(mockStatement).once();
+     EasyMockSupport easyMockSupport = new EasyMockSupport();
  
-     expect(mockStatement.executeQuery(EasyMock.anyString())).andReturn(
-         EasyMock.createNiceMock(ResultSet.class));
+     Injector injector2 = easyMockSupport.createNiceMock(Injector.class);
+     AmbariManagementControllerImpl controller = createMockBuilder(AmbariManagementControllerImpl.class)
+         .addMockedMethod("createConfiguration")
+         .addMockedMethod("getClusters", new Class[]{})
+         .addMockedMethod("createConfig")
+         .createNiceMock();
+     ConfigHelper configHelper = createMockBuilder(ConfigHelper.class)
+         .addMockedMethod("removeConfigsByType")
+         .addMockedMethod("createConfigType", Cluster.class, StackId.class, AmbariManagementController.class,
+             String.class, Map.class, String.class, String.class)
+         .createMock();
  
-     expect(entityManager.getTransaction()).andReturn(
-         mockTransaction).atLeastOnce();
+     expect(injector2.getInstance(AmbariManagementController.class)).andReturn(controller).anyTimes();
+     expect(injector2.getInstance(ConfigHelper.class)).andReturn(configHelper).anyTimes();
+     expect(controller.getClusters()).andReturn(clusters).anyTimes();
  
-     dbAccessor.dropTable(UpgradeCatalog300.CLUSTER_CONFIG_MAPPING_TABLE);
-     EasyMock.expectLastCall().once();
+     Config confSomethingElse1 = easyMockSupport.createNiceMock(Config.class);
+     expect(confSomethingElse1.getType()).andReturn("something-else-1");
+     Config confSomethingElse2 = easyMockSupport.createNiceMock(Config.class);
+     expect(confSomethingElse2.getType()).andReturn("something-else-2");
+     Config confLogSearchConf1 = easyMockSupport.createNiceMock(Config.class);
+     expect(confLogSearchConf1.getType()).andReturn("service-1-logsearch-conf");
+     Config confLogSearchConf2 = easyMockSupport.createNiceMock(Config.class);
+     expect(confLogSearchConf2.getType()).andReturn("service-2-logsearch-conf");
  
-     replay(dbAccessor, entityManager, emFactory, emCache, mockConnection, mockTransaction,
-         mockStatement, configuration);
+     Collection<Config> configs = Arrays.asList(confSomethingElse1, confLogSearchConf1, confSomethingElse2, confLogSearchConf2);
  
-     Injector injector = Guice.createInjector(module);
-     UpgradeCatalog300 upgradeCatalog300 = injector.getInstance(UpgradeCatalog300.class);
-     upgradeCatalog300.executePreDMLUpdates();
+     expect(cluster.getAllConfigs()).andReturn(configs).atLeastOnce();
+     configHelper.removeConfigsByType(cluster,"service-1-logsearch-conf");
+     expectLastCall().once();
+     configHelper.removeConfigsByType(cluster,"service-2-logsearch-conf");
+     expectLastCall().once();
+     configHelper.createConfigType(anyObject(Cluster.class), anyObject(StackId.class), eq(controller),
+         eq("logsearch-common-properties"), eq(Collections.emptyMap()), eq("ambari-upgrade"),
+         eq("Updated logsearch-common-properties during Ambari Upgrade from 2.6.0 to 3.0.0"));
+     expectLastCall().once();
  
-     verify(dbAccessor, entityManager, emFactory, emCache);
+     Map<String, String> oldLogSearchProperties = ImmutableMap.of(
+         "logsearch.logfeeder.include.default.level", "FATAL,ERROR,WARN"
+     );
+ 
+     Map<String, String> expectedLogFeederProperties = ImmutableMap.of(
+         "logfeeder.include.default.level", "FATAL,ERROR,WARN"
+     );
+ 
+     Config logFeederPropertiesConf = easyMockSupport.createNiceMock(Config.class);
+     expect(cluster.getDesiredConfigByType("logfeeder-properties")).andReturn(logFeederPropertiesConf).times(2);
+     expect(logFeederPropertiesConf.getProperties()).andReturn(Collections.emptyMap()).once();
+     Capture<Map<String, String>> logFeederPropertiesCapture = EasyMock.newCapture();
+     expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), eq("logfeeder-properties"), capture(logFeederPropertiesCapture),
+         anyString(), EasyMock.anyObject())).andReturn(config).once();
+ 
+     Config logSearchPropertiesConf = easyMockSupport.createNiceMock(Config.class);
+     expect(cluster.getDesiredConfigByType("logsearch-properties")).andReturn(logSearchPropertiesConf).times(2);
+     expect(logSearchPropertiesConf.getProperties()).andReturn(oldLogSearchProperties).times(2);
+     Capture<Map<String, String>> logSearchPropertiesCapture = EasyMock.newCapture();
+     expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), eq("logsearch-properties"), capture(logSearchPropertiesCapture),
+         anyString(), EasyMock.anyObject())).andReturn(config).once();
+ 
+     Map<String, String> oldLogFeederLog4j = ImmutableMap.of(
+         "content", "<!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\">");
+ 
+     Map<String, String> expectedLogFeederLog4j = ImmutableMap.of(
+         "content", "<!DOCTYPE log4j:configuration SYSTEM \"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd\">");
+ 
+     Config logFeederLog4jConf = easyMockSupport.createNiceMock(Config.class);
+     expect(cluster.getDesiredConfigByType("logfeeder-log4j")).andReturn(logFeederLog4jConf).atLeastOnce();
+     expect(logFeederLog4jConf.getProperties()).andReturn(oldLogFeederLog4j).anyTimes();
+     Capture<Map<String, String>> logFeederLog4jCapture = EasyMock.newCapture();
+     expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), anyString(), capture(logFeederLog4jCapture), anyString(),
+         EasyMock.anyObject())).andReturn(config).once();
+ 
+     Map<String, String> oldLogSearchLog4j = ImmutableMap.of(
+         "content", "<!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\">");
+ 
+     Map<String, String> expectedLogSearchLog4j = ImmutableMap.of(
+         "content", "<!DOCTYPE log4j:configuration SYSTEM \"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd\">");
+ 
+     Config logSearchLog4jConf = easyMockSupport.createNiceMock(Config.class);
+     expect(cluster.getDesiredConfigByType("logsearch-log4j")).andReturn(logSearchLog4jConf).atLeastOnce();
+     expect(logSearchLog4jConf.getProperties()).andReturn(oldLogSearchLog4j).anyTimes();
+     Capture<Map<String, String>> logSearchLog4jCapture = EasyMock.newCapture();
+     expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), anyString(), capture(logSearchLog4jCapture), anyString(),
+         EasyMock.anyObject())).andReturn(config).once();
+ 
+     Map<String, String> oldLogSearchServiceLogsConf = ImmutableMap.of(
+         "content", "<before/><requestHandler name=\"/admin/\"   class=\"solr.admin.AdminHandlers\" /><after/>");
+ 
+     Map<String, String> expectedLogSearchServiceLogsConf = ImmutableMap.of(
+         "content", "<before/><after/>");
+ 
+     Config logSearchServiceLogsConf = easyMockSupport.createNiceMock(Config.class);
+     expect(cluster.getDesiredConfigByType("logsearch-service_logs-solrconfig")).andReturn(logSearchServiceLogsConf).atLeastOnce();
+     expect(logSearchServiceLogsConf.getProperties()).andReturn(oldLogSearchServiceLogsConf).anyTimes();
+     Capture<Map<String, String>> logSearchServiceLogsConfCapture = EasyMock.newCapture();
+     expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), anyString(), capture(logSearchServiceLogsConfCapture), anyString(),
+         EasyMock.anyObject())).andReturn(config).once();
+ 
+     Map<String, String> oldLogSearchAuditLogsConf = ImmutableMap.of(
+         "content", "<before/><requestHandler name=\"/admin/\"   class=\"solr.admin.AdminHandlers\" /><after/>");
+ 
+     Map<String, String> expectedLogSearchAuditLogsConf = ImmutableMap.of(
+         "content", "<before/><after/>");
+ 
+     Config logSearchAuditLogsConf = easyMockSupport.createNiceMock(Config.class);
+     expect(cluster.getDesiredConfigByType("logsearch-audit_logs-solrconfig")).andReturn(logSearchAuditLogsConf).atLeastOnce();
+     expect(logSearchAuditLogsConf.getProperties()).andReturn(oldLogSearchAuditLogsConf).anyTimes();
+     Capture<Map<String, String>> logSearchAuditLogsConfCapture = EasyMock.newCapture();
+     expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), anyString(), capture(logSearchAuditLogsConfCapture), anyString(),
+         EasyMock.anyObject())).andReturn(config).once();
+ 
+     Map<String, String> oldLogFeederOutputConf = ImmutableMap.of(
+         "content",
+         "      \"zk_connect_string\":\"{{logsearch_solr_zk_quorum}}{{logsearch_solr_zk_znode}}\",\n" +
+         "      \"collection\":\"{{logsearch_solr_collection_service_logs}}\",\n" +
+         "      \"number_of_shards\": \"{{logsearch_collection_service_logs_numshards}}\",\n" +
+         "      \"splits_interval_mins\": \"{{logsearch_service_logs_split_interval_mins}}\",\n" +
+         "\n" +
+         "      \"zk_connect_string\":\"{{logsearch_solr_zk_quorum}}{{logsearch_solr_zk_znode}}\",\n" +
+         "      \"collection\":\"{{logsearch_solr_collection_audit_logs}}\",\n" +
+         "      \"number_of_shards\": \"{{logsearch_collection_audit_logs_numshards}}\",\n" +
+         "      \"splits_interval_mins\": \"{{logsearch_audit_logs_split_interval_mins}}\",\n"
+     );
+ 
+     Map<String, String> expectedLogFeederOutputConf = ImmutableMap.of(
+         "content",
+         "      \"zk_connect_string\":\"{{logsearch_solr_zk_quorum}}{{logsearch_solr_zk_znode}}\",\n" +
+         "      \"type\": \"service\",\n" +
+         "\n" +
+         "      \"zk_connect_string\":\"{{logsearch_solr_zk_quorum}}{{logsearch_solr_zk_znode}}\",\n" +
+         "      \"type\": \"audit\",\n"
+     );
+ 
+     Config logFeederOutputConf = easyMockSupport.createNiceMock(Config.class);
+     expect(cluster.getDesiredConfigByType("logfeeder-output-config")).andReturn(logFeederOutputConf).atLeastOnce();
+     expect(logFeederOutputConf.getProperties()).andReturn(oldLogFeederOutputConf).anyTimes();
+     Capture<Map<String, String>> logFeederOutputConfCapture = EasyMock.newCapture();
+     expect(controller.createConfig(anyObject(Cluster.class), anyObject(StackId.class), anyString(), capture(logFeederOutputConfCapture), anyString(),
+         EasyMock.anyObject())).andReturn(config).once();
+ 
+     replay(clusters, cluster);
+     replay(controller, injector2);
+     replay(confSomethingElse1, confSomethingElse2, confLogSearchConf1, confLogSearchConf2);
+     replay(logSearchPropertiesConf, logFeederPropertiesConf);
+     replay(logFeederLog4jConf, logSearchLog4jConf);
+     replay(logSearchServiceLogsConf, logSearchAuditLogsConf);
+     replay(logFeederOutputConf);
+     new UpgradeCatalog300(injector2).updateLogSearchConfigs();
+     easyMockSupport.verifyAll();
+ 
+     Map<String,String> newLogFeederProperties = logFeederPropertiesCapture.getValue();
+     assertTrue(Maps.difference(expectedLogFeederProperties, newLogFeederProperties).areEqual());
+ 
+     Map<String,String> newLogSearchProperties = logSearchPropertiesCapture.getValue();
+     assertTrue(Maps.difference(Collections.emptyMap(), newLogSearchProperties).areEqual());
+ 
+     Map<String, String> updatedLogFeederLog4j = logFeederLog4jCapture.getValue();
+     assertTrue(Maps.difference(expectedLogFeederLog4j, updatedLogFeederLog4j).areEqual());
+ 
+     Map<String, String> updatedLogSearchLog4j = logSearchLog4jCapture.getValue();
+     assertTrue(Maps.difference(expectedLogSearchLog4j, updatedLogSearchLog4j).areEqual());
+ 
+     Map<String, String> updatedServiceLogsConf = logSearchServiceLogsConfCapture.getValue();
+     assertTrue(Maps.difference(expectedLogSearchServiceLogsConf, updatedServiceLogsConf).areEqual());
+ 
+     Map<String, String> updatedAuditLogsConf = logSearchAuditLogsConfCapture.getValue();
+     assertTrue(Maps.difference(expectedLogSearchAuditLogsConf, updatedAuditLogsConf).areEqual());
+ 
+     Map<String, String> updatedLogFeederOutputConf = logFeederOutputConfCapture.getValue();
+     assertTrue(Maps.difference(expectedLogFeederOutputConf, updatedLogFeederOutputConf).areEqual());
    }
-   
++
 +  @Test
 +  public void testLogSearchUpdateConfigs() throws Exception {
 +    reset(clusters, cluster);
 +    expect(clusters.getClusters()).andReturn(ImmutableMap.of("normal", cluster)).once();
 +
 +    EasyMockSupport easyMockSupport = new EasyMockSupport();
 +
 +    Injector injector2 = easyMockSupport.createNiceMock(Injector.class);
 +    AmbariManagementControllerImpl controller = createMockBuilder(AmbariManagementControllerImpl.class)
 +        .addMockedMethod("createConfiguration")
 +        .addMockedMethod("getClusters", new Class[]{})
 +        .addMockedMethod("createConfig")
 +        .withConstructor(actionManager, clusters, injector)
 +        .createNiceMock();
 +
 +    expect(injector2.getInstance(AmbariManagementController.class)).andReturn(controller).anyTimes();
 +    expect(controller.getClusters()).andReturn(clusters).anyTimes();
 +
 +    Config confSomethingElse1 = easyMockSupport.createNiceMock(Config.class);
 +    expect(confSomethingElse1.getType()).andReturn("something-else-1");
 +    Config confSomethingElse2 = easyMockSupport.createNiceMock(Config.class);
 +    expect(confSomethingElse2.getType()).andReturn("something-else-2");
 +    Config confLogSearchConf1 = easyMockSupport.createNiceMock(Config.class);
 +    expect(confLogSearchConf1.getType()).andReturn("service-1-logsearch-conf");
 +    Config confLogSearchConf2 = easyMockSupport.createNiceMock(Config.class);
 +    expect(confLogSearchConf2.getType()).andReturn("service-2-logsearch-conf");
-     
++
 +    Map<String, String> oldLogSearchConf = ImmutableMap.of(
 +        "service_name", "Service",
 +        "component_mappings", "Component Mappings",
 +        "content", "Content");
 +
 +    Collection<Config> configs = Arrays.asList(confSomethingElse1, confLogSearchConf1, confSomethingElse2, confLogSearchConf2);
-     
++
 +    expect(cluster.getAllConfigs()).andReturn(configs).atLeastOnce();
 +    expect(cluster.getDesiredConfigByType("service-1-logsearch-conf")).andReturn(confLogSearchConf1).once();
 +    expect(cluster.getDesiredConfigByType("service-2-logsearch-conf")).andReturn(confLogSearchConf2).once();
 +    expect(confLogSearchConf1.getProperties()).andReturn(oldLogSearchConf).once();
 +    expect(confLogSearchConf2.getProperties()).andReturn(oldLogSearchConf).once();
 +    Capture<Map<String, String>> logSearchConfCapture = EasyMock.newCapture(CaptureType.ALL);
 +    expect(controller.createConfig(anyObject(Cluster.class), anyString(), capture(logSearchConfCapture), anyString(),
 +        EasyMock.<Map<String, Map<String, String>>>anyObject())).andReturn(config).times(2);
 +
 +    replay(clusters, cluster);
 +    replay(controller, injector2);
 +    replay(confSomethingElse1, confSomethingElse2, confLogSearchConf1, confLogSearchConf2);
 +    new UpgradeCatalog300(injector2).updateLogSearchConfigs();
 +    easyMockSupport.verifyAll();
 +
 +    List<Map<String, String>> updatedLogSearchConfs = logSearchConfCapture.getValues();
 +    assertEquals(updatedLogSearchConfs.size(), 2);
 +    for (Map<String, String> updatedLogSearchConf : updatedLogSearchConfs) {
 +      assertTrue(Maps.difference(Collections.<String, String> emptyMap(), updatedLogSearchConf).areEqual());
 +    }
 +  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_hdfs_client.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
----------------------------------------------------------------------
diff --cc ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
index ae2ec86,8c04a79..f795837
--- a/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
@@@ -318,7 -316,7 +316,7 @@@ class TestHiveServer(RMFTestCase)
      self.assertResourceCalled('File', '/var/run/hive/hive-server.pid',
        action = ['delete'],
      )
--    
++
      self.assertNoMoreResources()
  
    def assert_configure_default(self, no_tmp = False, default_fs_default='hdfs://c6401.ambari.apache.org:8020'):
@@@ -326,7 -324,7 +324,7 @@@
      if self._testMethodName == "test_socket_timeout":
        # This test will not call any more resources.
        return
--    
++
      self.assertResourceCalled('Directory', '/etc/hive',
                                mode=0755,
      )
@@@ -750,11 -750,11 +750,11 @@@
    @patch("socket.socket")
    def test_socket_timeout(self, socket_mock, time_mock):
      s = socket_mock.return_value
--    s.connect = MagicMock()    
++    s.connect = MagicMock()
      s.connect.side_effect = socket.error("")
--    
++
      time_mock.return_value = 1000
--    
++
      try:
        self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hive_server.py",
                             classname = "HiveServer",
@@@ -763,7 -763,7 +763,7 @@@
                             stack_version = self.STACK_VERSION,
                             target = RMFTestCase.TARGET_COMMON_SERVICES
        )
--      
++
        self.fail("Script failure due to socket error was expected")
      except:
        self.assert_configure_default()

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
----------------------------------------------------------------------
diff --cc ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
index 53218d5,6a99dfa..e0b87eb
--- a/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
@@@ -303,7 -305,7 +305,7 @@@ class TestHistoryServer(RMFTestCase)
          hadoop_bin_dir = '/usr/bin',
          keytab = UnknownConfigurationMock(),
          kinit_path_local = '/usr/bin/kinit',
--        user = 'hdfs', 
++        user = 'hdfs',
          dfs_type = '',
          owner = 'mapred',
          hadoop_conf_dir = '/etc/hadoop/conf',

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py
----------------------------------------------------------------------
diff --cc ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py
index ed5ee2c,8a703df..d957673
--- a/ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py
@@@ -58,7 -82,7 +82,7 @@@ class TestResourceManager(RMFTestCase)
      )
  
      self.assert_configure_default()
--    
++
      self.assertResourceCalled('File', '/var/run/hadoop-yarn/yarn/yarn-yarn-resourcemanager.pid',
          action = ['delete'],
          not_if = 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hadoop-yarn/yarn/yarn-yarn-resourcemanager.pid && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E pgrep -F /var/run/hadoop-yarn/yarn/yarn-yarn-resourcemanager.pid',

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py
----------------------------------------------------------------------
diff --cc ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py
index d4d28c9,f8483c1..bef3f65
--- a/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py
+++ b/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py
@@@ -748,26 -1219,26 +1219,26 @@@ class TestHDP26StackAdvisor(TestCase)
      expected = {
        'ranger-admin-site': {
          'properties': {
--          'ranger.audit.solr.zookeepers': 'NONE', 
++          'ranger.audit.solr.zookeepers': 'NONE',
            'ranger.audit.source.type': 'solr'
          }
--      }, 
++      },
        'admin-properties': {
          'properties': {
            'policymgr_external_url': 'http://host1:6080'
          }
--      }, 
++      },
        'ranger-tagsync-site': {
          'properties': {}
--      }, 
++      },
        'tagsync-application-properties': {
--        'properties': {} 
--      }, 
++        'properties': {}
++      },
        'ranger-env': {
          'properties': {
            'ranger-storm-plugin-enabled': 'No'
          }
--      }, 
++      },
        'ranger-ugsync-site': {
          'properties': {
            'ranger.usersync.group.searchenabled': 'true'

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/app.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/assets/test/tests.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/controllers/global/background_operations_controller.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/controllers/global/cluster_controller.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/controllers/global/update_controller.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/controllers/main/host/details.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/controllers/main/service.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/controllers/wizard/step7/assign_master_controller.js
----------------------------------------------------------------------
diff --cc ambari-web/app/controllers/wizard/step7/assign_master_controller.js
index 099931a,a44aff4..9bd2677
--- a/ambari-web/app/controllers/wizard/step7/assign_master_controller.js
+++ b/ambari-web/app/controllers/wizard/step7/assign_master_controller.js
@@@ -136,7 -136,7 +136,7 @@@ App.AssignMasterOnStep7Controller = Em.
      }
      return showAlert;
    },
--  
++
    showPopup: function(hostComponent) {
      var missingDependentServices = this.getAllMissingDependentServices();
      var isNonWizardPage = !this.get('content.controllerName');

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/mappers/hosts_mapper.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --cc ambari-web/app/messages.js
index f76821d,db25104..684adbd
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@@ -348,9 -353,10 +353,11 @@@ Em.I18n.translations = 
    'common.rolling': 'Rolling',
    'common.express': 'Express',
    'common.hostOrdered': 'Host Ordered',
+   'common.repository': 'Repository',
+   'common.repositoryType': 'Repository Type',
    'common.rolling.downgrade': 'Rolling Downgrade',
    'common.express.downgrade': 'Express Downgrade',
 +  'common.minute.ago': 'less than a minute ago',
  
    'models.alert_instance.tiggered.verbose': "Occurred on {0} <br> Checked on {1}",
    'models.alert_definition.triggered.verbose': "Occurred on {0}",

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/mixins/common/persist.js
----------------------------------------------------------------------
diff --cc ambari-web/app/mixins/common/persist.js
index 4475112,4475112..e69de29
--- a/ambari-web/app/mixins/common/persist.js
+++ b/ambari-web/app/mixins/common/persist.js
@@@ -1,166 -1,166 +1,0 @@@
--/**
-- * Licensed to the Apache Software Foundation (ASF) under one
-- * or more contributor license agreements.  See the NOTICE file
-- * distributed with this work for additional information
-- * regarding copyright ownership.  The ASF licenses this file
-- * to you under the Apache License, Version 2.0 (the
-- * "License"); you may not use this file except in compliance
-- * with the License.  You may obtain a copy of the License at
-- *
-- *     http://www.apache.org/licenses/LICENSE-2.0
-- *
-- * Unless required by applicable law or agreed to in writing, software
-- * distributed under the License is distributed on an "AS IS" BASIS,
-- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- * See the License for the specific language governing permissions and
-- * limitations under the License.
-- */
--
--var App = require('app');
--var LZString = require('utils/lz-string');
--
--/**
-- * Small mixin for processing user preferences
-- * Provide methods to save/load some values in <code>persist</code> storage
-- * Save available only for admin users!
-- * When using this mixin you should redeclare methods:
-- * <ul>
-- *   <li>getUserPrefSuccessCallback</li>
-- *   <li>getUserPrefErrorCallback</li>
-- *   <li>postUserPrefSuccessCallback</li>
-- *   <li>postUserPrefErrorCallback</li>
-- * </ul>
-- * @type {Em.Mixin}
-- */
--App.Persist = Em.Mixin.create({
--
--  /**
--   * Additional to request data
--   * @type {object}
--   */
--  additionalData: {},
--
--  /**
--   * Get persist value from server with persistKey
--   * @param {String} key
--   */
--  getUserPref: function(key) {
--    return App.ajax.send({
--      name: 'persist.get',
--      sender: this,
--      data: {
--        key: key,
--        data: this.get('additionalData')
--      },
--      success: 'getUserPrefSuccessCallback',
--      error: 'getUserPrefErrorCallback'
--    });
--  },
--
--  /**
--   *
--   * @param {string} key
--   * @returns {$.Deferred}
--   */
--  getDecompressedData: function(key) {
--    var dfd = $.Deferred();
--    App.ajax.send({
--      name: 'persist.get.text',
--      sender: this,
--      data: {
--        key: key
--      }
--    }).always(function(data, textStatus, error) {
--      if (data && typeof data === 'string') {
--        dfd.resolve(JSON.parse(LZString.decompressFromBase64(data)));
--      } else {
--        dfd.reject({error: error});
--      }
--    });
--    return dfd.promise();
--  },
--
--  /**
--   * Should be redefined in objects that use this mixin
--   * @param {*} response
--   * @param {Object} request
--   * @param {Object} data
--   * @returns {*}
--   */
--  getUserPrefSuccessCallback: function (response, request, data) {},
--
--  /**
--   * Should be redefined in objects that use this mixin
--   * @param {Object} request
--   * @param {Object} ajaxOptions
--   * @param {String} error
--   */
--  getUserPrefErrorCallback: function (request, ajaxOptions, error) {},
--
--  /**
--   * Post persist key/value to server, value is object
--   * Only for admin users!
--   * @param {String} key
--   * @param {Object} value
--   */
--  postUserPref: function (key, value) {
--    if (!App.isAuthorized('CLUSTER.MANAGE_USER_PERSISTED_DATA')) {
--      return $.Deferred().reject().promise();
--    }
--    var keyValuePair = {};
--    keyValuePair[key] = JSON.stringify(value);
--    return this.post(keyValuePair);
--  },
--
--  /**
--   *
--   * @param {string} key
--   * @param {Object} value
--   * @returns {$.ajax}
--   */
--  postCompressedData: function (key, value) {
--    var keyValuePair = {};
--    keyValuePair[key] = !Em.isEmpty(value) ? LZString.compressToBase64(JSON.stringify(value)) : '';
--    return this.post(keyValuePair);
--  },
--
--  post: function(keyValuePair) {
--    return App.ajax.send({
--      'name': 'persist.post',
--      'sender': this,
--      'beforeSend': 'postUserPrefBeforeSend',
--      'data': {
--        'keyValuePair': keyValuePair
--      },
--      'success': 'postUserPrefSuccessCallback',
--      'error': 'postUserPrefErrorCallback'
--    });
--  },
--
--  /**
--   * Should be redefined in objects that use this mixin
--   * @param {*} response
--   * @param {Object} request
--   * @param {Object} data
--   * @returns {*}
--   */
--  postUserPrefSuccessCallback: function (response, request, data) {},
--
--  /**
--   * Should be redefined in objects that use this mixin
--   * @param {Object} request
--   * @param {Object} ajaxOptions
--   * @param {String} error
--   */
--  postUserPrefErrorCallback: function(request, ajaxOptions, error) {},
--
--  /**
--   * Little log before post request
--   * @param {Object} request
--   * @param {Object} ajaxOptions
--   * @param {Object} data
--   */
--  postUserPrefBeforeSend: function(request, ajaxOptions, data){
--  }
--
--});

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/models/host.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --cc ambari-web/app/utils/ajax/ajax.js
index e6dbc06,941f5a1..21f4959
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@@ -1351,7 -1353,7 +1353,7 @@@ var urls = 
      }
    },
    'cluster.load_cluster_name': {
-     'real': '/clusters?fields=Clusters/security_type,Clusters/cluster_id',
 -    'real': '/clusters?fields=Clusters/security_type,Clusters/version',
++    'real': '/clusters?fields=Clusters/security_type,Clusters/version,Clusters/cluster_id',
      'mock': '/data/clusters/info.json'
    },
    'cluster.load_last_upgrade': {
@@@ -2287,7 -2317,7 +2317,7 @@@
      mock: '/data/users/privileges_{userName}.json'
    },
    'router.login.clusters': {
-     'real': '/clusters?fields=Clusters/provisioning_state,Clusters/security_type,Clusters/cluster_id',
 -    'real': '/clusters?fields=Clusters/provisioning_state,Clusters/security_type,Clusters/version',
++    'real': '/clusters?fields=Clusters/provisioning_state,Clusters/security_type,Clusters/version,Clusters/cluster_id',
      'mock': '/data/clusters/info.json'
    },
    'router.login.message': {

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/utils/host_progress_popup.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/views/common/host_progress_popup_body_view.js
----------------------------------------------------------------------
diff --cc ambari-web/app/views/common/host_progress_popup_body_view.js
index 767c86b,49d7dea..93348a9
--- a/ambari-web/app/views/common/host_progress_popup_body_view.js
+++ b/ambari-web/app/views/common/host_progress_popup_body_view.js
@@@ -318,9 -328,9 +328,9 @@@ App.HostProgressPopupBodyView = App.Tab
          contentPaddingBottom = parseFloat($(modal).find('.modal-dialog').css('marginBottom')) || 0,
          hostsPageBarHeight = $(modal).find('#host-info tfoot').outerHeight(true),
          logComponentFileNameHeight = $(modal).find('#host-info tfoot').outerHeight(true),
-         levelName = this.get('currentLevelName'),
+         levelName = this.get('currentLevel'),
          boLevelHeightMap = {
 -          'OPS_LIST': {
 +          'REQUESTS_LIST': {
              height: window.innerHeight - 2*modalTopOffset - headerHeight - taskTopWrapHeight - modalFooterHeight - contentPaddingBottom,
              target: '#service-info'
            },

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/views/main/dashboard/config_history_view.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/app/views/main/menu.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/brunch-config.js
----------------------------------------------------------------------


[43/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/Ambari-DDL-AzureDB-CREATE.sql
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/Ambari-DDL-AzureDB-CREATE.sql
index d13985d,0000000..b971cbc
mode 100644,000000..100644
--- a/ambari-server/src/main/resources/Ambari-DDL-AzureDB-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-AzureDB-CREATE.sql
@@@ -1,2175 -1,0 +1,2147 @@@
 +/*
 +Licensed to the Apache Software Foundation (ASF) under one
 +or more contributor license agreements.  See the NOTICE file
 +distributed with this work for additional information
 +regarding copyright ownership.  The ASF licenses this file
 +to you under the Apache License, Version 2.0 (the
 +"License") you may not use this file except in compliance
 +with the License.  You may obtain a copy of the License at
 +
 +    http://www.apache.org/licenses/LICENSE-2.0
 +
 +Unless required by applicable law or agreed to in writing, software
 +distributed under the License is distributed on an "AS IS" BASIS,
 +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 +See the License for the specific language governing permissions and
 +limitations under the License.
 +*/
 +
 +/*
 +Schema population script for $(AMBARIDBNAME)
 +
 +Use this script in sqlcmd mode, setting the environment variables like this:
 +set AMBARIDBNAME=ambari
 +
 +sqlcmd -S localhost\SQLEXPRESS -i C:\app\ambari-server-1.3.0-SNAPSHOT\resources\Ambari-DDL-SQLServer-CREATE.sql
 +*/
 +
 +
 +------create the database------
 +
 +------create tables and grant privileges to db user---------
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.stack') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('stack') AND type = 'U')
 +BEGIN
 +CREATE TABLE stack(
 +  stack_id BIGINT NOT NULL,
 +  stack_name VARCHAR(255) NOT NULL,
 +  stack_version VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_stack PRIMARY KEY CLUSTERED (stack_id),
 +  CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.extension') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('extension') AND type = 'U')
 +BEGIN
 +CREATE TABLE extension(
 +  extension_id BIGINT NOT NULL,
 +  extension_name VARCHAR(255) NOT NULL,
 +  extension_version VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_extension PRIMARY KEY CLUSTERED (extension_id),
 +  CONSTRAINT UQ_extension UNIQUE (extension_name, extension_version))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.extensionlink') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('extensionlink') AND type = 'U')
 +BEGIN
 +CREATE TABLE extensionlink(
 +  link_id BIGINT NOT NULL,
 +  stack_id BIGINT NOT NULL,
 +  extension_id BIGINT NOT NULL,
 +  CONSTRAINT PK_extensionlink PRIMARY KEY CLUSTERED (link_id),
 +  CONSTRAINT FK_extensionlink_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
 +  CONSTRAINT FK_extensionlink_extension_id FOREIGN KEY (extension_id) REFERENCES extension(extension_id),
 +  CONSTRAINT UQ_extension_link UNIQUE (stack_id, extension_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.adminresourcetype') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('adminresourcetype') AND type = 'U')
 +BEGIN
 +CREATE TABLE adminresourcetype (
 +  resource_type_id INTEGER NOT NULL,
 +  resource_type_name VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_adminresourcetype PRIMARY KEY CLUSTERED (resource_type_id)
 +  )
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.adminresource') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('adminresource') AND type = 'U')
 +BEGIN
 +CREATE TABLE adminresource (
 +  resource_id BIGINT NOT NULL,
 +  resource_type_id INTEGER NOT NULL,
 +  CONSTRAINT PK_adminresource PRIMARY KEY CLUSTERED (resource_id),
 +  CONSTRAINT FK_resource_resource_type_id FOREIGN KEY (resource_type_id) REFERENCES adminresourcetype(resource_type_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.clusters') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('clusters') AND type = 'U')
 +BEGIN
 +CREATE TABLE clusters (
 +  cluster_id BIGINT NOT NULL,
 +  resource_id BIGINT NOT NULL,
 +  upgrade_id BIGINT,
 +  cluster_info VARCHAR(255) NOT NULL,
 +  cluster_name VARCHAR(100) NOT NULL UNIQUE,
 +  provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT',
 +  security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
 +  desired_cluster_state VARCHAR(255) NOT NULL,
 +  desired_stack_id BIGINT NOT NULL,
 +  CONSTRAINT PK_clusters PRIMARY KEY CLUSTERED (cluster_id),
 +  CONSTRAINT FK_clusters_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
 +  CONSTRAINT FK_clusters_resource_id FOREIGN KEY (resource_id) REFERENCES adminresource(resource_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.clusterconfig') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('clusterconfig') AND type = 'U')
 +BEGIN
 +CREATE TABLE clusterconfig (
 +  config_id BIGINT NOT NULL,
 +  version_tag VARCHAR(255) NOT NULL,
 +  version BIGINT NOT NULL,
 +  type_name VARCHAR(255) NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  stack_id BIGINT NOT NULL,
++  selected SMALLINT NOT NULL DEFAULT 0,
 +  config_data VARCHAR(MAX) NOT NULL,
 +  config_attributes VARCHAR(MAX),
 +  create_timestamp BIGINT NOT NULL,
++  unmapped SMALLINT NOT NULL DEFAULT 0,
++  selected_timestamp BIGINT NOT NULL DEFAULT 0,
 +  CONSTRAINT PK_clusterconfig PRIMARY KEY CLUSTERED (config_id),
 +  CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
 +  CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
 +  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
 +  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.serviceconfig') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('serviceconfig') AND type = 'U')
 +BEGIN
 +CREATE TABLE serviceconfig (
 +  service_config_id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  version BIGINT NOT NULL,
 +  create_timestamp BIGINT NOT NULL,
 +  stack_id BIGINT NOT NULL,
 +  user_name VARCHAR(255) NOT NULL DEFAULT '_db',
 +  group_id BIGINT,
 +  note VARCHAR(MAX),
 +  CONSTRAINT PK_serviceconfig PRIMARY KEY CLUSTERED (service_config_id),
 +  CONSTRAINT FK_serviceconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
 +  CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hosts') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hosts') AND type = 'U')
 +BEGIN
 +CREATE TABLE hosts (
 +  host_id BIGINT NOT NULL,
 +  host_name VARCHAR(255) NOT NULL,
 +  cpu_count INTEGER NOT NULL,
 +  ph_cpu_count INTEGER,
 +  cpu_info VARCHAR(255) NOT NULL,
 +  discovery_status VARCHAR(2000) NOT NULL,
 +  host_attributes VARCHAR(MAX) NOT NULL,
 +  ipv4 VARCHAR(255),
 +  ipv6 VARCHAR(255),
 +  public_host_name VARCHAR(255),
 +  last_registration_time BIGINT NOT NULL,
 +  os_arch VARCHAR(255) NOT NULL,
 +  os_info VARCHAR(1000) NOT NULL,
 +  os_type VARCHAR(255) NOT NULL,
 +  rack_info VARCHAR(255) NOT NULL,
 +  total_mem BIGINT NOT NULL,
 +  CONSTRAINT PK_hosts PRIMARY KEY CLUSTERED (host_id),
 +  CONSTRAINT UQ_hosts_host_name UNIQUE (host_name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.serviceconfighosts') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('serviceconfighosts') AND type = 'U')
 +BEGIN
 +CREATE TABLE serviceconfighosts (
 +  service_config_id BIGINT NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  CONSTRAINT PK_serviceconfighosts PRIMARY KEY CLUSTERED (service_config_id, host_id),
 +  CONSTRAINT FK_scvhosts_host_id FOREIGN KEY (host_id) REFERENCES hosts(host_id),
 +  CONSTRAINT FK_scvhosts_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.serviceconfigmapping') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('serviceconfigmapping') AND type = 'U')
 +BEGIN
 +CREATE TABLE serviceconfigmapping (
 +  service_config_id BIGINT NOT NULL,
 +  config_id BIGINT NOT NULL,
 +  CONSTRAINT PK_serviceconfigmapping PRIMARY KEY CLUSTERED (service_config_id, config_id),
 +  CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES clusterconfig(config_id),
 +  CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.clusterconfigmapping') AND type = 'U')
- BEGIN
- CREATE TABLE clusterconfigmapping (
-   cluster_id BIGINT NOT NULL,
-   type_name VARCHAR(255) NOT NULL,
-   version_tag VARCHAR(255) NOT NULL,
-   create_timestamp BIGINT NOT NULL,
-   selected INT NOT NULL DEFAULT 0,
-   user_name VARCHAR(255) NOT NULL DEFAULT '_db',
-   CONSTRAINT PK_clusterconfigmapping PRIMARY KEY CLUSTERED (cluster_id, type_name, create_timestamp ),
-   CONSTRAINT clusterconfigmappingcluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id))
- END
- 
- 
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.clusterservices') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('clusterservices') AND type = 'U')
 +BEGIN
 +CREATE TABLE clusterservices (
 +  service_name VARCHAR(255) NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  service_enabled INT NOT NULL,
 +  CONSTRAINT PK_clusterservices PRIMARY KEY CLUSTERED (service_name, cluster_id),
 +  CONSTRAINT FK_clusterservices_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.clusterstate') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('clusterstate') AND type = 'U')
 +BEGIN
 +CREATE TABLE clusterstate (
 +  cluster_id BIGINT NOT NULL,
 +  current_cluster_state VARCHAR(255) NOT NULL,
 +  current_stack_id BIGINT NOT NULL,
 +  CONSTRAINT PK_clusterstate PRIMARY KEY CLUSTERED (cluster_id),
 +  CONSTRAINT FK_clusterstate_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
 +  CONSTRAINT FK_cs_current_stack_id FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.repo_version') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('repo_version') AND type = 'U')
 +BEGIN
 +CREATE TABLE repo_version (
 +  repo_version_id BIGINT NOT NULL,
 +  stack_id BIGINT NOT NULL,
 +  version VARCHAR(255) NOT NULL,
 +  display_name VARCHAR(128) NOT NULL,
 +  repositories VARCHAR(MAX) NOT NULL,
 +  repo_type VARCHAR(255) DEFAULT 'STANDARD' NOT NULL,
++  hidden SMALLINT NOT NULL DEFAULT 0,
 +  version_url VARCHAR(1024),
 +  version_xml VARCHAR(MAX),
 +  version_xsd VARCHAR(512),
 +  parent_id BIGINT,
 +  CONSTRAINT PK_repo_version PRIMARY KEY CLUSTERED (repo_version_id),
 +  CONSTRAINT FK_repoversion_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
 +  CONSTRAINT UQ_repo_version_display_name UNIQUE (display_name),
 +  CONSTRAINT UQ_repo_version_stack_id UNIQUE (stack_id, version))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.cluster_version') AND type = 'U')
- BEGIN
- CREATE TABLE cluster_version (
-   id BIGINT NOT NULL,
-   cluster_id BIGINT NOT NULL,
-   repo_version_id BIGINT NOT NULL,
-   STATE VARCHAR(255) NOT NULL,
-   start_time BIGINT NOT NULL,
-   end_time BIGINT,
-   user_name VARCHAR(255),
-   CONSTRAINT PK_cluster_version PRIMARY KEY CLUSTERED (id),
-   CONSTRAINT FK_cluster_version_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
-   CONSTRAINT FK_cluster_version_repovers_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id))
- END
- 
- 
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.servicecomponentdesiredstate') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('servicecomponentdesiredstate') AND type = 'U')
 +BEGIN
 +CREATE TABLE servicecomponentdesiredstate (
 +  id BIGINT NOT NULL,
 +  component_name VARCHAR(255) NOT NULL,
 +  cluster_id BIGINT NOT NULL,
-   desired_stack_id BIGINT NOT NULL,
-   desired_version VARCHAR(255) NOT NULL DEFAULT 'UNKNOWN',
++  desired_repo_version_id BIGINT NOT NULL,
 +  desired_state VARCHAR(255) NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  recovery_enabled SMALLINT NOT NULL DEFAULT 0,
++  repo_state VARCHAR(255) NOT NULL DEFAULT 'NOT_REQUIRED',
 +  CONSTRAINT pk_sc_desiredstate PRIMARY KEY (id),
 +  CONSTRAINT UQ_scdesiredstate_name UNIQUE(component_name, service_name, cluster_id),
-   CONSTRAINT FK_scds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
++  CONSTRAINT FK_scds_desired_repo_id FOREIGN KEY (desired_repo_version_id) REFERENCES repo_version (repo_version_id),
 +  CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hostcomponentdesiredstate') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hostcomponentdesiredstate') AND type = 'U')
 +BEGIN
 +CREATE TABLE hostcomponentdesiredstate (
 +  id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  component_name VARCHAR(255) NOT NULL,
-   desired_stack_id BIGINT NOT NULL,
 +  desired_state VARCHAR(255) NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  admin_state VARCHAR(32),
 +  maintenance_state VARCHAR(32) NOT NULL,
-   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
 +  restart_required BIT NOT NULL DEFAULT 0,
 +  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY CLUSTERED (id),
-   CONSTRAINT UQ_hcdesiredstate_name UNIQUE NONCLUSTERED (component_name, service_name, host_id, cluster_id),
-   CONSTRAINT FK_hcds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
-   CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id),
-   CONSTRAINT hstcmponentdesiredstatehstid FOREIGN KEY (host_id) REFERENCES hosts (host_id))
++  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_name, host_id, cluster_id),
++  CONSTRAINT FK_hcdesiredstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
++  CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id))
 +END
 +
 +
- 
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hostcomponentstate') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hostcomponentstate') AND type = 'U')
 +BEGIN
 +CREATE TABLE hostcomponentstate (
 +  id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  component_name VARCHAR(255) NOT NULL,
 +  version VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
-   current_stack_id BIGINT NOT NULL,
 +  current_state VARCHAR(255) NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  upgrade_state VARCHAR(32) NOT NULL DEFAULT 'NONE',
-   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
 +  CONSTRAINT PK_hostcomponentstate PRIMARY KEY CLUSTERED (id),
-   CONSTRAINT FK_hcs_current_stack_id FOREIGN KEY (current_stack_id) REFERENCES stack(stack_id),
 +  CONSTRAINT FK_hostcomponentstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
 +  CONSTRAINT hstcomponentstatecomponentname FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id))
 +END
 +
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_host_component_state')
 +BEGIN
 +CREATE NONCLUSTERED INDEX idx_host_component_state on hostcomponentstate(host_id, component_name, service_name, cluster_id)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hoststate') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hoststate') AND type = 'U')
 +BEGIN
 +CREATE TABLE hoststate (
 +  agent_version VARCHAR(255) NOT NULL,
 +  available_mem BIGINT NOT NULL,
 +  current_state VARCHAR(255) NOT NULL,
 +  health_status VARCHAR(255),
 +  host_id BIGINT NOT NULL,
 +  time_in_state BIGINT NOT NULL,
 +  maintenance_state VARCHAR(512),
 +  CONSTRAINT PK_hoststate PRIMARY KEY CLUSTERED (host_id),
 +  CONSTRAINT FK_hoststate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.servicedesiredstate') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('servicedesiredstate') AND type = 'U')
 +BEGIN
 +CREATE TABLE servicedesiredstate (
 +  cluster_id BIGINT NOT NULL,
 +  desired_host_role_mapping INTEGER NOT NULL,
-   desired_stack_id BIGINT NOT NULL,
++  desired_repo_version_id BIGINT NOT NULL,
 +  desired_state VARCHAR(255) NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  maintenance_state VARCHAR(32) NOT NULL,
-   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
 +  credential_store_enabled SMALLINT NOT NULL DEFAULT 0,
 +  CONSTRAINT PK_servicedesiredstate PRIMARY KEY CLUSTERED (cluster_id,service_name),
-   CONSTRAINT FK_sds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
++  CONSTRAINT FK_repo_version_id FOREIGN KEY (desired_repo_version_id) REFERENCES repo_version (repo_version_id),
 +  CONSTRAINT servicedesiredstateservicename FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.adminprincipaltype') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('adminprincipaltype') AND type = 'U')
 +BEGIN
 +CREATE TABLE adminprincipaltype (
 +  principal_type_id INTEGER NOT NULL,
 +  principal_type_name VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_adminprincipaltype PRIMARY KEY CLUSTERED (principal_type_id)
 +  )
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.adminprincipal') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('adminprincipal') AND type = 'U')
 +BEGIN
 +CREATE TABLE adminprincipal (
 +  principal_id BIGINT NOT NULL,
 +  principal_type_id INTEGER NOT NULL,
 +  CONSTRAINT PK_adminprincipal PRIMARY KEY CLUSTERED (principal_id),
 +  CONSTRAINT FK_principal_principal_type_id FOREIGN KEY (principal_type_id) REFERENCES adminprincipaltype(principal_type_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.users') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('users') AND type = 'U')
 +BEGIN
 +CREATE TABLE users (
 +  user_id INTEGER,
 +  principal_id BIGINT NOT NULL,
 +  ldap_user INTEGER NOT NULL DEFAULT 0,
 +  user_name VARCHAR(255) NOT NULL,
 +  user_type VARCHAR(255) NOT NULL DEFAULT 'LOCAL',
 +  create_time DATETIME DEFAULT GETDATE(),
 +  user_password VARCHAR(255),
 +  active INTEGER NOT NULL DEFAULT 1,
 +  active_widget_layouts VARCHAR(1024) DEFAULT NULL,
 +  CONSTRAINT PK_users PRIMARY KEY CLUSTERED (user_id),
 +  CONSTRAINT FK_users_principal_id FOREIGN KEY (principal_id) REFERENCES adminprincipal(principal_id),
 +  CONSTRAINT UNQ_users_0 UNIQUE (user_name, user_type))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.groups') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('groups') AND type = 'U')
 +BEGIN
 +CREATE TABLE groups (
 +  group_id INTEGER,
 +  principal_id BIGINT NOT NULL,
 +  group_name VARCHAR(255) NOT NULL,
 +  ldap_group INTEGER NOT NULL DEFAULT 0,
 +  group_type VARCHAR(255) NOT NULL DEFAULT 'LOCAL',
 +  CONSTRAINT PK_groups PRIMARY KEY CLUSTERED (group_id),
 +  CONSTRAINT FK_groups_principal_id FOREIGN KEY (principal_id) REFERENCES adminprincipal(principal_id),
 +  CONSTRAINT UNQ_groups_0 UNIQUE (group_name, ldap_group))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.members') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('members') AND type = 'U')
 +BEGIN
 +CREATE TABLE members (
 +  member_id INTEGER,
 +  group_id INTEGER NOT NULL,
 +  user_id INTEGER NOT NULL,
 +  CONSTRAINT PK_members PRIMARY KEY CLUSTERED (member_id),
 +  CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES groups (group_id),
 +  CONSTRAINT FK_members_user_id FOREIGN KEY (user_id) REFERENCES users (user_id),
 +  CONSTRAINT UNQ_members_0 UNIQUE (group_id, user_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.requestschedule') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('requestschedule') AND type = 'U')
 +BEGIN
 +CREATE TABLE requestschedule (
 +  schedule_id BIGINT,
 +  cluster_id BIGINT NOT NULL,
 +  description VARCHAR(255),
 +  STATUS VARCHAR(255),
 +  batch_separation_seconds SMALLINT,
 +  batch_toleration_limit SMALLINT,
 +  authenticated_user_id INTEGER,
 +  create_user VARCHAR(255),
 +  create_timestamp BIGINT,
 +  update_user VARCHAR(255),
 +  update_timestamp BIGINT,
 +  minutes VARCHAR(10),
 +  hours VARCHAR(10),
 +  days_of_month VARCHAR(10),
 +  month VARCHAR(10),
 +  day_of_week VARCHAR(10),
 +  yearToSchedule VARCHAR(10),
 +  startTime VARCHAR(50),
 +  endTime VARCHAR(50),
 +  last_execution_status VARCHAR(255),
 +  CONSTRAINT PK_requestschedule PRIMARY KEY CLUSTERED (schedule_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.request') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('request') AND type = 'U')
 +BEGIN
 +CREATE TABLE request (
 +  request_id BIGINT NOT NULL,
 +  cluster_id BIGINT,
 +  command_name VARCHAR(255),
 +  create_time BIGINT NOT NULL,
 +  end_time BIGINT NOT NULL,
 +  exclusive_execution BIT NOT NULL DEFAULT 0,
 +  inputs VARBINARY(MAX),
 +  request_context VARCHAR(255),
 +  request_type VARCHAR(255),
 +  request_schedule_id BIGINT,
 +  start_time BIGINT NOT NULL,
-   status VARCHAR(255),
++  status VARCHAR(255) NOT NULL DEFAULT 'PENDING',
++  display_status VARCHAR(255) NOT NULL DEFAULT 'PENDING',
 +  cluster_host_info VARBINARY(MAX) NOT NULL,
 +  CONSTRAINT PK_request PRIMARY KEY CLUSTERED (request_id),
 +  CONSTRAINT FK_request_schedule_id FOREIGN KEY (request_schedule_id) REFERENCES requestschedule (schedule_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.stage') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('stage') AND type = 'U')
 +BEGIN
 +CREATE TABLE stage (
 +  stage_id BIGINT NOT NULL,
 +  request_id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  skippable SMALLINT DEFAULT 0 NOT NULL,
 +  supports_auto_skip_failure SMALLINT DEFAULT 0 NOT NULL,
 +  log_info VARCHAR(255) NOT NULL,
 +  request_context VARCHAR(255),
 +  command_params VARBINARY(MAX),
 +  host_params VARBINARY(MAX),
 +  command_execution_type VARCHAR(32) NOT NULL DEFAULT 'STAGE',
++  status VARCHAR(255) NOT NULL DEFAULT 'PENDING',
++  display_status VARCHAR(255) NOT NULL DEFAULT 'PENDING',
 +  CONSTRAINT PK_stage PRIMARY KEY CLUSTERED (stage_id, request_id),
 +  CONSTRAINT FK_stage_request_id FOREIGN KEY (request_id) REFERENCES request (request_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.host_role_command') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('host_role_command') AND type = 'U')
 +BEGIN
 +CREATE TABLE host_role_command (
 +  task_id BIGINT NOT NULL,
 +  attempt_count SMALLINT NOT NULL,
 +  retry_allowed SMALLINT DEFAULT 0 NOT NULL,
 +  event VARCHAR(MAX) NOT NULL,
 +  exitcode INTEGER NOT NULL,
 +  host_id BIGINT,
 +  last_attempt_time BIGINT NOT NULL,
 +  request_id BIGINT NOT NULL,
 +  role VARCHAR(255),
 +  stage_id BIGINT NOT NULL,
 +  start_time BIGINT NOT NULL,
 +  original_start_time BIGINT NOT NULL,
 +  end_time BIGINT,
-   status VARCHAR(255),
++  status VARCHAR(255) NOT NULL DEFAULT 'PENDING',
 +  auto_skip_on_failure SMALLINT DEFAULT 0 NOT NULL,
 +  std_error VARBINARY(max),
 +  std_out VARBINARY(max),
 +  output_log VARCHAR(255) NULL,
 +  error_log VARCHAR(255) NULL,
 +  structured_out VARBINARY(max),
 +  role_command VARCHAR(255),
 +  command_detail VARCHAR(255),
 +  custom_command_name VARCHAR(255),
 +  is_background SMALLINT DEFAULT 0 NOT NULL,
++  ops_display_name VARCHAR(255),
 +  CONSTRAINT PK_host_role_command PRIMARY KEY CLUSTERED (task_id),
 +  CONSTRAINT FK_host_role_command_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
 +  CONSTRAINT FK_host_role_command_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES stage (stage_id, request_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.execution_command') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('execution_command') AND type = 'U')
 +BEGIN
 +CREATE TABLE execution_command (
 +  command VARBINARY(MAX),
 +  task_id BIGINT NOT NULL,
 +  CONSTRAINT PK_execution_command PRIMARY KEY CLUSTERED (task_id),
 +  CONSTRAINT FK_execution_command_task_id FOREIGN KEY (task_id) REFERENCES host_role_command (task_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.role_success_criteria') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('role_success_criteria') AND type = 'U')
 +BEGIN
 +CREATE TABLE role_success_criteria (
 +  ROLE VARCHAR(255) NOT NULL,
 +  request_id BIGINT NOT NULL,
 +  stage_id BIGINT NOT NULL,
 +  success_factor FLOAT NOT NULL,
 +  CONSTRAINT PK_role_success_criteria PRIMARY KEY CLUSTERED (ROLE, request_id, stage_id),
 +  CONSTRAINT role_success_criteria_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES stage (stage_id, request_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.requestresourcefilter') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('requestresourcefilter') AND type = 'U')
 +BEGIN
 +CREATE TABLE requestresourcefilter (
 +  filter_id BIGINT NOT NULL,
 +  request_id BIGINT NOT NULL,
 +  service_name VARCHAR(255),
 +  component_name VARCHAR(255),
 +  hosts VARBINARY(MAX),
 +  CONSTRAINT PK_requestresourcefilter PRIMARY KEY CLUSTERED (filter_id),
 +  CONSTRAINT FK_reqresfilter_req_id FOREIGN KEY (request_id) REFERENCES request (request_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.requestoperationlevel') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('requestoperationlevel') AND type = 'U')
 +BEGIN
 +CREATE TABLE requestoperationlevel (
 +  operation_level_id BIGINT NOT NULL,
 +  request_id BIGINT NOT NULL,
 +  level_name VARCHAR(255),
 +  cluster_name VARCHAR(255),
 +  service_name VARCHAR(255),
 +  host_component_name VARCHAR(255),
 +  host_id BIGINT NULL,      -- unlike most host_id columns, this one allows NULLs because the request can be at the service level
 +  CONSTRAINT PK_requestoperationlevel PRIMARY KEY CLUSTERED (operation_level_id),
 +  CONSTRAINT FK_req_op_level_req_id FOREIGN KEY (request_id) REFERENCES request (request_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.ClusterHostMapping') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('ClusterHostMapping') AND type = 'U')
 +BEGIN
 +CREATE TABLE ClusterHostMapping (
 +  cluster_id BIGINT NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  CONSTRAINT PK_ClusterHostMapping PRIMARY KEY CLUSTERED (cluster_id, host_id),
 +  CONSTRAINT FK_clhostmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
 +  CONSTRAINT FK_clusterhostmapping_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.key_value_store') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('key_value_store') AND type = 'U')
 +BEGIN
 +CREATE TABLE key_value_store (
 +  [key] VARCHAR(255),
 +  [value] VARCHAR(MAX),
 +  CONSTRAINT PK_key_value_store PRIMARY KEY CLUSTERED ([key])
 +  )
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hostconfigmapping') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hostconfigmapping') AND type = 'U')
 +BEGIN
 +CREATE TABLE hostconfigmapping (
 +  cluster_id BIGINT NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  type_name VARCHAR(255) NOT NULL,
 +  version_tag VARCHAR(255) NOT NULL,
 +  service_name VARCHAR(255),
 +  create_timestamp BIGINT NOT NULL,
 +  selected INTEGER NOT NULL DEFAULT 0,
 +  user_name VARCHAR(255) NOT NULL DEFAULT '_db',
 +  CONSTRAINT PK_hostconfigmapping PRIMARY KEY CLUSTERED (cluster_id, host_id, type_name, create_timestamp),
 +  CONSTRAINT FK_hostconfmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
 +  CONSTRAINT FK_hostconfmapping_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.metainfo') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('metainfo') AND type = 'U')
 +BEGIN
 +CREATE TABLE metainfo (
 +  [metainfo_key] VARCHAR(255),
 +  [metainfo_value] VARCHAR(255),
 +  CONSTRAINT PK_metainfo PRIMARY KEY CLUSTERED ([metainfo_key])
 +  )
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.ambari_sequences') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('ambari_sequences') AND type = 'U')
 +BEGIN
 +CREATE TABLE ambari_sequences (
 +  sequence_name VARCHAR(255),
 +  [sequence_value] BIGINT NOT NULL,
 +  CONSTRAINT PK_ambari_sequences PRIMARY KEY (sequence_name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.configgroup') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('configgroup') AND type = 'U')
 +BEGIN
 +CREATE TABLE configgroup (
 +  group_id BIGINT,
 +  cluster_id BIGINT NOT NULL,
 +  group_name VARCHAR(255) NOT NULL,
 +  tag VARCHAR(1024) NOT NULL,
 +  description VARCHAR(1024),
 +  create_timestamp BIGINT NOT NULL,
 +  service_name VARCHAR(255),
 +  CONSTRAINT PK_configgroup PRIMARY KEY CLUSTERED (group_id),
 +  CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.confgroupclusterconfigmapping') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('confgroupclusterconfigmapping') AND type = 'U')
 +BEGIN
 +CREATE TABLE confgroupclusterconfigmapping (
 +  config_group_id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  config_type VARCHAR(255) NOT NULL,
 +  version_tag VARCHAR(255) NOT NULL,
 +  user_name VARCHAR(255) DEFAULT '_db',
 +  create_timestamp BIGINT NOT NULL,
 +  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY CLUSTERED (config_group_id, cluster_id, config_type),
 +  CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
 +  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, type_name, version_tag))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.configgrouphostmapping') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('configgrouphostmapping') AND type = 'U')
 +BEGIN
 +CREATE TABLE configgrouphostmapping (
 +  config_group_id BIGINT NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  CONSTRAINT PK_configgrouphostmapping PRIMARY KEY CLUSTERED (config_group_id, host_id),
 +  CONSTRAINT FK_cghm_cgid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
 +  CONSTRAINT FK_cghm_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.requestschedulebatchrequest') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('requestschedulebatchrequest') AND type = 'U')
 +BEGIN
 +CREATE TABLE requestschedulebatchrequest (
 +  schedule_id BIGINT,
 +  batch_id BIGINT,
 +  request_id BIGINT,
 +  request_type VARCHAR(255),
 +  request_uri VARCHAR(1024),
 +  request_body VARBINARY(MAX),
 +  request_status VARCHAR(255),
 +  return_code SMALLINT,
 +  return_message TEXT,
 +  CONSTRAINT PK_requestschedulebatchrequest PRIMARY KEY CLUSTERED (schedule_id, batch_id),
 +  CONSTRAINT FK_rsbatchrequest_schedule_id FOREIGN KEY (schedule_id) REFERENCES requestschedule (schedule_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.blueprint') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('blueprint') AND type = 'U')
 +BEGIN
 +CREATE TABLE blueprint (
 +  blueprint_name VARCHAR(255) NOT NULL,
 +  stack_id BIGINT NOT NULL,
 +  security_type VARCHAR(32) NOT NULL DEFAULT 'NONE',
 +  security_descriptor_reference VARCHAR(255),
 +  CONSTRAINT PK_blueprint PRIMARY KEY CLUSTERED (blueprint_name),
 +  CONSTRAINT FK_blueprint_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hostgroup') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hostgroup') AND type = 'U')
 +BEGIN
 +CREATE TABLE hostgroup (
 +  blueprint_name VARCHAR(255) NOT NULL,
 +  NAME VARCHAR(255) NOT NULL,
 +  cardinality VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_hostgroup PRIMARY KEY CLUSTERED (blueprint_name, NAME),
 +  CONSTRAINT FK_hg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hostgroup_component') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hostgroup_component') AND type = 'U')
 +BEGIN
 +CREATE TABLE hostgroup_component (
 +  blueprint_name VARCHAR(255) NOT NULL,
 +  hostgroup_name VARCHAR(255) NOT NULL,
 +  NAME VARCHAR(255) NOT NULL,
 +  provision_action VARCHAR(255),
 +  CONSTRAINT PK_hostgroup_component PRIMARY KEY CLUSTERED (blueprint_name, hostgroup_name, NAME),
 +  CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.blueprint_configuration') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('blueprint_configuration') AND type = 'U')
 +BEGIN
 +CREATE TABLE blueprint_configuration (
 +  blueprint_name VARCHAR(255) NOT NULL,
 +  type_name VARCHAR(255) NOT NULL,
 +  config_data VARCHAR(MAX) NOT NULL,
 +  config_attributes VARCHAR(MAX),
 +  CONSTRAINT PK_blueprint_configuration PRIMARY KEY CLUSTERED (blueprint_name, type_name),
 +  CONSTRAINT FK_cfg_blueprint_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.blueprint_setting') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('blueprint_setting') AND type = 'U')
 +BEGIN
 +CREATE TABLE blueprint_setting (
 +  id BIGINT NOT NULL,
 +  blueprint_name VARCHAR(255) NOT NULL,
 +  setting_name VARCHAR(255) NOT NULL,
 +  setting_data TEXT NOT NULL,
 +  CONSTRAINT PK_blueprint_setting PRIMARY KEY (id),
 +  CONSTRAINT UQ_blueprint_setting_name UNIQUE(blueprint_name,setting_name),
 +  CONSTRAINT FK_blueprint_setting_name FOREIGN KEY (blueprint_name) REFERENCES blueprint(blueprint_name)
 +  )
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.hostgroup_configuration') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('hostgroup_configuration') AND type = 'U')
 +BEGIN
 +CREATE TABLE hostgroup_configuration (
 +  blueprint_name VARCHAR(255) NOT NULL,
 +  hostgroup_name VARCHAR(255) NOT NULL,
 +  type_name VARCHAR(255) NOT NULL,
 +  config_data VARCHAR(MAX) NOT NULL,
 +  config_attributes VARCHAR(MAX),
 +  CONSTRAINT PK_hostgroup_configuration PRIMARY KEY CLUSTERED (blueprint_name, hostgroup_name, type_name),
 +  CONSTRAINT FK_hg_cfg_bp_hg_name FOREIGN KEY (blueprint_name, hostgroup_name) REFERENCES hostgroup (blueprint_name, name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewmain') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewmain') AND type = 'U')
 +BEGIN
 +CREATE TABLE viewmain (
 +  view_name VARCHAR(255) NOT NULL,
 +  label VARCHAR(255),
 +  description VARCHAR(2048),
 +  version VARCHAR(255),
 +  build VARCHAR(128),
 +  resource_type_id INTEGER NOT NULL,
 +  icon VARCHAR(255),
 +  icon64 VARCHAR(255),
 +  archive VARCHAR(255),
 +  mask VARCHAR(255),
 +  system_view BIT NOT NULL DEFAULT 0,
 +  CONSTRAINT PK_viewmain PRIMARY KEY CLUSTERED (view_name),
 +  CONSTRAINT FK_view_resource_type_id FOREIGN KEY (resource_type_id) REFERENCES adminresourcetype(resource_type_id))
 +END
 +
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewurl') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewurl') AND type = 'U')
 +BEGIN
 +CREATE table viewurl(
 +  url_id BIGINT ,
 +  url_name VARCHAR(255) NOT NULL ,
 +  url_suffix VARCHAR(255) NOT NULL,
-   PRIMARY KEY CLUSTERED (url_id)
++  CONSTRAINT PK_viewurl PRIMARY KEY CLUSTERED (url_id)
 +)
 +END
 +
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewinstance') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewinstance') AND type = 'U')
 +BEGIN
 +CREATE TABLE viewinstance (
 +  view_instance_id BIGINT,
 +  resource_id BIGINT NOT NULL,
 +  view_name VARCHAR(255) NOT NULL,
 +  NAME VARCHAR(255) NOT NULL,
 +  label VARCHAR(255),
 +  description VARCHAR(2048),
 +  visible CHAR(1),
 +  icon VARCHAR(255),
 +  icon64 VARCHAR(255),
 +  xml_driven CHAR(1),
 +  alter_names BIT NOT NULL DEFAULT 1,
 +  cluster_handle BIGINT,
 +  cluster_type VARCHAR(100) NOT NULL DEFAULT 'LOCAL_AMBARI',
 +  short_url BIGINT,
 +  CONSTRAINT PK_viewinstance PRIMARY KEY CLUSTERED (view_instance_id),
 +  CONSTRAINT FK_instance_url_id FOREIGN KEY (short_url) REFERENCES viewurl(url_id),
 +  CONSTRAINT FK_viewinst_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name),
 +  CONSTRAINT FK_viewinstance_resource_id FOREIGN KEY (resource_id) REFERENCES adminresource(resource_id),
 +  CONSTRAINT UQ_viewinstance_name UNIQUE (view_name, name),
 +  CONSTRAINT UQ_viewinstance_name_id UNIQUE (view_instance_id, view_name, name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewinstancedata') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewinstancedata') AND type = 'U')
 +BEGIN
 +CREATE TABLE viewinstancedata (
 +  view_instance_id BIGINT,
 +  view_name VARCHAR(255) NOT NULL,
 +  view_instance_name VARCHAR(255) NOT NULL,
 +  NAME VARCHAR(255) NOT NULL,
 +  user_name VARCHAR(255) NOT NULL,
 +  value VARCHAR(2000) NOT NULL,
 +  CONSTRAINT PK_viewinstancedata PRIMARY KEY CLUSTERED (view_instance_id, NAME, user_name),
 +  CONSTRAINT FK_viewinstdata_view_name FOREIGN KEY (view_instance_id, view_name, view_instance_name) REFERENCES viewinstance(view_instance_id, view_name, name))
 +END
 +
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewinstanceproperty') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewinstanceproperty') AND type = 'U')
 +BEGIN
 +CREATE TABLE viewinstanceproperty (
 +  view_name VARCHAR(255) NOT NULL,
 +  view_instance_name VARCHAR(255) NOT NULL,
 +  NAME VARCHAR(255) NOT NULL,
 +  value VARCHAR(2000),
 +  CONSTRAINT PK_viewinstanceproperty PRIMARY KEY CLUSTERED (view_name, view_instance_name, NAME),
 +  CONSTRAINT FK_viewinstprop_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewparameter') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewparameter') AND type = 'U')
 +BEGIN
 +CREATE TABLE viewparameter (
 +  view_name VARCHAR(255) NOT NULL,
 +  NAME VARCHAR(255) NOT NULL,
 +  description VARCHAR(2048),
 +  label VARCHAR(255),
 +  placeholder VARCHAR(255),
 +  default_value VARCHAR(2000),
 +  cluster_config VARCHAR(255),
 +  required CHAR(1),
 +  masked CHAR(1),
 +  CONSTRAINT PK_viewparameter PRIMARY KEY CLUSTERED (view_name, NAME),
 +  CONSTRAINT FK_viewparam_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewresource') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewresource') AND type = 'U')
 +BEGIN
 +CREATE TABLE viewresource (
 +  view_name VARCHAR(255) NOT NULL,
 +  NAME VARCHAR(255) NOT NULL,
 +  plural_name VARCHAR(255),
 +  id_property VARCHAR(255),
 +  subResource_names VARCHAR(255),
 +  provider VARCHAR(255),
 +  service VARCHAR(255),
 +  resource VARCHAR(255),
 +  CONSTRAINT PK_viewresource PRIMARY KEY CLUSTERED (view_name, NAME),
 +  CONSTRAINT FK_viewres_view_name FOREIGN KEY (view_name) REFERENCES viewmain(view_name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.viewentity') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('viewentity') AND type = 'U')
 +BEGIN
 +CREATE TABLE viewentity (
 +  id BIGINT NOT NULL,
 +  view_name VARCHAR(255) NOT NULL,
 +  view_instance_name VARCHAR(255) NOT NULL,
 +  class_name VARCHAR(255) NOT NULL,
 +  id_property VARCHAR(255),
 +  CONSTRAINT PK_viewentity PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_viewentity_view_name FOREIGN KEY (view_name, view_instance_name) REFERENCES viewinstance(view_name, name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.adminpermission') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('adminpermission') AND type = 'U')
 +BEGIN
 +CREATE TABLE adminpermission (
 +  permission_id BIGINT NOT NULL,
 +  permission_name VARCHAR(255) NOT NULL,
 +  resource_type_id INTEGER NOT NULL,
 +  permission_label VARCHAR(255),
 +  principal_id BIGINT NOT NULL,
 +  sort_order SMALLINT NOT NULL DEFAULT 1,
 +  CONSTRAINT PK_adminpermission PRIMARY KEY CLUSTERED (permission_id),
 +  CONSTRAINT FK_permission_resource_type_id FOREIGN KEY (resource_type_id) REFERENCES adminresourcetype(resource_type_id),
 +  CONSTRAINT FK_permission_principal_id FOREIGN KEY (principal_id) REFERENCES adminprincipal(principal_id),
 +  CONSTRAINT UQ_perm_name_resource_type_id UNIQUE (permission_name, resource_type_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.roleauthorization') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('roleauthorization') AND type = 'U')
 +BEGIN
 +CREATE TABLE roleauthorization (
 +  authorization_id VARCHAR(100) NOT NULL,
 +  authorization_name VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_roleauthorization PRIMARY KEY (authorization_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.permission_roleauthorization') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('permission_roleauthorization') AND type = 'U')
 +BEGIN
 +CREATE TABLE permission_roleauthorization (
 +  permission_id BIGINT NOT NULL,
 +  authorization_id VARCHAR(100) NOT NULL,
 +  CONSTRAINT PK_permsn_roleauthorization PRIMARY KEY (permission_id, authorization_id),
 +  CONSTRAINT FK_permission_roleauth_aid FOREIGN KEY (authorization_id) REFERENCES roleauthorization(authorization_id),
 +  CONSTRAINT FK_permission_roleauth_pid FOREIGN KEY (permission_id) REFERENCES adminpermission(permission_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.adminprivilege') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('adminprivilege') AND type = 'U')
 +BEGIN
 +CREATE TABLE adminprivilege (
 +  privilege_id BIGINT,
 +  permission_id BIGINT NOT NULL,
 +  resource_id BIGINT NOT NULL,
 +  principal_id BIGINT NOT NULL,
 +  CONSTRAINT PK_adminprivilege PRIMARY KEY CLUSTERED (privilege_id),
 +  CONSTRAINT FK_privilege_permission_id FOREIGN KEY (permission_id) REFERENCES adminpermission(permission_id),
 +  CONSTRAINT FK_privilege_principal_id FOREIGN KEY (principal_id) REFERENCES adminprincipal(principal_id),
 +  CONSTRAINT FK_privilege_resource_id FOREIGN KEY (resource_id) REFERENCES adminresource(resource_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.host_version') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('host_version') AND type = 'U')
 +BEGIN
 +CREATE TABLE host_version (
 +  id BIGINT NOT NULL,
 +  repo_version_id BIGINT NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  STATE VARCHAR(32) NOT NULL,
 +  CONSTRAINT PK_host_version PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_host_version_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
 +  CONSTRAINT FK_host_version_repovers_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id),
-   CONSTRAINT UQ_host_repo UNIQUE(repo_version_id, host_id))
++  CONSTRAINT UQ_host_repo UNIQUE(host_id, repo_version_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.artifact') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('artifact') AND type = 'U')
 +BEGIN
 +CREATE TABLE artifact (
 +  artifact_name VARCHAR(255) NOT NULL,
 +  artifact_data TEXT NOT NULL,
 +  foreign_keys VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_artifact PRIMARY KEY CLUSTERED (artifact_name, foreign_keys)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.widget') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('widget') AND type = 'U')
 +BEGIN
 +CREATE TABLE widget (
 +  id BIGINT NOT NULL,
 +  widget_name VARCHAR(255) NOT NULL,
 +  widget_type VARCHAR(255) NOT NULL,
 +  metrics TEXT,
 +  time_created BIGINT NOT NULL,
 +  author VARCHAR(255),
 +  description VARCHAR(2048),
 +  default_section_name VARCHAR(255),
 +  scope VARCHAR(255),
 +  widget_values VARCHAR(4000),
 +  properties VARCHAR(4000),
 +  cluster_id BIGINT NOT NULL,
 +  CONSTRAINT PK_widget PRIMARY KEY CLUSTERED (id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.widget_layout') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('widget_layout') AND type = 'U')
 +BEGIN
 +CREATE TABLE widget_layout (
 +  id BIGINT NOT NULL,
 +  layout_name VARCHAR(255) NOT NULL,
 +  section_name VARCHAR(255) NOT NULL,
 +  scope VARCHAR(255) NOT NULL,
 +  user_name VARCHAR(255) NOT NULL,
 +  display_name VARCHAR(255),
 +  cluster_id BIGINT NOT NULL,
 +  CONSTRAINT PK_widget_layout PRIMARY KEY CLUSTERED (id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.widget_layout_user_widget') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('widget_layout_user_widget') AND type = 'U')
 +BEGIN
 +CREATE TABLE widget_layout_user_widget (
 +  widget_layout_id BIGINT NOT NULL,
 +  widget_id BIGINT NOT NULL,
 +  widget_order smallint,
 +  CONSTRAINT PK_widget_layout_user_widget PRIMARY KEY CLUSTERED (widget_layout_id, widget_id),
 +  CONSTRAINT FK_widget_id FOREIGN KEY (widget_id) REFERENCES widget(id),
 +  CONSTRAINT FK_widget_layout_id FOREIGN KEY (widget_layout_id) REFERENCES widget_layout(id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.topology_request') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('topology_request') AND type = 'U')
 +BEGIN
 +CREATE TABLE topology_request (
 +  id BIGINT NOT NULL,
 +  action VARCHAR(255) NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  bp_name VARCHAR(100) NOT NULL,
 +  cluster_properties TEXT,
 +  cluster_attributes TEXT,
 +  description VARCHAR(1024),
 +  provision_action VARCHAR(255),
 +  CONSTRAINT PK_topology_request PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_topology_request_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters(cluster_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.topology_hostgroup') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('topology_hostgroup') AND type = 'U')
 +BEGIN
 +CREATE TABLE topology_hostgroup (
 +  id BIGINT NOT NULL,
 +  name VARCHAR(255) NOT NULL,
 +  group_properties TEXT,
 +  group_attributes TEXT,
 +  request_id BIGINT NOT NULL,
 +  CONSTRAINT PK_topology_hostgroup PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_hostgroup_req_id FOREIGN KEY (request_id) REFERENCES topology_request(id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.topology_host_info') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('topology_host_info') AND type = 'U')
 +BEGIN
 +CREATE TABLE topology_host_info (
 +  id BIGINT NOT NULL,
 +  group_id BIGINT NOT NULL,
 +  fqdn VARCHAR(255),
 +  host_id BIGINT,
 +  host_count INTEGER,
 +  predicate VARCHAR(2048),
 +  rack_info VARCHAR(255),
 +  CONSTRAINT PK_topology_host_info PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_hostinfo_group_id FOREIGN KEY (group_id) REFERENCES topology_hostgroup(id),
 +  CONSTRAINT FK_hostinfo_host_id FOREIGN KEY (host_id) REFERENCES hosts(host_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.topology_logical_request') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('topology_logical_request') AND type = 'U')
 +BEGIN
 +CREATE TABLE topology_logical_request (
 +  id BIGINT NOT NULL,
 +  request_id BIGINT NOT NULL,
 +  description VARCHAR(1024),
 +  CONSTRAINT PK_topology_logical_request PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_logicalreq_req_id FOREIGN KEY (request_id) REFERENCES topology_request(id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.topology_host_request') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('topology_host_request') AND type = 'U')
 +BEGIN
 +CREATE TABLE topology_host_request (
 +  id BIGINT NOT NULL,
 +  logical_request_id BIGINT NOT NULL,
 +  group_id BIGINT NOT NULL,
 +  stage_id BIGINT NOT NULL,
 +  host_name VARCHAR(255),
 +  CONSTRAINT PK_topology_host_request PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_hostreq_group_id FOREIGN KEY (group_id) REFERENCES topology_hostgroup(id),
 +  CONSTRAINT FK_hostreq_logicalreq_id FOREIGN KEY (logical_request_id) REFERENCES topology_logical_request(id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.topology_host_task') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('topology_host_task') AND type = 'U')
 +BEGIN
 +CREATE TABLE topology_host_task (
 +  id BIGINT NOT NULL,
 +  host_request_id BIGINT NOT NULL,
 +  type VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_topology_host_task PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_hosttask_req_id FOREIGN KEY (host_request_id) REFERENCES topology_host_request (id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.topology_logical_task') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('topology_logical_task') AND type = 'U')
 +BEGIN
 +CREATE TABLE topology_logical_task (
 +  id BIGINT NOT NULL,
 +  host_task_id BIGINT NOT NULL,
 +  physical_task_id BIGINT,
 +  component VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_topology_logical_task PRIMARY KEY CLUSTERED (id),
 +  CONSTRAINT FK_ltask_hosttask_id FOREIGN KEY (host_task_id) REFERENCES topology_host_task (id),
 +  CONSTRAINT FK_ltask_hrc_id FOREIGN KEY (physical_task_id) REFERENCES host_role_command (task_id))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.setting') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('setting') AND type = 'U')
 +BEGIN
 +CREATE TABLE setting (
 +  id BIGINT NOT NULL,
 +  name VARCHAR(255) NOT NULL UNIQUE,
 +  setting_type VARCHAR(255) NOT NULL,
 +  content TEXT NOT NULL,
 +  updated_by VARCHAR(255) NOT NULL DEFAULT '_db',
 +  update_timestamp BIGINT NOT NULL,
 +  CONSTRAINT PK_setting PRIMARY KEY (id)
 +)
 +END
 +
 +
 +-- Remote Cluster table
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.remoteambaricluster') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('remoteambaricluster') AND type = 'U')
 +BEGIN
 +CREATE TABLE remoteambaricluster(
 +  cluster_id BIGINT NOT NULL,
 +  name VARCHAR(255) NOT NULL,
 +  username VARCHAR(255) NOT NULL,
 +  url VARCHAR(255) NOT NULL,
 +  password VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_remote_ambari_cluster PRIMARY KEY (cluster_id),
 +  CONSTRAINT UQ_remote_ambari_cluster UNIQUE (name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.remoteambariclusterservice') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('remoteambariclusterservice') AND type = 'U')
 +BEGIN
 +CREATE TABLE remoteambariclusterservice(
 +  id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_remote_ambari_service PRIMARY KEY (id),
 +  CONSTRAINT FK_remote_ambari_cluster_id FOREIGN KEY (cluster_id) REFERENCES remoteambaricluster(cluster_id)
 +)
 +END
 +
 +
 +-- Remote Cluster table ends
 +
 +-- upgrade tables
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.upgrade') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('upgrade') AND type = 'U')
 +BEGIN
 +CREATE TABLE upgrade (
 +  upgrade_id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  request_id BIGINT NOT NULL,
-   from_version VARCHAR(255) DEFAULT '' NOT NULL,
-   to_version VARCHAR(255) DEFAULT '' NOT NULL,
 +  direction VARCHAR(255) DEFAULT 'UPGRADE' NOT NULL,
++  orchestration VARCHAR(255) DEFAULT 'STANDARD' NOT NULL,
 +  upgrade_package VARCHAR(255) NOT NULL,
 +  upgrade_type VARCHAR(32) NOT NULL,
++  repo_version_id BIGINT NOT NULL,
 +  skip_failures BIT NOT NULL DEFAULT 0,
 +  skip_sc_failures BIT NOT NULL DEFAULT 0,
 +  downgrade_allowed BIT NOT NULL DEFAULT 1,
++  revert_allowed BIT NOT NULL DEFAULT 0,
 +  suspended BIT DEFAULT 0 NOT NULL,
 +  CONSTRAINT PK_upgrade PRIMARY KEY CLUSTERED (upgrade_id),
 +  FOREIGN KEY (cluster_id) REFERENCES clusters(cluster_id),
-   FOREIGN KEY (request_id) REFERENCES request(request_id)
++  FOREIGN KEY (request_id) REFERENCES request(request_id),
++  FOREIGN KEY (repo_version_id) REFERENCES repo_version(repo_version_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.upgrade_group') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('upgrade_group') AND type = 'U')
 +BEGIN
 +CREATE TABLE upgrade_group (
 +  upgrade_group_id BIGINT NOT NULL,
 +  upgrade_id BIGINT NOT NULL,
 +  group_name VARCHAR(255) DEFAULT '' NOT NULL,
 +  group_title VARCHAR(1024) DEFAULT '' NOT NULL,
 +  CONSTRAINT PK_upgrade_group PRIMARY KEY CLUSTERED (upgrade_group_id),
 +  FOREIGN KEY (upgrade_id) REFERENCES upgrade(upgrade_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.upgrade_item') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('upgrade_item') AND type = 'U')
 +BEGIN
 +CREATE TABLE upgrade_item (
 +  upgrade_item_id BIGINT NOT NULL,
 +  upgrade_group_id BIGINT NOT NULL,
 +  stage_id BIGINT NOT NULL,
 +  state VARCHAR(255) DEFAULT 'NONE' NOT NULL,
 +  hosts TEXT,
 +  tasks TEXT,
 +  item_text VARCHAR(1024),
 +  CONSTRAINT PK_upgrade_item PRIMARY KEY CLUSTERED (upgrade_item_id),
 +  FOREIGN KEY (upgrade_group_id) REFERENCES upgrade_group(upgrade_group_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.servicecomponent_history') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('upgrade_history') AND type = 'U')
 +BEGIN
- CREATE TABLE servicecomponent_history(
++CREATE TABLE upgrade_history(
 +  id BIGINT NOT NULL,
-   component_id BIGINT NOT NULL,
 +  upgrade_id BIGINT NOT NULL,
-   from_stack_id BIGINT NOT NULL,
-   to_stack_id BIGINT NOT NULL,
-   CONSTRAINT PK_sc_history PRIMARY KEY (id),
-   CONSTRAINT FK_sc_history_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id),
-   CONSTRAINT FK_sc_history_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id),
-   CONSTRAINT FK_sc_history_from_stack_id FOREIGN KEY (from_stack_id) REFERENCES stack (stack_id),
-   CONSTRAINT FK_sc_history_to_stack_id FOREIGN KEY (to_stack_id) REFERENCES stack (stack_id)
++  service_name VARCHAR(255) NOT NULL,
++  component_name VARCHAR(255) NOT NULL,
++  from_repo_version_id BIGINT NOT NULL,
++  target_repo_version_id BIGINT NOT NULL,
++  CONSTRAINT PK_upgrade_hist PRIMARY KEY (id),
++  CONSTRAINT FK_upgrade_hist_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id),
++  CONSTRAINT FK_upgrade_hist_from_repo FOREIGN KEY (from_repo_version_id) REFERENCES repo_version (repo_version_id),
++  CONSTRAINT FK_upgrade_hist_target_repo FOREIGN KEY (target_repo_version_id) REFERENCES repo_version (repo_version_id),
++  CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.servicecomponent_version') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('servicecomponent_version') AND type = 'U')
 +BEGIN
 +CREATE TABLE servicecomponent_version(
 +  id BIGINT NOT NULL,
 +  component_id BIGINT NOT NULL,
 +  repo_version_id BIGINT NOT NULL,
 +  state VARCHAR(32) NOT NULL,
 +  user_name VARCHAR(255) NOT NULL,
 +  CONSTRAINT PK_sc_version PRIMARY KEY (id),
 +  CONSTRAINT FK_scv_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id),
 +  CONSTRAINT FK_scv_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.ambari_operation_history') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('ambari_operation_history') AND type = 'U')
 +BEGIN
 +CREATE TABLE ambari_operation_history(
 +  id BIGINT NOT NULL,
 +  from_version VARCHAR(255) NOT NULL,
 +  to_version VARCHAR(255) NOT NULL,
 +  start_time BIGINT NOT NULL,
 +  end_time BIGINT,
 +  operation_type VARCHAR(255) NOT NULL,
 +  comments TEXT,
 +  CONSTRAINT PK_ambari_operation_history PRIMARY KEY (id)
 +)
 +END
 +
 +
 +
 +-- tasks indices --
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_stage_request_id')
 +BEGIN
 +CREATE INDEX idx_stage_request_id ON stage (request_id)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_hrc_request_id')
 +BEGIN
 +CREATE INDEX idx_hrc_request_id ON host_role_command (request_id)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_hrc_status_role')
 +BEGIN
 +CREATE INDEX idx_hrc_status_role ON host_role_command (status, role)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_rsc_request_id')
 +BEGIN
 +CREATE INDEX idx_rsc_request_id ON role_success_criteria (request_id)
 +END
 +
 +
 +
 +-- altering tables by creating unique constraints----------
 +--------altering tables to add constraints----------
 +
 +-- altering tables by creating foreign keys----------
 +-- Note, Oracle has a limitation of 32 chars in the FK name, and we should use the same FK name in all DB types.
 +IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('FK_clusters_upgrade_id') AND type = 'F')
 +BEGIN
 +ALTER TABLE clusters ADD CONSTRAINT FK_clusters_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id)
 +END
 +
 +
 +-- Kerberos
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.kerberos_principal') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('kerberos_principal') AND type = 'U')
 +BEGIN
 +CREATE TABLE kerberos_principal (
 +  principal_name VARCHAR(255) NOT NULL,
 +  is_service SMALLINT NOT NULL DEFAULT 1,
 +  cached_keytab_path VARCHAR(255),
 +  CONSTRAINT PK_kerberos_principal PRIMARY KEY CLUSTERED (principal_name)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.kerberos_principal_host') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('kerberos_principal_host') AND type = 'U')
 +BEGIN
 +CREATE TABLE kerberos_principal_host (
 +  principal_name VARCHAR(255) NOT NULL,
 +  host_id BIGINT NOT NULL,
 +  CONSTRAINT PK_kerberos_principal_host PRIMARY KEY CLUSTERED (principal_name, host_id),
 +  CONSTRAINT FK_krb_pr_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
 +  CONSTRAINT FK_krb_pr_host_principalname FOREIGN KEY (principal_name) REFERENCES kerberos_principal (principal_name))
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.kerberos_descriptor') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('kerberos_descriptor') AND type = 'U')
 +BEGIN
 +CREATE TABLE kerberos_descriptor
 +(
 +   kerberos_descriptor_name   VARCHAR(255) NOT NULL,
 +   kerberos_descriptor        VARCHAR(MAX) NOT NULL,
 +   CONSTRAINT PK_kerberos_descriptor PRIMARY KEY (kerberos_descriptor_name)
 +)
 +END
 +
 +
 +-- Kerberos (end)
 +
 +-- Alerting Framework
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_definition') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_definition') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_definition (
 +  definition_id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  definition_name VARCHAR(255) NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  component_name VARCHAR(255),
 +  scope VARCHAR(255) DEFAULT 'ANY' NOT NULL,
 +  label VARCHAR(255),
 +  help_url VARCHAR(512),
 +  description TEXT,
 +  enabled SMALLINT DEFAULT 1 NOT NULL,
 +  schedule_interval INTEGER NOT NULL,
 +  source_type VARCHAR(255) NOT NULL,
 +  alert_source TEXT NOT NULL,
 +  hash VARCHAR(64) NOT NULL,
 +  ignore_host SMALLINT DEFAULT 0 NOT NULL,
 +  repeat_tolerance INTEGER DEFAULT 1 NOT NULL,
 +  repeat_tolerance_enabled SMALLINT DEFAULT 0 NOT NULL,
 +  CONSTRAINT PK_alert_definition PRIMARY KEY CLUSTERED (definition_id),
 +  FOREIGN KEY (cluster_id) REFERENCES clusters(cluster_id),
 +  CONSTRAINT uni_alert_def_name UNIQUE(cluster_id,definition_name)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_history') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_history') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_history (
 +  alert_id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  alert_definition_id BIGINT NOT NULL,
 +  service_name VARCHAR(255) NOT NULL,
 +  component_name VARCHAR(255),
 +  host_name VARCHAR(255),
 +  alert_instance VARCHAR(255),
 +  alert_timestamp BIGINT NOT NULL,
 +  alert_label VARCHAR(1024),
 +  alert_state VARCHAR(255) NOT NULL,
 +  alert_text TEXT,
 +  CONSTRAINT PK_alert_history PRIMARY KEY CLUSTERED (alert_id),
 +  FOREIGN KEY (alert_definition_id) REFERENCES alert_definition(definition_id),
 +  FOREIGN KEY (cluster_id) REFERENCES clusters(cluster_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_current') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_current') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_current (
 +  alert_id BIGINT NOT NULL,
 +  definition_id BIGINT NOT NULL,
 +  history_id BIGINT NOT NULL UNIQUE,
 +  maintenance_state VARCHAR(255) NOT NULL,
 +  original_timestamp BIGINT NOT NULL,
 +  latest_timestamp BIGINT NOT NULL,
 +  latest_text TEXT,
 +  occurrences BIGINT NOT NULL DEFAULT 1,
 +  firmness VARCHAR(255) NOT NULL DEFAULT 'HARD',
 +  CONSTRAINT PK_alert_current PRIMARY KEY CLUSTERED (alert_id),
 +  FOREIGN KEY (definition_id) REFERENCES alert_definition(definition_id),
 +  FOREIGN KEY (history_id) REFERENCES alert_history(alert_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_group') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_group') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_group (
 +  group_id BIGINT NOT NULL,
 +  cluster_id BIGINT NOT NULL,
 +  group_name VARCHAR(255) NOT NULL,
 +  is_default SMALLINT NOT NULL DEFAULT 0,
 +  service_name VARCHAR(255),
 +  CONSTRAINT PK_alert_group PRIMARY KEY CLUSTERED (group_id),
 +  CONSTRAINT uni_alert_group_name UNIQUE(cluster_id,group_name)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_target') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_target') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_target (
 +  target_id BIGINT NOT NULL,
 +  target_name VARCHAR(255) NOT NULL UNIQUE,
 +  notification_type VARCHAR(64) NOT NULL,
 +  properties TEXT,
 +  description VARCHAR(1024),
 +  is_global SMALLINT NOT NULL DEFAULT 0,
 +  is_enabled SMALLINT NOT NULL DEFAULT 1,
 +  CONSTRAINT PK_alert_target PRIMARY KEY CLUSTERED (target_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_target_states') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_target_states') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_target_states (
 +  target_id BIGINT NOT NULL,
 +  alert_state VARCHAR(255) NOT NULL,
 +  FOREIGN KEY (target_id) REFERENCES alert_target(target_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_group_target') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_group_target') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_group_target (
 +  group_id BIGINT NOT NULL,
 +  target_id BIGINT NOT NULL,
 +  CONSTRAINT PK_alert_group_target PRIMARY KEY CLUSTERED (group_id, target_id),
 +  FOREIGN KEY (group_id) REFERENCES alert_group(group_id),
 +  FOREIGN KEY (target_id) REFERENCES alert_target(target_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_grouping') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_grouping') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_grouping (
 +  definition_id BIGINT NOT NULL,
 +  group_id BIGINT NOT NULL,
 +  CONSTRAINT PK_alert_grouping PRIMARY KEY CLUSTERED (group_id, definition_id),
 +  FOREIGN KEY (definition_id) REFERENCES alert_definition(definition_id),
 +  FOREIGN KEY (group_id) REFERENCES alert_group(group_id)
 +)
 +END
 +
 +
- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('dbo.alert_notice') AND type = 'U')
++IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('alert_notice') AND type = 'U')
 +BEGIN
 +CREATE TABLE alert_notice (
 +  notification_id BIGINT NOT NULL,
 +  target_id BIGINT NOT NULL,
 +  history_id BIGINT NOT NULL,
 +  notify_state VARCHAR(255) NOT NULL,
 +  uuid VARCHAR(64) NOT NULL UNIQUE,
 +  CONSTRAINT PK_alert_notice PRIMARY KEY CLUSTERED (notification_id),
 +  FOREIGN KEY (target_id) REFERENCES alert_target(target_id),
 +  FOREIGN KEY (history_id) REFERENCES alert_history(alert_id)
 +)
 +END
 +
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_alert_history_def_id')
 +BEGIN
 +CREATE INDEX idx_alert_history_def_id on alert_history(alert_definition_id)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_alert_history_service')
 +BEGIN
 +CREATE INDEX idx_alert_history_service on alert_history(service_name)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_alert_history_host')
 +BEGIN
 +CREATE INDEX idx_alert_history_host on alert_history(host_name)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_alert_history_time')
 +BEGIN
 +CREATE INDEX idx_alert_history_time on alert_history(alert_timestamp)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_alert_history_state')
 +BEGIN
 +CREATE INDEX idx_alert_history_state on alert_history(alert_state)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_alert_group_name')
 +BEGIN
 +CREATE INDEX idx_alert_group_name on alert_group(group_name)
 +END
 +
 +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'idx_alert_notice_state')
 +BEGIN
 +CREATE INDEX idx_alert_notice_state on alert_notice(notify_state)
 +END
 +
 +
 +---------inserting some data-----------
 +BEGIN TRANSACTION
 +  DELETE metainfo;
 +  DELETE adminprivilege;
 +  DELETE permission_roleauthorization;
 +  DELETE roleauthorization;
 +  DELETE adminpermission;
 +  DELETE users;
 +  DELETE adminprincipal;
 +  DELETE adminprincipaltype;
 +  DELETE adminresource;
 +  DELETE adminresourcetype;
 +  DELETE ambari_sequences;
 +  INSERT INTO ambari_sequences (sequence_name, [sequence_value])
 +  VALUES
 +    ('cluster_id_seq', 1),
 +    ('host_id_seq', 0),
 +    ('user_id_seq', 2),
 +    ('group_id_seq', 1),
 +    ('member_id_seq', 1),
 +    ('host_role_command_id_seq', 1),
 +    ('configgroup_id_seq', 1),
 +    ('requestschedule_id_seq', 1),
 +    ('resourcefilter_id_seq', 1),
 +    ('viewentity_id_seq', 0),
 +    ('operation_level_id_seq', 1),
 +    ('view_instance_id_seq', 1),
 +    ('resource_type_id_seq', 4),
 +    ('resource_id_seq', 2),
 +    ('principal_type_id_seq', 8),
 +    ('principal_id_seq', 13),
 +    ('permission_id_seq', 7),
 +    ('privilege_id_seq', 1),
 +    ('alert_definition_id_seq', 0),
 +    ('alert_group_id_seq', 0),
 +    ('alert_target_id_seq', 0),
 +    ('alert_history_id_seq', 0),
 +    ('alert_notice_id_seq', 0),
 +    ('alert_current_id_seq', 0),
 +    ('config_id_seq', 11),
 +    ('repo_version_id_seq', 0),
-     ('cluster_version_id_seq', 0),
 +    ('host_version_id_seq', 0),
 +    ('service_config_id_seq', 1),
 +    ('upgrade_id_seq', 0),
 +    ('upgrade_group_id_seq', 0),
 +    ('widget_id_seq', 0),
 +    ('widget_layout_id_seq', 0),
 +    ('upgrade_item_id_seq', 0),
 +    ('stack_id_seq', 0),
 +    ('extension_id_seq', 0),
 +    ('link_id_seq', 0),
 +    ('topology_host_info_id_seq', 0),
 +    ('topology_host_request_id_seq', 0),
 +    ('topology_host_task_id_seq', 0),
 +    ('topology_logical_request_id_seq', 0),
 +    ('topology_logical_task_id_seq', 0),
 +    ('topology_request_id_seq', 0),
 +    ('topology_host_group_id_seq', 0),
 +    ('setting_id_seq', 0),
 +    ('hostcomponentstate_id_seq', 0),
 +    ('servicecomponentdesiredstate_id_seq', 0),
-     ('servicecomponent_history_id_seq', 0),
++    ('upgrade_history_id_seq', 0),
 +    ('blueprint_setting_id_seq', 0),
 +    ('ambari_operation_history_id_seq', 0),
 +    ('remote_cluster_id_seq', 0),
 +    ('remote_cluster_service_id_seq', 0),
 +    ('servicecomponent_version_id_seq', 0),
 +    ('hostcomponentdesiredstate_id_seq', 0)
 +
 +  insert into adminresourcetype (resource_type_id, resource_type_name)
 +  values
 +    (1, 'AMBARI'),
 +    (2, 'CLUSTER'),
 +    (3, 'VIEW')
 +
 +  insert into adminresource (resource_id, resource_type_id)
 +    select 1, 1
 +
 +  insert into adminprincipaltype (principal_type_id, principal_type_name)
 +  values
 +    (1, 'USER'),
 +    (2, 'GROUP'),
 +    (8, 'ROLE')
 +
 +  insert into adminprincipal (principal_id, principal_type_id)
 +  values
 +    (1, 1),
 +    (7, 8),
 +    (8, 8),
 +    (9, 8),
 +    (10, 8),
 +    (11, 8),
 +    (12, 8),
 +    (13, 8)
 +
 +  insert into users(user_id, principal_id, user_name, user_password)
 +    select 1, 1, 'admin','538916f8943ec225d97a9a86a2c6ec0818c1cd400e09e03b660fdaaec4af29ddbb6f2b1033b81b00'
 +
 +  insert into adminpermission(permission_id, permission_name, resource_type_id, permission_label, principal_id, sort_order)
 +  values
 +    (1, 'AMBARI.ADMINISTRATOR', 1, 'Ambari Administrator', 7, 1),
 +    (2, 'CLUSTER.USER', 2, 'Cluster User', 8, 6),
 +    (3, 'CLUSTER.ADMINISTRATOR', 2, 'Cluster Administrator', 9, 2),
 +    (4, 'VIEW.USER', 3, 'View User', 10, 7),
 +    (5, 'CLUSTER.OPERATOR', 2, 'Cluster Operator', 11, 3),
 +    (6, 'SERVICE.ADMINISTRATOR', 2, 'Service Administrator', 12, 4),
 +    (7, 'SERVICE.OPERATOR', 2, 'Service Operator', 13, 5)
 +
 +  INSERT INTO roleauthorization(authorization_id, authorization_name)
 +    SELECT 'VIEW.USE', 'Use View' UNION ALL
 +    SELECT 'SERVICE.VIEW_METRICS', 'View metrics' UNION ALL
 +    SELECT 'SERVICE.VIEW_STATUS_INFO', 'View status information' UNION ALL
 +    SELECT 'SERVICE.VIEW_CONFIGS', 'View configurations' UNION ALL
 +    SELECT 'SERVICE.COMPARE_CONFIGS', 'Compare configurations' UNION ALL
 +    SELECT 'SERVICE.VIEW_ALERTS', 'View service-level alerts' UNION ALL
 +    SELECT 'SERVICE.START_STOP', 'Start/Stop/Restart Service' UNION ALL
 +    SELECT 'SERVICE.DECOMMISSION_RECOMMISSION', 'Decommission/recommission' UNION ALL
 +    SELECT 'SERVICE.RUN_SERVICE_CHECK', 'Run service checks' UNION ALL
 +    SELECT 'SERVICE.TOGGLE_MAINTENANCE', 'Turn on/off maintenance mode' UNION ALL
 +    SELECT 'SERVICE.RUN_CUSTOM_COMMAND', 'Perform service-specific tasks' UNION ALL
 +    SELECT 'SERVICE.MODIFY_CONFIGS', 'Modify configurations' UNION ALL
 +    SELECT 'SERVICE.MANAGE_ALERTS', 'Manage service-level alerts' UNION ALL
 +    SELECT 'SERVICE.MANAGE_CONFIG_GROUPS', 'Manage configuration groups' UNION ALL
 +    SELECT 'SERVICE.MOVE', 'Move service to another host' UNION ALL
 +    SELECT 'SERVICE.ENABLE_HA', 'Enable HA' UNION ALL
 +    SELECT 'SERVICE.TOGGLE_ALERTS', 'Enable/disable service-level alerts' UNION ALL
 +    SELECT 'SERVICE.ADD_DELETE_SERVICES', 'Add/delete services' UNION ALL
 +    SELECT 'SERVICE.VIEW_OPERATIONAL_LOGS', 'View service operational logs' UNION ALL
 +    SELECT 'SERVICE.SET_SERVICE_USERS_GROUPS', 'Set service users and groups' UNION ALL
 +    SELECT 'SERVICE.MANAGE_AUTO_START', 'Manage service auto-start' UNION ALL
 +    SELECT 'HOST.VIEW_METRICS', 'View metrics' UNION ALL
 +    SELECT 'HOST.VIEW_STATUS_INFO', 'View status information' UNION ALL
 +    SELECT 'HOST.VIEW_CONFIGS', 'View configuration' UNION ALL
 +    SELECT 'HOST.TOGGLE_MAINTENANCE', 'Turn on/off maintenance mode' UNION ALL
 +    SELECT 'HOST.ADD_DELETE_COMPONENTS', 'Install components' UNION ALL
 +    SELECT 'HOST.ADD_DELETE_HOSTS', 'Add/Delete hosts' UNION ALL
 +    SELECT 'CLUSTER.VIEW_METRICS', 'View metrics' UNION ALL
 +    SELECT 'CLUSTER.VIEW_STATUS_INFO', 'View status information' UNION ALL
 +    SELECT 'CLUSTER.VIEW_CONFIGS', 'View configuration' UNION ALL
 +    SELECT 'CLUSTER.VIEW_STACK_DETAILS', 'View stack version details' UNION ALL
 +    SELECT 'CLUSTER.VIEW_ALERTS', 'View cluster-level alerts' UNION ALL
 +    SELECT 'CLUSTER.MANAGE_CREDENTIALS', 'Manage external credentials' UNION ALL
 +    SELECT 'CLUSTER.MODIFY_CONFIGS', 'Modify cluster configurations' UNION ALL
 +    SELECT 'CLUSTER.MANAGE_ALERTS', 'Manage cluster-level alerts' UNION ALL
 +    SELECT 'CLUSTER.MANAGE_USER_PERSISTED_DATA', 'Manage cluster-level user persisted data' UNION ALL
 +    SELECT 'CLUSTER.TOGGLE_ALERTS', 'Enable/disable cluster-level alerts' UNION ALL
 +    SELECT 'CLUSTER.MANAGE_CONFIG_GROUPS', 'Manage cluster config groups' UNION ALL
 +    SELECT 'CLUSTER.TOGGLE_KERBEROS', 'Enable/disable Kerberos' UNION ALL
 +    SELECT 'CLUSTER.UPGRADE_DOWNGRADE_STACK', 'Upgrade/downgrade stack' UNION ALL
 +    SELECT 'CLUSTER.RUN_CUSTOM_COMMAND', 'Perform custom cluster-level actions' UNION ALL
 +    SELECT 'CLUSTER.MANAGE_AUTO_START', 'Manage service auto-start configuration' UNION ALL
 +    SELECT 'CLUSTER.MANAGE_ALERT_NOTIFICATIONS', 'Manage alert notifications configuration' UNION ALL
 +    SELECT 'AMBARI.ADD_DELETE_CLUSTERS', 'Create new clusters' UNION ALL
 +    SELECT 'AMBARI.RENAME_CLUSTER', 'Rename clusters' UNION ALL
 +    SELECT 'AMBARI.MANAGE_SETTINGS', 'Manage settings' UNION ALL
 +    SELECT 'AMBARI.MANAGE_USERS', 'Manage users' UNION ALL
 +    SELECT 'AMBARI.MANAGE_GROUPS', 'Manage groups' UNION ALL
 +    SELECT 'AMBARI.MANAGE_VIEWS', 'Manage Ambari Views' UNION ALL
 +    SELECT 'AMBARI.ASSIGN_ROLES', 'Assign roles' UNION ALL
 +    SELECT 'AMBARI.MANAGE_STACK_VERSIONS', 'Manage stack versions' UNION ALL
 +    SELECT 'AMBARI.EDIT_STACK_REPOS', 'Edit stack repository URLs' UNION ALL
 +    SELECT 'AMBARI.RUN_CUSTOM_COMMAND', 'Perform custom administrative actions'
 +
 +  -- Set authorizations for View User role
 +  INSERT INTO permission_roleauthorization(permission_id, authorization_id)
 +    SELECT permission_id, 'VIEW.USE' FROM adminpermission WHERE permission_name='VIEW.USER'
 +
 +  -- Set authorizations for Cluster User role
 +  INSERT INTO permission_roleauthorization(permission_id, authorization_id)
 +    SELECT permission_id, 'SERVICE.VIEW_METRICS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'SERVICE.COMPARE_CONFIGS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_ALERTS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_METRICS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_METRICS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_STACK_DETAILS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_ALERTS' FROM adminpermission WHERE permission_name='CLUSTER.USER' UNION ALL
 +    SELECT permission_id, 'CLUSTER.MANAGE_USER_PERSISTED_DATA' FROM adminpermission WHERE permission_name='CLUSTER.USER'
 +
 +  -- Set authorizations for Service Operator role
 +  INSERT INTO permission_roleauthorization(permission_id, authorization_id)
 +    SELECT permission_id, 'SERVICE.VIEW_METRICS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.COMPARE_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_ALERTS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.START_STOP' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.DECOMMISSION_RECOMMISSION' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.RUN_SERVICE_CHECK' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.TOGGLE_MAINTENANCE' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.RUN_CUSTOM_COMMAND' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_METRICS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_METRICS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_STACK_DETAILS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_ALERTS' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.MANAGE_USER_PERSISTED_DATA' FROM adminpermission WHERE permission_name='SERVICE.OPERATOR'
 +
 +  -- Set authorizations for Service Administrator role
 +  INSERT INTO permission_roleauthorization(permission_id, authorization_id)
 +    SELECT permission_id, 'SERVICE.VIEW_METRICS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.COMPARE_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_ALERTS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.START_STOP' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.DECOMMISSION_RECOMMISSION' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.RUN_SERVICE_CHECK' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.TOGGLE_MAINTENANCE' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.RUN_CUSTOM_COMMAND' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.MODIFY_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.MANAGE_CONFIG_GROUPS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_OPERATIONAL_LOGS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.MANAGE_AUTO_START' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_METRICS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_METRICS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_STACK_DETAILS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.MANAGE_CONFIG_GROUPS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.VIEW_ALERTS' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR' UNION ALL
 +    SELECT permission_id, 'CLUSTER.MANAGE_USER_PERSISTED_DATA' FROM adminpermission WHERE permission_name='SERVICE.ADMINISTRATOR'
 +
 +  -- Set authorizations for Cluster Operator role
 +  INSERT INTO permission_roleauthorization(permission_id, authorization_id)
 +    SELECT permission_id, 'SERVICE.VIEW_METRICS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_CONFIGS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.COMPARE_CONFIGS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_ALERTS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.START_STOP' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.DECOMMISSION_RECOMMISSION' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.RUN_SERVICE_CHECK' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.TOGGLE_MAINTENANCE' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.RUN_CUSTOM_COMMAND' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.MODIFY_CONFIGS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.MANAGE_CONFIG_GROUPS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.MOVE' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.ENABLE_HA' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.VIEW_OPERATIONAL_LOGS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'SERVICE.MANAGE_AUTO_START' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_METRICS' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id, 'HOST.VIEW_STATUS_INFO' FROM adminpermission WHERE permission_name='CLUSTER.OPERATOR' UNION ALL
 +    SELECT permission_id

<TRUNCATED>

[04/50] [abbrv] ambari git commit: AMBARI-22035. Stack and Versions page is stuck while trying to install a new stack (alexantonenko)

Posted by ao...@apache.org.
AMBARI-22035. Stack and Versions page is stuck while trying to install a new stack (alexantonenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/19b16073
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/19b16073
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/19b16073

Branch: refs/heads/branch-3.0-perf
Commit: 19b16073c50556de666c17b3749ff6a0c1dae398
Parents: ea89244
Author: Alex Antonenko <aa...@hortonworks.com>
Authored: Fri Sep 22 19:25:38 2017 +0300
Committer: Alex Antonenko <aa...@hortonworks.com>
Committed: Fri Sep 22 19:25:38 2017 +0300

----------------------------------------------------------------------
 ambari-web/app/mappers/repository_version_mapper.js | 2 +-
 ambari-web/app/mappers/stack_version_mapper.js      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/19b16073/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 746fc53..61056ae 100644
--- a/ambari-web/app/mappers/repository_version_mapper.js
+++ b/ambari-web/app/mappers/repository_version_mapper.js
@@ -123,7 +123,7 @@ App.repoVersionMapper = App.QuickDataMapper.create({
                 display_name: service.display_name,
                 latest_version: service.versions[0] ? service.versions[0] : '',
                 is_available: item[repoVersionsKey].services.someProperty('name', service.name),
-                is_upgradable: json.stackServices[service.name] && json.stackServices[service.name].upgrade
+                is_upgradable: json.stackServices ? json.stackServices[service.name] && json.stackServices[service.name].upgrade : true
               };
               resultService.push(serviceObj);
             }, this);

http://git-wip-us.apache.org/repos/asf/ambari/blob/19b16073/ambari-web/app/mappers/stack_version_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/stack_version_mapper.js b/ambari-web/app/mappers/stack_version_mapper.js
index 9fa0b78..7612674 100644
--- a/ambari-web/app/mappers/stack_version_mapper.js
+++ b/ambari-web/app/mappers/stack_version_mapper.js
@@ -81,7 +81,7 @@ App.stackVersionMapper = App.QuickDataMapper.create({
           item.repository_versions[0].RepositoryVersions.stackVersionId = item.ClusterStackVersions.id;
           App.repoVersionMapper.map({
             "items": item.repository_versions,
-            "stackServices": item.ClusterStackVersions.repository_summary.services
+            "stackServices": item.ClusterStackVersions.repository_summary && item.ClusterStackVersions.repository_summary.services
           }, true, true);
         }
         resultStack.push(this.parseIt(stack, this.get('modelStack')));


[21/50] [abbrv] ambari git commit: AMBARI-22015. livy2 interpreter errors (unable to impersonate users/ LLAP or Hive CNF issue) due to missing proxy configs. (Mingjie Tang via Swapan Shridhar).

Posted by ao...@apache.org.
AMBARI-22015. livy2 interpreter errors (unable to impersonate users/ LLAP or Hive CNF issue) due to missing proxy configs. (Mingjie Tang via Swapan Shridhar).


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/12c9ca7e
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/12c9ca7e
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/12c9ca7e

Branch: refs/heads/branch-3.0-perf
Commit: 12c9ca7e2fafd092149081971bcfcbbb1e49adf4
Parents: 4c49b4b
Author: Swapan Shridhar <ss...@hortonworks.com>
Authored: Mon Sep 25 15:37:41 2017 -0700
Committer: Swapan Shridhar <ss...@hortonworks.com>
Committed: Mon Sep 25 15:37:41 2017 -0700

----------------------------------------------------------------------
 .../main/resources/stacks/ODPi/2.0/services/stack_advisor.py  | 7 +++++++
 1 file changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/12c9ca7e/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py
----------------------------------------------------------------------
diff --git a/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py b/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py
index 5f70db2..418d0c0 100755
--- a/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py
+++ b/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py
@@ -271,6 +271,13 @@ class ODPi20StackAdvisor(DefaultStackAdvisor):
         if not livyUser in users and livyUser is not None:
           users[livyUser] = {"propertyHosts" : "*","propertyGroups" : "*", "config" : "livy-env", "propertyName" : "livy_user"}
 
+    if "SPARK2" in servicesList:
+      livyUser = None
+      if "livy2-env" in services["configurations"] and "livy_user" in services["configurations"]["livy2-env"]["properties"]:
+        livyUser = services["configurations"]["livy2-env"]["properties"]["livy_user"]
+        if not livyUser in users and livyUser is not None:
+          users[livy2User] = {"propertyHosts" : "*","propertyGroups" : "*", "config" : "livy2-env", "propertyName" : "livy_user"}
+
     putCoreSiteProperty = self.putProperty(configurations, "core-site", services)
     putCoreSitePropertyAttribute = self.putPropertyAttribute(configurations, "core-site")
 


[26/50] [abbrv] ambari git commit: AMBARI-22049. Solr Data Manager should use --line-delimited option by default (mgergely)

Posted by ao...@apache.org.
AMBARI-22049. Solr Data Manager should use --line-delimited option by default (mgergely)

Change-Id: Iae6c30e7a5c73ed93a68b58ee41bd5443cc91a79


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ee618e12
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ee618e12
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ee618e12

Branch: refs/heads/branch-3.0-perf
Commit: ee618e12490a20ab2f4f478700dbf929f7cbe6b6
Parents: af0db35
Author: Miklos Gergely <mg...@hortonworks.com>
Authored: Tue Sep 26 11:22:27 2017 +0200
Committer: Miklos Gergely <mg...@hortonworks.com>
Committed: Tue Sep 26 11:22:27 2017 +0200

----------------------------------------------------------------------
 .../src/main/python/solrDataManager.py          | 43 ++++++++++----------
 1 file changed, 21 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ee618e12/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
----------------------------------------------------------------------
diff --git a/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py b/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
index d17aec7..18a4da7 100644
--- a/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
+++ b/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py
@@ -64,11 +64,11 @@ def parse_arguments():
                     default="%Y-%m-%dT%H:%M:%S.%fZ")
   
   parser.add_option("-q", "--additional-filter", dest="additional_filter", type="string", help="additional solr filter")
-  parser.add_option("--name", dest="name", type="string", help="name included in result files")
+  parser.add_option("-j", "--name", dest="name", type="string", help="name included in result files")
   
   parser.add_option("-g", "--ignore-unfinished-uploading", dest="ignore_unfinished_uploading", action="store_true", default=False)
   
-  parser.add_option("-j", "--line-delimited", dest="line_delimited", help="line delmited json output", action="store_true", default=False)
+  parser.add_option("--json-file", dest="json_file", help="create a json file instead of line delimited json", action="store_true", default=False)
   parser.add_option("-z", "--compression", dest="compression", help="none | tar.gz | tar.bz2 | zip", default="tar.gz")
   
   parser.add_option("-k", "--solr-keytab", dest="solr_keytab", type="string", help="the keytab for a kerberized solr")
@@ -188,7 +188,7 @@ def parse_arguments():
     print("  solr-keytab: " + options.solr_keytab)
     print("  solr-principal: " + options.solr_principal)
   if options.mode == "save":
-    print("  line-delimited: " + str(options.line_delimited))
+    print("  output: " + ("json" if options.json_file else "line-delimited-json"))
     print("  compression: " + options.compression)
   if (options.__dict__["hdfs_keytab"] is not None):
     print("  hdfs-keytab: " + options.hdfs_keytab)
@@ -250,7 +250,7 @@ def delete(solr_url, collection, filter_field, end, solr_keytab, solr_principal)
   query_solr(solr_kinit_command, delete_command, "{0} {1}".format(curl_prefix, delete_command), "Deleting")
 
 def save(solr_url, collection, filter_field, id_field, range_end, read_block_size, write_block_size,
-         ignore_unfinished_uploading, additional_filter, name, solr_keytab, solr_principal, line_delimited,
+         ignore_unfinished_uploading, additional_filter, name, solr_keytab, solr_principal, json_file,
          compression, hdfs_keytab, hdfs_principal, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
   solr_kinit_command = None
   if solr_keytab:
@@ -269,7 +269,7 @@ def save(solr_url, collection, filter_field, id_field, range_end, read_block_siz
   working_dir = get_working_dir(solr_url, collection)
   handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_prefix, working_dir, ignore_unfinished_uploading)
   save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field, range_end,
-            read_block_size, write_block_size, working_dir, additional_filter, name, line_delimited, compression,
+            read_block_size, write_block_size, working_dir, additional_filter, name, json_file, compression,
             hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path)
 
 def ensure_hdfs_path(hdfs_kinit_command, hdfs_user, hdfs_path):
@@ -340,12 +340,11 @@ def handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_pre
     os.remove(command_json_path)
 
 def save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
-              range_end, read_block_size, write_block_size, working_dir, additional_filter, name, line_delimited,
+              range_end, read_block_size, write_block_size, working_dir, additional_filter, name, json_file,
               compression, hdfs_user, hdfs_path, key_file_path, bucket, key_prefix, local_path):
   logger.info("Starting to save data")
   
   tmp_file_path = "{0}/tmp.json".format(working_dir)
-  true = True # needed to be able to eval 'true' in the returned json
   
   prev_lot_end_value = None
   prev_lot_end_id = None
@@ -362,8 +361,7 @@ def save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, col
   total_records = 0
   while not done:
     results = create_block(tmp_file_path, solr_kinit_command, curl_prefix, solr_query_url_prefix, filter_field,
-                           id_field, range_end, write_block_size, prev_lot_end_value, prev_lot_end_id,
-                           line_delimited)
+                           id_field, range_end, write_block_size, prev_lot_end_value, prev_lot_end_id, json_file)
     done = results[0]
     records = results[1]
     prev_lot_end_value = results[2]
@@ -377,13 +375,13 @@ def save_data(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, col
       logger.info("A total of %d records are saved", total_records)
 
 def create_block(tmp_file_path, solr_kinit_command, curl_prefix, solr_query_url_prefix, filter_field, id_field, range_end,
-                 write_block_size, prev_lot_end_value, prev_lot_end_id, line_delimited):
+                 write_block_size, prev_lot_end_value, prev_lot_end_id, json_file):
   if os.path.exists(tmp_file_path):
     os.remove(tmp_file_path)
   tmp_file = open(tmp_file_path, 'w')
   logger.debug("Created tmp file %s", tmp_file_path)
   
-  init_file(tmp_file, line_delimited)
+  init_file(tmp_file, json_file)
   records = 0
   done = False
   while records < write_block_size:
@@ -406,7 +404,7 @@ def create_block(tmp_file_path, solr_kinit_command, curl_prefix, solr_query_url_
 
     for doc in rsp['response']['docs']:
       last_doc = doc
-      add_line(tmp_file, doc, line_delimited, records)
+      add_line(tmp_file, doc, json_file, records)
       records += 1
       if records == write_block_size:
         break
@@ -419,26 +417,26 @@ def create_block(tmp_file_path, solr_kinit_command, curl_prefix, solr_query_url_
       print
       logger.debug("Collecting next lot of data")
 
-  finish_file(tmp_file, line_delimited)
+  finish_file(tmp_file, json_file)
   sys.stdout.write("\n")
   logger.debug("Finished data collection")
   return [done, records, prev_lot_end_value, prev_lot_end_id]
 
-def init_file(tmp_file, line_delimited):
-  if not line_delimited:
+def init_file(tmp_file, json_file):
+  if json_file:
     tmp_file.write("{\n")
 
-def add_line(tmp_file, doc, line_delimited, records):
+def add_line(tmp_file, doc, json_file, records):
   if records > 0:
-    if line_delimited:
-      tmp_file.write("\n")
-    else:
+    if json_file:
       tmp_file.write(",\n")
+    else:
+      tmp_file.write("\n")
     
   tmp_file.write(json.dumps(doc))
 
-def finish_file(tmp_file, line_delimited):
-  if not line_delimited:
+def finish_file(tmp_file, json_file):
+  if json_file:
     tmp_file.write("\n}")
 
 def upload_block(solr_kinit_command, hdfs_kinit_command, curl_prefix, solr_url, collection, filter_field, id_field,
@@ -664,6 +662,7 @@ def query_solr(solr_kinit_command, url, curl_command, action):
     logger.warn(str(err))
     sys.exit()
 
+  true = True # needed to be able to eval 'true' in the returned json
   rsp = eval(str(out))
   if rsp["responseHeader"]["status"] != 0:
     print
@@ -703,7 +702,7 @@ if __name__ == '__main__':
     elif options.mode == "save":
       save(options.solr_url, options.collection, options.filter_field, options.id_field, end, options.read_block_size,
            options.write_block_size, options.ignore_unfinished_uploading, options.additional_filter, options.name,
-           options.solr_keytab, options.solr_principal, options.line_delimited, options.compression,
+           options.solr_keytab, options.solr_principal, options.json_file, options.compression,
            options.hdfs_keytab, options.hdfs_principal, options.hdfs_user, options.hdfs_path, options.key_file_path,
            options.bucket, options.key_prefix, options.local_path)
     else:


[36/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/pom.xml
----------------------------------------------------------------------
diff --cc ambari-web/pom.xml
index 2f6d571,3a6f4f9..bcc0601
--- a/ambari-web/pom.xml
+++ b/ambari-web/pom.xml
@@@ -17,373 -17,366 +17,366 @@@
  -->
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
--  <parent>
--    <groupId>org.apache.ambari</groupId>
--    <artifactId>ambari-project</artifactId>
++    <parent>
++        <groupId>org.apache.ambari</groupId>
++        <artifactId>ambari-project</artifactId>
++        <version>2.0.0.0-SNAPSHOT</version>
++        <relativePath>../ambari-project</relativePath>
++    </parent>
++    <modelVersion>4.0.0</modelVersion>
++    <artifactId>ambari-web</artifactId>
++    <packaging>pom</packaging>
++    <name>Ambari Web</name>
      <version>2.0.0.0-SNAPSHOT</version>
--    <relativePath>../ambari-project</relativePath>
--  </parent>
--  <modelVersion>4.0.0</modelVersion>
--  <artifactId>ambari-web</artifactId>
--  <packaging>pom</packaging>
--  <name>Ambari Web</name>
--  <version>2.0.0.0-SNAPSHOT</version>
--  <description>Ambari Web</description>
--  <properties>
--    <ambari.dir>${project.parent.parent.basedir}</ambari.dir>
--    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
--    <nodemodules.dir>node_modules</nodemodules.dir> <!-- specify -Dnodemodules.dir option to reduce ambari-web build time by not re-downloading npm modules -->
--  </properties>
--  <build>
--    <plugins>
--      <plugin>
--        <groupId>org.codehaus.mojo</groupId>
--        <artifactId>build-helper-maven-plugin</artifactId>
--        <version>1.8</version>
--        <executions>
--          <execution>
--            <id>parse-version</id>
--            <phase>validate</phase>
--            <goals>
--              <goal>parse-version</goal>
--            </goals>
--          </execution>
--          <execution>
--            <id>regex-property</id>
--            <goals>
--              <goal>regex-property</goal>
--            </goals>
--            <configuration>
--              <name>ambariVersion</name>
--              <value>${project.version}</value>
--              <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-).*</regex>
--              <replacement>$1.$2.$3.$4</replacement>
--              <failIfNoMatch>false</failIfNoMatch>
--            </configuration>
--          </execution>
--        </executions>
--      </plugin>
--      <plugin>
--        <artifactId>maven-compiler-plugin</artifactId>
--        <version>3.0</version>
--      </plugin>
--      <plugin>
--        <groupId>org.codehaus.mojo</groupId>
--        <artifactId>rpm-maven-plugin</artifactId>
--        <version>2.0.1</version>
--        <executions>
--          <execution>
--            <!-- unbinds rpm creation from maven lifecycle -->
--            <phase>none</phase>
--            <goals>
--              <goal>attached-rpm</goal>
--            </goals>
--          </execution>
--        </executions>
--        <configuration>
--          <copyright>2012, Apache Software Foundation</copyright>
--          <group>Development</group>
--          <description>Maven Recipe: RPM Package.</description>
--          <mappings/>
--        </configuration>
-       </plugin>
-       <plugin>
-         <groupId>org.codehaus.mojo</groupId>
-         <artifactId>exec-maven-plugin</artifactId>
-         <version>1.2.1</version>
-         <executions>
-           <execution>
-             <id>clean-rmdir</id>
-             <phase>clean</phase>
-             <goals>
-               <goal>exec</goal>
-             </goals>
-             <configuration>
-               <executable>${executable.rmdir}</executable>
-               <workingDirectory>${basedir}</workingDirectory>
-               <commandlineArgs>${args.rm.clean} public ${nodemodules.dir}</commandlineArgs>
-               <successCodes>
-                 <successCode>0</successCode>
-                 <successCode>1</successCode>
-                 <successCode>2</successCode>
-               </successCodes>
-             </configuration>
-           </execution>
-           <execution>
-             <id>clean-mkdir</id>
-             <phase>clean</phase>
-             <goals>
-               <goal>exec</goal>
-             </goals>
-             <configuration>
-               <executable>${executable.mkdir}</executable>
-               <workingDirectory>${basedir}</workingDirectory>
-               <commandlineArgs>${args.mkdir} public</commandlineArgs>
-             </configuration>
-           </execution>
-         </executions>
--      </plugin>
--      <plugin>
--        <groupId>com.github.eirslett</groupId>
--        <artifactId>frontend-maven-plugin</artifactId>
--        <version>1.4</version>
--        <configuration>
--          <nodeVersion>v4.5.0</nodeVersion>
--          <yarnVersion>v0.23.2</yarnVersion>
--          <workingDirectory>${basedir}</workingDirectory>
--          <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven>
--          <!-- setting npm_config_tmp environment variable is a workaround for 
--               https://github.com/Medium/phantomjs/issues/673 -->
--          <environmentVariables>
--            <npm_config_tmp>/tmp/npm_config_tmp</npm_config_tmp>
--          </environmentVariables>
--        </configuration>
--        <executions>
--          <execution>
--            <id>install node and yarn</id>
--            <phase>generate-sources</phase>
--            <goals>
--              <goal>install-node-and-yarn</goal>
--            </goals>
--          </execution>
--          <execution>
--            <id>yarn install</id>
--            <phase>generate-sources</phase>
--            <goals>
--              <goal>yarn</goal>
--            </goals>
--            <configuration>
-               <arguments>install</arguments>
-               <arguments>--ignore-engines</arguments>
 -              <arguments>install --ignore-engines --pure-lockfile</arguments>
--            </configuration>
--          </execution>
--        </executions>
--      </plugin>
--      <plugin>
--        <groupId>org.codehaus.mojo</groupId>
--        <artifactId>exec-maven-plugin</artifactId>
--        <version>1.2.1</version>
--        <executions>
 -          <execution>
 -            <id>clean-rmdir</id>
 -            <phase>clean</phase>
 -            <goals>
 -              <goal>exec</goal>
 -            </goals>
 -            <configuration>
 -              <executable>${executable.rmdir}</executable>
 -              <workingDirectory>${basedir}</workingDirectory>
 -              <commandlineArgs>${args.rm.clean} public ${nodemodules.dir}</commandlineArgs>
 -              <successCodes>
 -                <successCode>0</successCode>
 -                <successCode>1</successCode>
 -                <successCode>2</successCode>
 -              </successCodes>
 -            </configuration>
 -          </execution>
 -          <execution>
 -            <id>clean-mkdir</id>
 -            <phase>clean</phase>
 -            <goals>
 -              <goal>exec</goal>
 -            </goals>
 -            <configuration>
 -              <executable>${executable.mkdir}</executable>
 -              <workingDirectory>${basedir}</workingDirectory>
 -              <commandlineArgs>${args.mkdir} public</commandlineArgs>
 -            </configuration>
 -          </execution>
--          <execution>
--            <id>Brunch build</id>
--            <phase>generate-resources</phase>
--            <goals>
--              <goal>exec</goal>
--            </goals>
--            <configuration>
--              <workingDirectory>${basedir}</workingDirectory>
--              <executable>${basedir}/node/${node.executable}</executable>
--              <arguments>
--                <argument>node_modules/brunch/bin/brunch</argument>
--                <argument>build</argument>
--              </arguments>
--            </configuration>
--          </execution>
--          <execution>
--            <id>set-ambari-version</id>
--            <phase>compile</phase>
--            <goals>
--              <goal>exec</goal>
--            </goals>
--            <configuration>
--              <!-- sets Ambari version to make it accessible from code -->
--              <executable>${executable.shell}</executable>
--              <workingDirectory>${basedir}</workingDirectory>
--              <commandlineArgs>${args.shell} ${basedir}${dirsep}set-ambari-version.${fileextension.shell} ${ambariVersion}</commandlineArgs>
--            </configuration>
--          </execution>
--          <execution>
--            <id>set-default-stack-version</id>
--            <phase>compile</phase>
--            <goals>
--              <goal>exec</goal>
--            </goals>
--            <configuration>
--              <!-- sets default stack and version to use for install -->
--              <executable>${executable.shell}</executable>
--              <workingDirectory>${basedir}</workingDirectory>
--              <commandlineArgs>${args.shell} ${basedir}${dirsep}set-default-stack-version.${fileextension.shell} ${defaultStackVersion}</commandlineArgs>
--            </configuration>
--          </execution>
--          <execution>
--            <id>toggle-experimental</id>
--            <phase>compile</phase>
--            <goals>
--              <goal>exec</goal>
--            </goals>
--            <configuration>
--              <!-- enables experimental features if enableExperimental is set to true -->
--              <executable>${executable.shell}</executable>
--              <workingDirectory>${basedir}</workingDirectory>
--              <commandlineArgs>${args.shell} ${basedir}${dirsep}toggle-experimental.${fileextension.shell} ${enableExperimental}</commandlineArgs>
--            </configuration>
--          </execution>
--          <execution>
--            <id>ambari-web unit tests</id>
--            <phase>test</phase>
--            <goals>
--              <goal>exec</goal>
--            </goals>
--            <configuration>
--              <skip>${skipTests}</skip>
--              <executable>${executable.npm}</executable>
--              <workingDirectory>${basedir}</workingDirectory>
--              <commandlineArgs>${args.npm} test</commandlineArgs>
--            </configuration>
--          </execution>
--        </executions>
--      </plugin>
--      <plugin>
--        <groupId>org.apache.maven.plugins</groupId>
--        <artifactId>maven-antrun-plugin</artifactId>
--        <version>1.7</version>
--        <executions>
--          <execution>
--            <id>gzip ambari-web images</id>
--            <phase>prepare-package</phase>
--            <goals>
--              <goal>run</goal>
--            </goals>
--            <configuration>
--              <tasks>
--                <apply executable="${executable.gzip}">
--                  <arg value="-f"/>
--                  <fileset dir="${basedir}/public/img/">
--                    <patternset>
--                      <include name="**/*.png"/>
--                    </patternset>
--                  </fileset>
--                </apply>
--              </tasks>
--            </configuration>
--          </execution>
--        </executions>
--      </plugin>
--      <plugin>
--        <groupId>org.apache.rat</groupId>
--        <artifactId>apache-rat-plugin</artifactId>
--        <configuration>
--          <excludes>
--            <exclude>.idea/**</exclude>
--            <exclude>package.json</exclude>
--            <exclude>public/**</exclude>
--            <exclude>public-static/**</exclude>
--            <exclude>app/assets/**</exclude>
 -            <exclude>api-docs/**</exclude>
--            <exclude>vendor/**</exclude>
--            <exclude>node_modules/**</exclude>
--            <exclude>node/**</exclude>
--            <exclude>npm-debug.log</exclude>
--            <exclude>yarn.lock</exclude>
--          </excludes>
--        </configuration>
--        <executions>
--          <execution>
--            <phase>test</phase>
--            <goals>
--              <goal>check</goal>
--            </goals>
--          </execution>
--        </executions>
--      </plugin>
--      <plugin>
--        <groupId>org.vafer</groupId>
--        <artifactId>jdeb</artifactId>
--        <version>1.0.1</version>
--        <executions>
--          <execution>
--            <phase>none</phase>
--            <goals>
--              <goal>jdeb</goal>
--            </goals>
--          </execution>
--        </executions>
--        <configuration>
--          <skip>true</skip>
--          <submodules>false</submodules>
--        </configuration>
--      </plugin>
--    </plugins>
--  </build>
--  <profiles>
--    <profile>
--      <id>windows</id>
--      <activation>
--        <os>
--          <family>win</family>
--        </os>
--      </activation>
--      <properties>
--        <envClassifier>win</envClassifier>
--        <dirsep>\</dirsep>
--        <executable.brunch>cmd</executable.brunch>
--        <executable.gzip>${basedir}\gzip-content.cmd</executable.gzip>
--        <args.brunch>/C brunch</args.brunch>
--        <node.executable>node.exe</node.executable>
--        <executable.mkdir>cmd</executable.mkdir>
--        <args.mkdir>/C mkdir</args.mkdir>
--        <executable.npm>cmd</executable.npm>
--        <args.npm>/C npm</args.npm>
--        <executable.rmdir>cmd</executable.rmdir>
--        <args.rm.clean>/C rmdir /S /Q</args.rm.clean>
--        <executable.shell>cmd</executable.shell>
--        <fileextension.shell>cmd</fileextension.shell>
--        <args.shell>/C</args.shell>
--      </properties>
--    </profile>
--    <profile>
--      <id>linux</id>
--      <activation>
--        <os>
--          <family>unix</family>
--        </os>
--      </activation>
--      <properties>
--        <envClassifier>linux</envClassifier>
--        <dirsep>/</dirsep>
--        <executable.brunch>brunch</executable.brunch>
--        <executable.gzip>gzip</executable.gzip>
--        <args.brunch></args.brunch>
--        <node.executable>node</node.executable>
--        <executable.mkdir>mkdir</executable.mkdir>
--        <args.mkdir></args.mkdir>
--        <executable.npm>npm</executable.npm>
--        <args.npm></args.npm>
--        <executable.rmdir>rm</executable.rmdir>
--        <args.rm.clean>-rf</args.rm.clean>
--        <executable.shell>sh</executable.shell>
--        <fileextension.shell>sh</fileextension.shell>
--        <args.shell></args.shell>
--      </properties>
--    </profile>
--    <profile>
--      <id>pluggable-stack-definition</id>
--      <activation>
--        <activeByDefault>false</activeByDefault>
--      </activation>
--      <build>
++    <description>Ambari Web</description>
++    <properties>
++        <ambari.dir>${project.parent.parent.basedir}</ambari.dir>
++        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
++        <nodemodules.dir>node_modules</nodemodules.dir> <!-- specify -Dnodemodules.dir option to reduce ambari-web build time by not re-downloading npm modules -->
++    </properties>
++    <build>
          <plugins>
--          <plugin>
--            <groupId>org.codehaus.mojo</groupId>
--            <artifactId>exec-maven-plugin</artifactId>
--            <version>1.2.1</version>
--            <executions>
--              <execution>
--                <id>copy-pluggable-stack-resources</id>
--                <phase>initialize</phase>
--                <goals>
--                  <goal>exec</goal>
--                </goals>
++            <plugin>
++                <groupId>org.codehaus.mojo</groupId>
++                <artifactId>build-helper-maven-plugin</artifactId>
++                <version>1.8</version>
++                <executions>
++                    <execution>
++                        <id>parse-version</id>
++                        <phase>validate</phase>
++                        <goals>
++                            <goal>parse-version</goal>
++                        </goals>
++                    </execution>
++                    <execution>
++                        <id>regex-property</id>
++                        <goals>
++                            <goal>regex-property</goal>
++                        </goals>
++                        <configuration>
++                            <name>ambariVersion</name>
++                            <value>${project.version}</value>
++                            <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-).*</regex>
++                            <replacement>$1.$2.$3.$4</replacement>
++                            <failIfNoMatch>false</failIfNoMatch>
++                        </configuration>
++                    </execution>
++                </executions>
++            </plugin>
++            <plugin>
++                <artifactId>maven-compiler-plugin</artifactId>
++                <version>3.0</version>
++            </plugin>
++            <plugin>
++                <groupId>org.codehaus.mojo</groupId>
++                <artifactId>rpm-maven-plugin</artifactId>
++                <version>2.0.1</version>
++                <executions>
++                    <execution>
++                        <!-- unbinds rpm creation from maven lifecycle -->
++                        <phase>none</phase>
++                        <goals>
++                            <goal>attached-rpm</goal>
++                        </goals>
++                    </execution>
++                </executions>
                  <configuration>
--                  <!-- Copy stack specific UI resources -->
--                  <executable>${executable.shell}</executable>
--                  <workingDirectory>${basedir}</workingDirectory>
--                  <commandlineArgs>${args.shell} ${basedir}${dirsep}copy-pluggable-stack-resources.${fileextension.shell} ${stack.distribution}</commandlineArgs>
++                    <copyright>2012, Apache Software Foundation</copyright>
++                    <group>Development</group>
++                    <description>Maven Recipe: RPM Package.</description>
++                    <mappings/>
                  </configuration>
--              </execution>
--            </executions>
--          </plugin>
++            </plugin>
++            <plugin>
++                <groupId>com.github.eirslett</groupId>
++                <artifactId>frontend-maven-plugin</artifactId>
++                <version>1.4</version>
++                <configuration>
++                    <nodeVersion>v4.5.0</nodeVersion>
++                    <yarnVersion>v0.23.2</yarnVersion>
++                    <workingDirectory>${basedir}</workingDirectory>
++                    <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven>
++                    <!-- setting npm_config_tmp environment variable is a workaround for
++                         https://github.com/Medium/phantomjs/issues/673 -->
++                    <environmentVariables>
++                        <npm_config_tmp>/tmp/npm_config_tmp</npm_config_tmp>
++                    </environmentVariables>
++                </configuration>
++                <executions>
++                    <execution>
++                        <id>install node and yarn</id>
++                        <phase>generate-sources</phase>
++                        <goals>
++                            <goal>install-node-and-yarn</goal>
++                        </goals>
++                    </execution>
++                    <execution>
++                        <id>yarn install</id>
++                        <phase>generate-sources</phase>
++                        <goals>
++                            <goal>yarn</goal>
++                        </goals>
++                        <configuration>
++                            <arguments>install --ignore-engines --pure-lockfile</arguments>
++                        </configuration>
++                    </execution>
++                </executions>
++            </plugin>
++            <plugin>
++                <groupId>org.codehaus.mojo</groupId>
++                <artifactId>exec-maven-plugin</artifactId>
++                <version>1.2.1</version>
++                <executions>
++                    <execution>
++                        <id>clean-rmdir</id>
++                        <phase>clean</phase>
++                        <goals>
++                            <goal>exec</goal>
++                        </goals>
++                        <configuration>
++                            <executable>${executable.rmdir}</executable>
++                            <workingDirectory>${basedir}</workingDirectory>
++                            <commandlineArgs>${args.rm.clean} public ${nodemodules.dir}</commandlineArgs>
++                            <successCodes>
++                                <successCode>0</successCode>
++                                <successCode>1</successCode>
++                                <successCode>2</successCode>
++                            </successCodes>
++                        </configuration>
++                    </execution>
++                    <execution>
++                        <id>clean-mkdir</id>
++                        <phase>clean</phase>
++                        <goals>
++                            <goal>exec</goal>
++                        </goals>
++                        <configuration>
++                            <executable>${executable.mkdir}</executable>
++                            <workingDirectory>${basedir}</workingDirectory>
++                            <commandlineArgs>${args.mkdir} public</commandlineArgs>
++                        </configuration>
++                    </execution>
++                    <execution>
++                        <id>Brunch build</id>
++                        <phase>generate-resources</phase>
++                        <goals>
++                            <goal>exec</goal>
++                        </goals>
++                        <configuration>
++                            <workingDirectory>${basedir}</workingDirectory>
++                            <executable>${basedir}/node/${node.executable}</executable>
++                            <arguments>
++                                <argument>node_modules/brunch/bin/brunch</argument>
++                                <argument>build</argument>
++                            </arguments>
++                        </configuration>
++                    </execution>
++                    <execution>
++                        <id>set-ambari-version</id>
++                        <phase>compile</phase>
++                        <goals>
++                            <goal>exec</goal>
++                        </goals>
++                        <configuration>
++                            <!-- sets Ambari version to make it accessible from code -->
++                            <executable>${executable.shell}</executable>
++                            <workingDirectory>${basedir}</workingDirectory>
++                            <commandlineArgs>${args.shell} ${basedir}${dirsep}set-ambari-version.${fileextension.shell} ${ambariVersion}</commandlineArgs>
++                        </configuration>
++                    </execution>
++                    <execution>
++                        <id>set-default-stack-version</id>
++                        <phase>compile</phase>
++                        <goals>
++                            <goal>exec</goal>
++                        </goals>
++                        <configuration>
++                            <!-- sets default stack and version to use for install -->
++                            <executable>${executable.shell}</executable>
++                            <workingDirectory>${basedir}</workingDirectory>
++                            <commandlineArgs>${args.shell} ${basedir}${dirsep}set-default-stack-version.${fileextension.shell} ${defaultStackVersion}</commandlineArgs>
++                        </configuration>
++                    </execution>
++                    <execution>
++                        <id>toggle-experimental</id>
++                        <phase>compile</phase>
++                        <goals>
++                            <goal>exec</goal>
++                        </goals>
++                        <configuration>
++                            <!-- enables experimental features if enableExperimental is set to true -->
++                            <executable>${executable.shell}</executable>
++                            <workingDirectory>${basedir}</workingDirectory>
++                            <commandlineArgs>${args.shell} ${basedir}${dirsep}toggle-experimental.${fileextension.shell} ${enableExperimental}</commandlineArgs>
++                        </configuration>
++                    </execution>
++                    <execution>
++                        <id>ambari-web unit tests</id>
++                        <phase>test</phase>
++                        <goals>
++                            <goal>exec</goal>
++                        </goals>
++                        <configuration>
++                            <skip>${skipTests}</skip>
++                            <executable>${executable.npm}</executable>
++                            <workingDirectory>${basedir}</workingDirectory>
++                            <commandlineArgs>${args.npm} test</commandlineArgs>
++                        </configuration>
++                    </execution>
++                </executions>
++            </plugin>
++            <plugin>
++                <groupId>org.apache.maven.plugins</groupId>
++                <artifactId>maven-antrun-plugin</artifactId>
++                <version>1.7</version>
++                <executions>
++                    <execution>
++                        <id>gzip ambari-web images</id>
++                        <phase>prepare-package</phase>
++                        <goals>
++                            <goal>run</goal>
++                        </goals>
++                        <configuration>
++                            <tasks>
++                                <apply executable="${executable.gzip}">
++                                    <arg value="-f"/>
++                                    <fileset dir="${basedir}/public/img/">
++                                        <patternset>
++                                            <include name="**/*.png"/>
++                                        </patternset>
++                                    </fileset>
++                                </apply>
++                            </tasks>
++                        </configuration>
++                    </execution>
++                </executions>
++            </plugin>
++            <plugin>
++                <groupId>org.apache.rat</groupId>
++                <artifactId>apache-rat-plugin</artifactId>
++                <configuration>
++                    <excludes>
++                        <exclude>.idea/**</exclude>
++                        <exclude>package.json</exclude>
++                        <exclude>public/**</exclude>
++                        <exclude>public-static/**</exclude>
++                        <exclude>app/assets/**</exclude>
++                        <exclude>api-docs/**</exclude>
++                        <exclude>vendor/**</exclude>
++                        <exclude>node_modules/**</exclude>
++                        <exclude>node/**</exclude>
++                        <exclude>npm-debug.log</exclude>
++                        <exclude>yarn.lock</exclude>
++                    </excludes>
++                </configuration>
++                <executions>
++                    <execution>
++                        <phase>test</phase>
++                        <goals>
++                            <goal>check</goal>
++                        </goals>
++                    </execution>
++                </executions>
++            </plugin>
++            <plugin>
++                <groupId>org.vafer</groupId>
++                <artifactId>jdeb</artifactId>
++                <version>1.0.1</version>
++                <executions>
++                    <execution>
++                        <phase>none</phase>
++                        <goals>
++                            <goal>jdeb</goal>
++                        </goals>
++                    </execution>
++                </executions>
++                <configuration>
++                    <skip>true</skip>
++                    <submodules>false</submodules>
++                </configuration>
++            </plugin>
          </plugins>
--      </build>
--    </profile>
--  </profiles>
++    </build>
++    <profiles>
++        <profile>
++            <id>windows</id>
++            <activation>
++                <os>
++                    <family>win</family>
++                </os>
++            </activation>
++            <properties>
++                <envClassifier>win</envClassifier>
++                <dirsep>\</dirsep>
++                <executable.brunch>cmd</executable.brunch>
++                <executable.gzip>${basedir}\gzip-content.cmd</executable.gzip>
++                <args.brunch>/C brunch</args.brunch>
++                <node.executable>node.exe</node.executable>
++                <executable.mkdir>cmd</executable.mkdir>
++                <args.mkdir>/C mkdir</args.mkdir>
++                <executable.npm>cmd</executable.npm>
++                <args.npm>/C npm</args.npm>
++                <executable.rmdir>cmd</executable.rmdir>
++                <args.rm.clean>/C rmdir /S /Q</args.rm.clean>
++                <executable.shell>cmd</executable.shell>
++                <fileextension.shell>cmd</fileextension.shell>
++                <args.shell>/C</args.shell>
++            </properties>
++        </profile>
++        <profile>
++            <id>linux</id>
++            <activation>
++                <os>
++                    <family>unix</family>
++                </os>
++            </activation>
++            <properties>
++                <envClassifier>linux</envClassifier>
++                <dirsep>/</dirsep>
++                <executable.brunch>brunch</executable.brunch>
++                <executable.gzip>gzip</executable.gzip>
++                <args.brunch></args.brunch>
++                <node.executable>node</node.executable>
++                <executable.mkdir>mkdir</executable.mkdir>
++                <args.mkdir></args.mkdir>
++                <executable.npm>npm</executable.npm>
++                <args.npm></args.npm>
++                <executable.rmdir>rm</executable.rmdir>
++                <args.rm.clean>-rf</args.rm.clean>
++                <executable.shell>sh</executable.shell>
++                <fileextension.shell>sh</fileextension.shell>
++                <args.shell></args.shell>
++            </properties>
++        </profile>
++        <profile>
++            <id>pluggable-stack-definition</id>
++            <activation>
++                <activeByDefault>false</activeByDefault>
++            </activation>
++            <build>
++                <plugins>
++                    <plugin>
++                        <groupId>org.codehaus.mojo</groupId>
++                        <artifactId>exec-maven-plugin</artifactId>
++                        <version>1.2.1</version>
++                        <executions>
++                            <execution>
++                                <id>copy-pluggable-stack-resources</id>
++                                <phase>initialize</phase>
++                                <goals>
++                                    <goal>exec</goal>
++                                </goals>
++                                <configuration>
++                                    <!-- Copy stack specific UI resources -->
++                                    <executable>${executable.shell}</executable>
++                                    <workingDirectory>${basedir}</workingDirectory>
++                                    <commandlineArgs>${args.shell} ${basedir}${dirsep}copy-pluggable-stack-resources.${fileextension.shell} ${stack.distribution}</commandlineArgs>
++                                </configuration>
++                            </execution>
++                        </executions>
++                    </plugin>
++                </plugins>
++            </build>
++        </profile>
++    </profiles>
  </project>

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/test/controllers/global/cluster_controller_test.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/test/controllers/main/host/details_test.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/test/controllers/main/service_test.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-web/test/views/main/dashboard/config_history_view_test.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/pom.xml
----------------------------------------------------------------------


[44/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
index 5e0d707,eb39562..67f23ac
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
@@@ -165,17 -200,100 +200,100 @@@ public class AmbariContext 
      return getController().getActionManager().getTasks(ids);
    }
  
-   public void createAmbariResources(ClusterTopology topology, String clusterName, SecurityType securityType, String repoVersion) {
+   public void createAmbariResources(ClusterTopology topology, String clusterName, SecurityType securityType,
+                                     String repoVersionString, Long repoVersionId) {
      Stack stack = topology.getBlueprint().getStack();
+     StackId stackId = new StackId(stack.getName(), stack.getVersion());
+ 
+     RepositoryVersionEntity repoVersion = null;
 -    if (StringUtils.isEmpty(repoVersionString) && null == repoVersionId) {
++    if (null == repoVersionString && null == repoVersionId) {
+       List<RepositoryVersionEntity> stackRepoVersions = repositoryVersionDAO.findByStack(stackId);
+ 
+       if (stackRepoVersions.isEmpty()) {
+         // !!! no repos, try to get the version for the stack
+         VersionDefinitionResourceProvider vdfProvider = getVersionDefinitionResourceProvider();
+ 
+         Map<String, Object> properties = new HashMap<>();
+         properties.put(VersionDefinitionResourceProvider.VERSION_DEF_AVAILABLE_DEFINITION, stackId.toString());
+ 
+         Request request = new RequestImpl(Collections.<String>emptySet(),
+             Collections.singleton(properties), Collections.<String, String>emptyMap(), null);
+ 
+         Long defaultRepoVersionId = null;
+ 
+         try {
+           RequestStatus requestStatus = vdfProvider.createResources(request);
+           if (!requestStatus.getAssociatedResources().isEmpty()) {
+             Resource resource = requestStatus.getAssociatedResources().iterator().next();
+             defaultRepoVersionId = (Long) resource.getPropertyValue(VersionDefinitionResourceProvider.VERSION_DEF_ID);
+           }
+         } catch (Exception e) {
+           throw new IllegalArgumentException(String.format(
+               "Failed to create a default repository version definition for stack %s. "
+               + "This typically is a result of not loading the stack correctly or being able "
+               + "to load information about released versions.  Create a repository version "
+               + " and try again.", stackId), e);
+         }
+ 
+         repoVersion = repositoryVersionDAO.findByPK(defaultRepoVersionId);
+         // !!! better not!
+         if (null == repoVersion) {
+           throw new IllegalArgumentException(String.format(
+               "Failed to load the default repository version definition for stack %s. "
+               + "Check for a valid repository version and try again.", stackId));
+         }
+ 
+       } else if (stackRepoVersions.size() > 1) {
+ 
+         Function<RepositoryVersionEntity, String> function = new Function<RepositoryVersionEntity, String>() {
+           @Override
+           public String apply(RepositoryVersionEntity input) {
+             return input.getVersion();
+           }
+         };
+ 
+         Collection<String> versions = Collections2.transform(stackRepoVersions, function);
  
-     createAmbariClusterResource(clusterName, stack.getName(), stack.getVersion(), securityType, repoVersion);
-     createAmbariServiceAndComponentResources(topology, clusterName);
+         throw new IllegalArgumentException(String.format("Several repositories were found for %s:  %s.  Specify the version"
+             + " with '%s'", stackId, StringUtils.join(versions, ", "), ProvisionClusterRequest.REPO_VERSION_PROPERTY));
+       } else {
+         repoVersion = stackRepoVersions.get(0);
+         LOG.warn("Cluster is being provisioned using the single matching repository version {}", repoVersion.getVersion());
+       }
+     } else if (null != repoVersionId){
+       repoVersion = repositoryVersionDAO.findByPK(repoVersionId);
+ 
+       if (null == repoVersion) {
+         throw new IllegalArgumentException(String.format(
+           "Could not identify repository version with repository version id %s for installing services. "
+             + "Specify a valid repository version id with '%s'",
+           repoVersionId, ProvisionClusterRequest.REPO_VERSION_ID_PROPERTY));
+       }
+     } else {
+       repoVersion = repositoryVersionDAO.findByStackAndVersion(stackId, repoVersionString);
+ 
+       if (null == repoVersion) {
+         throw new IllegalArgumentException(String.format(
+           "Could not identify repository version with stack %s and version %s for installing services. "
+             + "Specify a valid version with '%s'",
+           stackId, repoVersionString, ProvisionClusterRequest.REPO_VERSION_PROPERTY));
+       }
+     }
+ 
+     // only use a STANDARD repo when creating a new cluster
+     if (repoVersion.getType() != RepositoryType.STANDARD) {
+       throw new IllegalArgumentException(String.format(
+           "Unable to create a cluster using the following repository since it is not a STANDARD type: %s",
+           repoVersion));
+     }
+ 
+     createAmbariClusterResource(clusterName, stack.getName(), stack.getVersion(), securityType);
+     createAmbariServiceAndComponentResources(topology, clusterName, stackId, repoVersion.getId());
    }
  
-   public void createAmbariClusterResource(String clusterName, String stackName, String stackVersion, SecurityType securityType, String repoVersion) {
+   public void createAmbariClusterResource(String clusterName, String stackName, String stackVersion, SecurityType securityType) {
      String stackInfo = String.format("%s-%s", stackName, stackVersion);
      final ClusterRequest clusterRequest = new ClusterRequest(null, clusterName, null, securityType, stackInfo, null);
-     clusterRequest.setRepositoryVersion(repoVersion);
  
      try {
        RetryHelper.executeWithRetry(new Callable<Object>() {
@@@ -702,4 -840,14 +840,14 @@@
      }
      return componentResourceProvider;
    }
+ 
+   private synchronized VersionDefinitionResourceProvider getVersionDefinitionResourceProvider() {
+     if (versionDefinitionResourceProvider == null) {
+       versionDefinitionResourceProvider = (VersionDefinitionResourceProvider) ClusterControllerHelper.
+           getClusterController().ensureResourceProvider(Resource.Type.VersionDefinition);
+     }
+     return versionDefinitionResourceProvider;
+ 
+   }
+ 
 -}
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
index 643945c,9769fae..0863e37
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
@@@ -29,12 -29,11 +29,10 @@@ import java.util.List
  import java.util.Map;
  import java.util.Set;
  import java.util.concurrent.Callable;
 +import java.util.concurrent.Executor;
  import java.util.concurrent.ExecutorService;
  import java.util.concurrent.Executors;
 -import java.util.concurrent.LinkedBlockingQueue;
 -import java.util.concurrent.TimeUnit;
  
- import javax.inject.Inject;
- 
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.actionmanager.HostRoleCommand;
  import org.apache.ambari.server.actionmanager.HostRoleStatus;
@@@ -80,6 -80,7 +78,8 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import com.google.common.eventbus.Subscribe;
+ import com.google.inject.Inject;
++import com.google.inject.Injector;
  import com.google.inject.Singleton;
  import com.google.inject.persist.Transactional;
  
@@@ -116,6 -131,6 +116,9 @@@ public class TopologyManager 
    private Map<Long, ClusterTopology> clusterTopologyMap = new HashMap<>();
  
    @Inject
++  private Injector injector;
++
++  @Inject
    private StackAdvisorBlueprintProcessor stackAdvisorBlueprintProcessor;
  
    @Inject
@@@ -273,6 -287,6 +277,10 @@@
      SecurityType securityType = null;
      Credential credential = null;
  
++    if (null == repoVersion && null == repoVersionID) {
++      throw new AmbariException("Repository should be created and the version passed in the request.");
++    }
++
      SecurityConfiguration securityConfiguration = processSecurityConfiguration(request);
  
      if (securityConfiguration != null && securityConfiguration.getType() == SecurityType.KERBEROS) {
@@@ -324,16 -343,6 +333,15 @@@
      addClusterConfigRequest(topology, new ClusterConfigurationRequest(ambariContext, topology, true,
        stackAdvisorBlueprintProcessor, securityType == SecurityType.KERBEROS));
  
- 
 +    // Notify listeners that cluster configuration finished
 +    executor.submit(new Callable<Boolean>() {
 +      @Override
 +      public Boolean call() throws Exception {
 +        ambariEventPublisher.publish(new ClusterConfigFinishedEvent(clusterName));
 +        return Boolean.TRUE;
 +      }
 +    });
 +
      // Process the logical request
      processRequest(request, topology, logicalRequest);
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTask.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/topology/tasks/ConfigureClusterTaskFactory.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
index 1f1c647,a2e2f6f..83707ed
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
@@@ -42,9 -42,9 +42,11 @@@ import javax.persistence.EntityManager
  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  
+ import org.apache.ambari.annotations.Experimental;
+ import org.apache.ambari.annotations.ExperimentalFeature;
  import org.apache.ambari.server.AmbariException;
 +import org.apache.ambari.server.agent.stomp.AgentConfigsHolder;
 +import org.apache.ambari.server.agent.stomp.MetadataHolder;
  import org.apache.ambari.server.api.services.AmbariMetaInfo;
  import org.apache.ambari.server.configuration.Configuration;
  import org.apache.ambari.server.configuration.Configuration.DatabaseType;
@@@ -105,14 -105,6 +108,12 @@@ public abstract class AbstractUpgradeCa
    protected DBAccessor dbAccessor;
    @Inject
    protected Configuration configuration;
 +  @Inject
-   protected StackUpgradeUtil stackUpgradeUtil;
-   @Inject
 +  protected Provider<AgentConfigsHolder> m_agentConfigsHolder;
 +  @Inject
 +  protected Provider<MetadataHolder> m_metadataHolder;
 +  @Inject
 +  protected AmbariManagementControllerImpl ambariManagementController;
  
    protected Injector injector;
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
index 0000000,c31469e..d1de998
mode 000000,100644..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
@@@ -1,0 -1,827 +1,498 @@@
 -/*
++/**
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
 - *
 - *     http://www.apache.org/licenses/LICENSE-2.0
 - *
++ * <p>
++ * http://www.apache.org/licenses/LICENSE-2.0
++ * <p>
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.ambari.server.upgrade;
+ 
+ import static org.apache.ambari.server.view.ViewContextImpl.CORE_SITE;
+ 
+ import java.sql.SQLException;
+ import java.util.ArrayList;
 -import java.util.Arrays;
 -import java.util.Collections;
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import javax.persistence.EntityManager;
+ import javax.persistence.Query;
+ 
+ import org.apache.ambari.server.AmbariException;
 -import org.apache.ambari.server.controller.AmbariManagementController;
+ import org.apache.ambari.server.orm.DBAccessor;
 -import org.apache.ambari.server.orm.dao.ArtifactDAO;
 -import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 -import org.apache.ambari.server.orm.entities.ArtifactEntity;
+ import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+ import org.apache.ambari.server.state.Cluster;
+ import org.apache.ambari.server.state.Clusters;
+ import org.apache.ambari.server.state.Config;
 -import org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptor;
 -import org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptorContainer;
 -import org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor;
 -import org.apache.ambari.server.state.kerberos.KerberosDescriptor;
 -import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory;
 -import org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor;
 -import org.apache.ambari.server.state.kerberos.KerberosPrincipalDescriptor;
 -import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor;
+ import org.apache.commons.lang.StringUtils;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ 
+ import com.google.inject.Inject;
+ import com.google.inject.Injector;
+ 
+ /**
+  * The {@link org.apache.ambari.server.upgrade.UpgradeCatalog260} upgrades Ambari from 2.5.2 to 2.6.0.
+  */
+ public class UpgradeCatalog260 extends AbstractUpgradeCatalog {
+ 
+   public static final String CLUSTER_CONFIG_MAPPING_TABLE = "clusterconfigmapping";
+   public static final String CLUSTER_VERSION_TABLE = "cluster_version";
+   public static final String CLUSTER_ID_COLUMN = "cluster_id";
+   public static final String STATE_COLUMN = "state";
+   public static final String CREATE_TIMESTAMP_COLUMN = "create_timestamp";
+   public static final String VERSION_TAG_COLUMN = "version_tag";
+   public static final String TYPE_NAME_COLUMN = "type_name";
+ 
+   public static final String CLUSTER_CONFIG_TABLE = "clusterconfig";
+   public static final String SELECTED_COLUMN = "selected";
+   public static final String SERVICE_DELETED_COLUMN = "service_deleted";
+   public static final String UNMAPPED_COLUMN = "unmapped";
+   public static final String SELECTED_TIMESTAMP_COLUMN = "selected_timestamp";
+ 
+   public static final String SERVICE_COMPONENT_DESIRED_STATE_TABLE = "servicecomponentdesiredstate";
+   public static final String DESIRED_STACK_ID_COLUMN = "desired_stack_id";
+   public static final String DESIRED_VERSION_COLUMN = "desired_version";
+   public static final String DESIRED_REPO_VERSION_ID_COLUMN = "desired_repo_version_id";
+   public static final String REPO_STATE_COLUMN = "repo_state";
+   public static final String FK_SCDS_DESIRED_STACK_ID = "FK_scds_desired_stack_id";
+   public static final String FK_SCDS_DESIRED_REPO_ID = "FK_scds_desired_repo_id";
+ 
+   public static final String REPO_VERSION_TABLE = "repo_version";
+   public static final String REPO_VERSION_ID_COLUMN = "repo_version_id";
 -  public static final String REPO_VERSION_RESOLVED_COLUMN = "resolved";
+   public static final String REPO_VERSION_HIDDEN_COLUMN = "hidden";
+ 
+   public static final String HOST_COMPONENT_DESIRED_STATE_TABLE = "hostcomponentdesiredstate";
+   public static final String FK_HCDS_DESIRED_STACK_ID = "FK_hcds_desired_stack_id";
+ 
+   public static final String HOST_COMPONENT_STATE_TABLE = "hostcomponentstate";
+   public static final String CURRENT_STACK_ID_COLUMN = "current_stack_id";
+   public static final String FK_HCS_CURRENT_STACK_ID = "FK_hcs_current_stack_id";
+ 
+   public static final String HOST_VERSION_TABLE = "host_version";
+   public static final String UQ_HOST_REPO = "UQ_host_repo";
+   public static final String HOST_ID_COLUMN = "host_id";
+ 
+   public static final String SERVICE_DESIRED_STATE_TABLE = "servicedesiredstate";
+   public static final String FK_SDS_DESIRED_STACK_ID = "FK_sds_desired_stack_id";
+   public static final String FK_REPO_VERSION_ID = "FK_repo_version_id";
+ 
+   public static final String UPGRADE_TABLE = "upgrade";
+   public static final String UPGRADE_GROUP_TABLE = "upgrade_group";
+   public static final String UPGRADE_ITEM_TABLE = "upgrade_item";
+   public static final String FROM_REPO_VERSION_ID_COLUMN = "from_repo_version_id";
+   public static final String TO_REPO_VERSION_ID_COLUMN = "to_repo_version_id";
+   public static final String ORCHESTRATION_COLUMN = "orchestration";
+   public static final String ALLOW_REVERT_COLUMN = "revert_allowed";
+   public static final String FK_UPGRADE_FROM_REPO_ID = "FK_upgrade_from_repo_id";
+   public static final String FK_UPGRADE_TO_REPO_ID = "FK_upgrade_to_repo_id";
+   public static final String FK_UPGRADE_REPO_VERSION_ID = "FK_upgrade_repo_version_id";
 -  public static final String UPGRADE_ITEM_ITEM_TEXT = "item_text";
+ 
+   public static final String SERVICE_COMPONENT_HISTORY_TABLE = "servicecomponent_history";
+   public static final String UPGRADE_HISTORY_TABLE = "upgrade_history";
+   public static final String ID_COLUMN = "id";
+   public static final String UPGRADE_ID_COLUMN = "upgrade_id";
+   public static final String SERVICE_NAME_COLUMN = "service_name";
+   public static final String COMPONENT_NAME_COLUMN = "component_name";
+   public static final String TARGET_REPO_VERSION_ID_COLUMN = "target_repo_version_id";
+   public static final String PK_UPGRADE_HIST = "PK_upgrade_hist";
+   public static final String FK_UPGRADE_HIST_UPGRADE_ID = "FK_upgrade_hist_upgrade_id";
+   public static final String FK_UPGRADE_HIST_FROM_REPO = "FK_upgrade_hist_from_repo";
+   public static final String FK_UPGRADE_HIST_TARGET_REPO = "FK_upgrade_hist_target_repo";
+   public static final String UQ_UPGRADE_HIST = "UQ_upgrade_hist";
+   public static final String SERVICE_CONFIG_MAPPING_TABLE = "serviceconfigmapping";
+   public static final String SERVICE_COMPONENT_DESIRED_STATE = "servicecomponentdesiredstate";
+   public static final String HOST_COMPONENT_DESIRED_STATE = "hostcomponentdesiredstate";
+   public static final String HOST_COMPONENT_STATE = "hostcomponentstate";
+ 
 -  public static final String AMS_SSL_CLIENT = "ams-ssl-client";
 -  public static final String METRIC_TRUSTSTORE_ALIAS = "ssl.client.truststore.alias";
 -
+   /**
+    * Logger.
+    */
+   private static final Logger LOG = LoggerFactory.getLogger(UpgradeCatalog260.class);
+   public static final String STANDARD = "STANDARD";
+   public static final String NOT_REQUIRED = "NOT_REQUIRED";
+   public static final String CURRENT = "CURRENT";
+   public static final String SELECTED = "1";
 -  public static final String VIEWURL_TABLE = "viewurl";
 -  public static final String PK_VIEWURL = "PK_viewurl";
 -  public static final String URL_ID_COLUMN = "url_id";
 -  public static final String STALE_POSTGRESS_VIEWURL_PKEY = "viewurl_pkey";
 -  public static final String USERS_TABLE = "users";
 -  public static final String STALE_POSTGRESS_USERS_LDAP_USER_KEY = "users_ldap_user_key";
+ 
+ 
+   /**
+    * Constructor.
+    *
+    * @param injector
+    */
+   @Inject
+   public UpgradeCatalog260(Injector injector) {
+     super(injector);
+   }
+ 
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String getSourceVersion()
+   {
+     return "2.5.2";
+   }
+ 
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String getTargetVersion() {
+     return "2.6.0";
+   }
+ 
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   protected void executeDDLUpdates() throws AmbariException, SQLException {
+     int currentVersionID = getCurrentVersionID();
+     updateServiceComponentDesiredStateTable(currentVersionID);
+     updateServiceDesiredStateTable(currentVersionID);
+     addSelectedCollumsToClusterconfigTable();
+     updateHostComponentDesiredStateTable();
+     updateHostComponentStateTable();
+     dropStaleTables();
+     updateUpgradeTable();
+     createUpgradeHistoryTable();
+     updateRepositoryVersionTable();
+     renameServiceDeletedColumn();
 -    expandUpgradeItemItemTextColumn();
 -    addViewUrlPKConstraint();
 -    removeStaleConstraints();
 -  }
 -
 -
 -  /**
 -   * Updates {@value #VIEWURL_TABLE} table.
 -   * Adds the {@value #PK_VIEWURL} constraint.
 -   */
 -  private void addViewUrlPKConstraint() throws SQLException {
 -    dbAccessor.dropPKConstraint(VIEWURL_TABLE, STALE_POSTGRESS_VIEWURL_PKEY);
 -    dbAccessor.addPKConstraint(VIEWURL_TABLE, PK_VIEWURL, URL_ID_COLUMN);
 -  }
 -
 -  /**
 -   * remove stale unnamed constraints
 -   */
 -  private void removeStaleConstraints() throws SQLException {
 -    dbAccessor.dropUniqueConstraint(USERS_TABLE, STALE_POSTGRESS_USERS_LDAP_USER_KEY);
 -  }
 -
 -  /**
 -   * Expand item_text column of upgrade_item
 -   */
 -  private void expandUpgradeItemItemTextColumn() throws SQLException {
 -    dbAccessor.changeColumnType(UPGRADE_ITEM_TABLE, UPGRADE_ITEM_ITEM_TEXT,
 -      String.class, char[].class);
+   }
+ 
+   private void renameServiceDeletedColumn() throws AmbariException, SQLException {
+     if (dbAccessor.tableHasColumn(CLUSTER_CONFIG_TABLE, SERVICE_DELETED_COLUMN)) {
+       dbAccessor.renameColumn(CLUSTER_CONFIG_TABLE, SERVICE_DELETED_COLUMN, new DBAccessor.DBColumnInfo(UNMAPPED_COLUMN, Short.class, null, 0, false));
+     }
+   }
+ 
+   /*
+   * This method, search for configs which are not linked with any service
+   * and set "unmapped" to true. We need that because in case when
+   * config is not mapped and "unmapped" flag = false, db consistency check
+   * will show warning about not mapped config. (AMBARI-21795)
+   * */
+   private void setUnmappedForOrphanedConfigs() {
+     executeInTransaction(new Runnable() {
+       @Override
+       public void run() {
+         EntityManager entityManager = getEntityManagerProvider().get();
+         Query query = entityManager.createNamedQuery("ClusterConfigEntity.findNotMappedClusterConfigsToService",ClusterConfigEntity.class);
+ 
+         List<ClusterConfigEntity> notMappedConfigs =  query.getResultList();
+         if (notMappedConfigs != null) {
+           for (ClusterConfigEntity clusterConfigEntity : notMappedConfigs) {
+             clusterConfigEntity.setUnmapped(true);
+             entityManager.merge(clusterConfigEntity);
+           }
+         }
+       }
+     });
+   }
+ 
+   private void createUpgradeHistoryTable() throws SQLException {
+     List<DBAccessor.DBColumnInfo> columns = new ArrayList<>();
+ 
+     columns.add(new DBAccessor.DBColumnInfo(ID_COLUMN, Long.class, null, null, false));
+     columns.add(new DBAccessor.DBColumnInfo(UPGRADE_ID_COLUMN, Long.class, null, null, false));
+     columns.add(new DBAccessor.DBColumnInfo(SERVICE_NAME_COLUMN, String.class, 255, null, false));
+     columns.add(new DBAccessor.DBColumnInfo(COMPONENT_NAME_COLUMN, String.class, 255, null, false));
+     columns.add(new DBAccessor.DBColumnInfo(FROM_REPO_VERSION_ID_COLUMN, Long.class, null, null, false));
+     columns.add(new DBAccessor.DBColumnInfo(TARGET_REPO_VERSION_ID_COLUMN, Long.class, null, null, false));
+     dbAccessor.createTable(UPGRADE_HISTORY_TABLE, columns);
+ 
+     dbAccessor.addPKConstraint(UPGRADE_HISTORY_TABLE, PK_UPGRADE_HIST, ID_COLUMN);
+ 
+     dbAccessor.addFKConstraint(UPGRADE_HISTORY_TABLE, FK_UPGRADE_HIST_UPGRADE_ID, UPGRADE_ID_COLUMN, UPGRADE_TABLE, UPGRADE_ID_COLUMN, false);
+     dbAccessor.addFKConstraint(UPGRADE_HISTORY_TABLE, FK_UPGRADE_HIST_FROM_REPO, FROM_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, REPO_VERSION_ID_COLUMN, false);
+     dbAccessor.addFKConstraint(UPGRADE_HISTORY_TABLE, FK_UPGRADE_HIST_TARGET_REPO, TARGET_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, REPO_VERSION_ID_COLUMN, false);
+     dbAccessor.addUniqueConstraint(UPGRADE_HISTORY_TABLE, UQ_UPGRADE_HIST, UPGRADE_ID_COLUMN, COMPONENT_NAME_COLUMN, SERVICE_NAME_COLUMN);
+ 
+     addSequence("upgrade_history_id_seq", 0L, false);
+   }
+ 
+   /**
+    * Updates {@value #UPGRADE_TABLE} table.
+    * clear {@value #UPGRADE_TABLE} table
+    * Removes {@value #FROM_REPO_VERSION_ID_COLUMN} column.
+    * Removes {@value #TO_REPO_VERSION_ID_COLUMN} column.
+    * Adds the {@value #ORCHESTRATION_COLUMN} column.
+    * Adds the {@value #REPO_VERSION_ID_COLUMN} column.
+    * Removes {@value #FK_UPGRADE_FROM_REPO_ID} foreign key.
+    * Removes {@value #FK_UPGRADE_TO_REPO_ID} foreign key.
+    * adds {@value #FK_REPO_VERSION_ID} foreign key.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void updateUpgradeTable() throws SQLException {
+     dbAccessor.clearTable(UPGRADE_ITEM_TABLE);
+     dbAccessor.clearTable(UPGRADE_GROUP_TABLE);
+     dbAccessor.clearTable(UPGRADE_TABLE);
+     dbAccessor.dropFKConstraint(UPGRADE_TABLE, FK_UPGRADE_FROM_REPO_ID);
+     dbAccessor.dropFKConstraint(UPGRADE_TABLE, FK_UPGRADE_TO_REPO_ID);
+     dbAccessor.dropColumn(UPGRADE_TABLE, FROM_REPO_VERSION_ID_COLUMN);
+     dbAccessor.dropColumn(UPGRADE_TABLE, TO_REPO_VERSION_ID_COLUMN);
+ 
+     dbAccessor.addColumn(UPGRADE_TABLE,
+         new DBAccessor.DBColumnInfo(REPO_VERSION_ID_COLUMN, Long.class, null, null, false));
+ 
+     dbAccessor.addColumn(UPGRADE_TABLE,
+         new DBAccessor.DBColumnInfo(ORCHESTRATION_COLUMN, String.class, 255, STANDARD, false));
+ 
+     dbAccessor.addColumn(UPGRADE_TABLE,
+         new DBAccessor.DBColumnInfo(ALLOW_REVERT_COLUMN, Short.class, null, 0, false));
+ 
+     dbAccessor.addFKConstraint(UPGRADE_TABLE, FK_UPGRADE_REPO_VERSION_ID, REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, REPO_VERSION_ID_COLUMN, false);
+   }
+ 
+   /**
+    * Updates {@value #SERVICE_DESIRED_STATE_TABLE} table.
+    * Removes {@value #DESIRED_STACK_ID_COLUMN} column.
+    * Adds the {@value #DESIRED_REPO_VERSION_ID_COLUMN} column.
+    * Removes {@value #FK_SDS_DESIRED_STACK_ID} foreign key.
+    * adds {@value #FK_REPO_VERSION_ID} foreign key.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void updateServiceDesiredStateTable(int currentRepoID) throws SQLException {
+ 
+     dbAccessor.addColumn(SERVICE_DESIRED_STATE_TABLE,
+         new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, Long.class, null, currentRepoID, false));
+     dbAccessor.alterColumn(SERVICE_DESIRED_STATE_TABLE,
+         new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, Long.class, null, null, false));
+ 
+     dbAccessor.addFKConstraint(SERVICE_DESIRED_STATE_TABLE, FK_REPO_VERSION_ID, DESIRED_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, REPO_VERSION_ID_COLUMN, false);
+     dbAccessor.dropFKConstraint(SERVICE_DESIRED_STATE_TABLE, FK_SDS_DESIRED_STACK_ID);
+     dbAccessor.dropColumn(SERVICE_DESIRED_STATE_TABLE, DESIRED_STACK_ID_COLUMN);
+   }
+ 
+   /**
+    * drop {@value #CLUSTER_CONFIG_MAPPING_TABLE} and {@value #CLUSTER_VERSION_TABLE} tables.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void dropStaleTables() throws SQLException {
+     dbAccessor.dropTable(CLUSTER_CONFIG_MAPPING_TABLE);
+     dbAccessor.dropTable(CLUSTER_VERSION_TABLE);
+     dbAccessor.dropTable(SERVICE_COMPONENT_HISTORY_TABLE);
+   }
+ 
+   /**
+    * Adds the {@value #SELECTED_COLUMN} and {@value #SELECTED_TIMESTAMP_COLUMN} columns to the
+    * {@value #CLUSTER_CONFIG_TABLE} table.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void addSelectedCollumsToClusterconfigTable() throws SQLException {
+     DBAccessor.DBColumnInfo selectedColumnInfo = new DBAccessor.DBColumnInfo(SELECTED_COLUMN, Short.class, null, 0, false);
+     DBAccessor.DBColumnInfo selectedmappingColumnInfo = new DBAccessor.DBColumnInfo(SELECTED_COLUMN, Integer.class, null, 0, false);
+     DBAccessor.DBColumnInfo selectedTimestampColumnInfo = new DBAccessor.DBColumnInfo(SELECTED_TIMESTAMP_COLUMN, Long.class, null, 0, false);
+     DBAccessor.DBColumnInfo createTimestampColumnInfo = new DBAccessor.DBColumnInfo(CREATE_TIMESTAMP_COLUMN, Long.class, null, null, false);
+     dbAccessor.copyColumnToAnotherTable(CLUSTER_CONFIG_MAPPING_TABLE, selectedmappingColumnInfo,
+         CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, CLUSTER_CONFIG_TABLE, selectedColumnInfo,
+         CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, SELECTED_COLUMN, SELECTED, 0);
+ 
+     dbAccessor.copyColumnToAnotherTable(CLUSTER_CONFIG_MAPPING_TABLE, createTimestampColumnInfo,
+         CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, CLUSTER_CONFIG_TABLE, selectedTimestampColumnInfo,
+         CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, SELECTED_COLUMN, SELECTED, 0);
+   }
+ 
+ 
+   /**
+    * Updates {@value #SERVICE_COMPONENT_DESIRED_STATE_TABLE} table.
+    * Removes {@value #DESIRED_VERSION_COLUMN},{@value #DESIRED_STACK_ID_COLUMN} columns.
+    * Adds the {@value #DESIRED_REPO_VERSION_ID_COLUMN},{@value #REPO_STATE_COLUMN} columns.
+    * Removes {@value #FK_SCDS_DESIRED_STACK_ID} foreign key.
+    * adds {@value #FK_SCDS_DESIRED_REPO_ID} foreign key.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void updateServiceComponentDesiredStateTable(int currentRepoID) throws SQLException {
+     dbAccessor.addColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+         new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, Long.class, null, currentRepoID, false));
+     dbAccessor.alterColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+         new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, Long.class, null, null, false));
+ 
+     dbAccessor.addColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+         new DBAccessor.DBColumnInfo(REPO_STATE_COLUMN, String.class, 255, CURRENT, false));
+     dbAccessor.alterColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+         new DBAccessor.DBColumnInfo(REPO_STATE_COLUMN, String.class, 255, NOT_REQUIRED, false));
+ 
+     dbAccessor.addFKConstraint(SERVICE_COMPONENT_DESIRED_STATE_TABLE, FK_SCDS_DESIRED_REPO_ID, DESIRED_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, REPO_VERSION_ID_COLUMN, false);
+ 
+     dbAccessor.dropFKConstraint(SERVICE_COMPONENT_DESIRED_STATE_TABLE, FK_SCDS_DESIRED_STACK_ID);
+     dbAccessor.dropColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE, DESIRED_STACK_ID_COLUMN);
+     dbAccessor.dropColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE, DESIRED_VERSION_COLUMN);
+   }
+ 
+   /**
+    * Updates {@value #HOST_COMPONENT_DESIRED_STATE_TABLE} table.
+    * Removes {@value #DESIRED_STACK_ID_COLUMN} column.
+    * Removes {@value #FK_HCDS_DESIRED_STACK_ID} foreign key.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void updateHostComponentDesiredStateTable() throws SQLException {
+     dbAccessor.dropFKConstraint(HOST_COMPONENT_DESIRED_STATE_TABLE, FK_HCDS_DESIRED_STACK_ID);
+     dbAccessor.dropColumn(HOST_COMPONENT_DESIRED_STATE_TABLE, DESIRED_STACK_ID_COLUMN);
+   }
+ 
+   /**
+    * Updates {@value #HOST_COMPONENT_STATE_TABLE} table.
+    * Removes {@value #CURRENT_STACK_ID_COLUMN} column.
+    * Removes {@value #FK_HCS_CURRENT_STACK_ID} foreign key.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void updateHostComponentStateTable() throws SQLException {
+     dbAccessor.dropFKConstraint(HOST_COMPONENT_STATE_TABLE, FK_HCS_CURRENT_STACK_ID);
+     dbAccessor.dropColumn(HOST_COMPONENT_STATE_TABLE, CURRENT_STACK_ID_COLUMN);
+   }
+ 
+   /**
 -   * Updates {@value #REPO_VERSION_TABLE} table. Adds the following columns:
 -   * <ul>
 -   * <li>{@value #REPO_VERSION_HIDDEN_COLUMN}
 -   * <li>{@value #REPO_VERSION_RESOLVED_COLUMN}
 -   * </ul>
++   * Updates {@value #REPO_VERSION_TABLE} table. Adds
++   * {@value #REPO_VERSION_HIDDEN_COLUMN} column.
+    *
+    * @throws java.sql.SQLException
+    */
+   private void updateRepositoryVersionTable() throws SQLException {
+     dbAccessor.addColumn(REPO_VERSION_TABLE,
+         new DBAccessor.DBColumnInfo(REPO_VERSION_HIDDEN_COLUMN, Short.class, null, 0, false));
 -
 -    dbAccessor.addColumn(REPO_VERSION_TABLE,
 -        new DBAccessor.DBColumnInfo(REPO_VERSION_RESOLVED_COLUMN, Short.class, null, 0, false));
+   }
+ 
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   protected void executePreDMLUpdates() throws AmbariException, SQLException {
 -    removeSupersetFromDruid();
++
+   }
+ 
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   protected void executeDMLUpdates() throws AmbariException, SQLException {
+     addNewConfigurationsFromXml();
+     setUnmappedForOrphanedConfigs();
++    removeSupersetFromDruid();
+     ensureZeppelinProxyUserConfigs();
 -    updateKerberosDescriptorArtifacts();
 -    updateAmsConfigs();
 -    updateHDFSWidgetDefinition();
 -    updateExistingRepositoriesToBeResolved();
+   }
+ 
+   public int getCurrentVersionID() throws AmbariException, SQLException {
+     List<Integer> currentVersionList = dbAccessor.getIntColumnValues(CLUSTER_VERSION_TABLE, REPO_VERSION_ID_COLUMN,
+         new String[]{STATE_COLUMN}, new String[]{CURRENT}, false);
+     if (currentVersionList.size() != 1) {
+       throw new AmbariException("Can't get current version id");
+     }
+     return currentVersionList.get(0);
+   }
+ 
+   // Superset is moved as an independent service in Ambari-2.6.
+   // This will remove superset component if installed under Druid Service
+   protected void removeSupersetFromDruid() throws SQLException {
+     removeComponent("DRUID_SUPERSET", "druid-superset");
+   }
+ 
+   private void removeComponent(String componentName, String configPrefix) throws SQLException {
+ 
+     String serviceConfigMappingRemoveSQL = String.format(
+         "DELETE FROM %s WHERE config_id IN (SELECT config_id from %s where type_name like '%s%%')",
+         SERVICE_CONFIG_MAPPING_TABLE, CLUSTER_CONFIG_TABLE, configPrefix);
+ 
+     String supersetConfigRemoveSQL = String.format(
+         "DELETE FROM %s WHERE type_name like '%s%%'",
+         CLUSTER_CONFIG_TABLE, configPrefix);
+ 
+     String hostComponentDesiredStateRemoveSQL = String.format(
+         "DELETE FROM %s WHERE component_name = '%s'",
+         HOST_COMPONENT_DESIRED_STATE, componentName);
+ 
+     String hostComponentStateRemoveSQL = String.format(
+         "DELETE FROM %s WHERE component_name = '%s'",
+         HOST_COMPONENT_STATE, componentName);
+ 
+     String serviceComponentDesiredStateRemoveSQL = String.format(
+         "DELETE FROM %s WHERE component_name = '%s'",
+         SERVICE_COMPONENT_DESIRED_STATE, componentName);
+ 
+     dbAccessor.executeQuery(serviceConfigMappingRemoveSQL);
+     dbAccessor.executeQuery(supersetConfigRemoveSQL);
+     dbAccessor.executeQuery(hostComponentDesiredStateRemoveSQL);
+     dbAccessor.executeQuery(hostComponentStateRemoveSQL);
+     dbAccessor.executeQuery(serviceComponentDesiredStateRemoveSQL);
+   }
+ 
+   /**
+    * If Zeppelin is installed, ensure that the proxyuser configurations are set in <code>core-site</code>.
+    * <p>
+    * The following configurations will be added, if core-site exists and the properties are not in the
+    * set of core-site properties:
+    * <ul>
+    * <li><code>"hadoop.proxyuser.{zeppelin-env/zeppelin_user}.groups": "*"</code></li>
+    * <li><code>"hadoop.proxyuser.{zeppelin-env/zeppelin_user}.hosts": "*"</code></li>
+    * </ul>
+    */
+   void ensureZeppelinProxyUserConfigs() throws AmbariException {
+     Clusters clusters = injector.getInstance(Clusters.class);
+     Map<String, Cluster> clusterMap = getCheckedClusterMap(clusters);
+ 
+     if ((clusterMap != null) && !clusterMap.isEmpty()) {
+       for (final Cluster cluster : clusterMap.values()) {
+         Config zeppelinEnvConfig = cluster.getDesiredConfigByType("zeppelin-env");
+ 
+         if (zeppelinEnvConfig != null) {
+           // If zeppelin-env exists, than it is assumed that Zeppelin is installed
+           Map<String, String> zeppelinEnvProperties = zeppelinEnvConfig.getProperties();
+ 
+           String zeppelinUser = null;
+           if (zeppelinEnvProperties != null) {
+             zeppelinUser = zeppelinEnvProperties.get("zeppelin_user");
+           }
+ 
+           if (!StringUtils.isEmpty(zeppelinUser)) {
+             // If the zeppelin user is set, see if the proxyuser configs need to be set
+ 
+             Config coreSiteConfig = cluster.getDesiredConfigByType(CORE_SITE);
+             if (coreSiteConfig != null) {
+               // If core-site exists, ensure the proxyuser configurations for Zeppelin are set.
+               // If they are not already set, set them to their default value.
+               String proxyUserHostsName = String.format("hadoop.proxyuser.%s.hosts", zeppelinUser);
+               String proxyUserGroupsName = String.format("hadoop.proxyuser.%s.groups", zeppelinUser);
+ 
+               Map<String, String> proxyUserProperties = new HashMap<>();
+               proxyUserProperties.put(proxyUserHostsName, "*");
+               proxyUserProperties.put(proxyUserGroupsName, "*");
+ 
+               Map<String, String> coreSiteConfigProperties = coreSiteConfig.getProperties();
+ 
+               if (coreSiteConfigProperties != null) {
+                 if (coreSiteConfigProperties.containsKey(proxyUserHostsName)) {
+                   proxyUserProperties.remove(proxyUserHostsName);
+                 }
+ 
+                 if (coreSiteConfigProperties.containsKey(proxyUserGroupsName)) {
+                   proxyUserProperties.remove(proxyUserGroupsName);
+                 }
+               }
+ 
+               if (!proxyUserProperties.isEmpty()) {
+                 updateConfigurationPropertiesForCluster(cluster, CORE_SITE, proxyUserProperties, true, false);
+               }
+             }
+           }
+         }
+       }
+     }
+   }
 -
 -  /**
 -   * {@inheritDoc}
 -   */
 -  @Override
 -  protected void updateKerberosDescriptorArtifact(ArtifactDAO artifactDAO, ArtifactEntity artifactEntity) throws AmbariException {
 -    if (artifactEntity != null) {
 -      Map<String, Object> data = artifactEntity.getArtifactData();
 -      if (data != null) {
 -        final KerberosDescriptor kerberosDescriptor = new KerberosDescriptorFactory().createInstance(data);
 -        if (kerberosDescriptor != null) {
 -          fixRangerKMSKerberosDescriptor(kerberosDescriptor);
 -          fixIdentityReferences(getCluster(artifactEntity), kerberosDescriptor);
 -
 -          artifactEntity.setArtifactData(kerberosDescriptor.toMap());
 -          artifactDAO.merge(artifactEntity);
 -        }
 -      }
 -    }
 -  }
 -
 -  protected void fixRangerKMSKerberosDescriptor(KerberosDescriptor kerberosDescriptor) {
 -    KerberosServiceDescriptor rangerKmsServiceDescriptor = kerberosDescriptor.getService("RANGER_KMS");
 -    if (rangerKmsServiceDescriptor != null) {
 -
 -      KerberosIdentityDescriptor rangerKmsServiceIdentity = rangerKmsServiceDescriptor.getIdentity("/smokeuser");
 -      if (rangerKmsServiceIdentity != null) {
 -        rangerKmsServiceDescriptor.removeIdentity("/smokeuser");
 -      }
 -      KerberosComponentDescriptor rangerKmscomponentDescriptor = rangerKmsServiceDescriptor.getComponent("RANGER_KMS_SERVER");
 -      if (rangerKmscomponentDescriptor != null) {
 -        KerberosIdentityDescriptor rangerKmsComponentIdentity = rangerKmscomponentDescriptor.getIdentity("/smokeuser");
 -        if (rangerKmsComponentIdentity != null) {
 -          rangerKmscomponentDescriptor.removeIdentity("/smokeuser");
 -        }
 -      }
 -    }
 -  }
 -
 -  protected void updateAmsConfigs() throws AmbariException {
 -    AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class);
 -    Clusters clusters = ambariManagementController.getClusters();
 -    if (clusters != null) {
 -      Map<String, Cluster> clusterMap = getCheckedClusterMap(clusters);
 -      if (clusterMap != null && !clusterMap.isEmpty()) {
 -        for (final Cluster cluster : clusterMap.values()) {
 -
 -
 -          Config amsSslClient = cluster.getDesiredConfigByType(AMS_SSL_CLIENT);
 -          if (amsSslClient != null) {
 -            Map<String, String> amsSslClientProperties = amsSslClient.getProperties();
 -
 -            if (amsSslClientProperties.containsKey(METRIC_TRUSTSTORE_ALIAS)) {
 -              LOG.info("Removing " + METRIC_TRUSTSTORE_ALIAS + " from " + AMS_SSL_CLIENT);
 -              removeConfigurationPropertiesFromCluster(cluster, AMS_SSL_CLIENT, Collections.singleton(METRIC_TRUSTSTORE_ALIAS));
 -            }
 -
 -          }
 -        }
 -      }
 -    }
 -  }
 -
 -  protected void updateHDFSWidgetDefinition() throws AmbariException {
 -    LOG.info("Updating HDFS widget definition.");
 -
 -    Map<String, List<String>> widgetMap = new HashMap<>();
 -    Map<String, String> sectionLayoutMap = new HashMap<>();
 -
 -    List<String> hdfsHeatmapWidgets = new ArrayList<>(Arrays.asList("HDFS Bytes Read", "HDFS Bytes Written",
 -      "DataNode Process Disk I/O Utilization", "DataNode Process Network I/O Utilization"));
 -    widgetMap.put("HDFS_HEATMAPS", hdfsHeatmapWidgets);
 -    sectionLayoutMap.put("HDFS_HEATMAPS", "default_hdfs_heatmap");
 -
 -    updateWidgetDefinitionsForService("HDFS", widgetMap, sectionLayoutMap);
 -  }
 -
 -  /**
 -   * Retrieves the relevant {@link Cluster} given information from the suppliied {@link ArtifactEntity}.
 -   * <p>
 -   * The cluster id value is taken from the entity's foreign key value and then used to obtain the cluster object.
 -   *
 -   * @param artifactEntity an {@link ArtifactEntity}
 -   * @return a {@link Cluster}
 -   */
 -  private Cluster getCluster(ArtifactEntity artifactEntity) {
 -    if (artifactEntity != null) {
 -      Map<String, String> keys = artifactEntity.getForeignKeys();
 -      if (keys != null) {
 -        String clusterId = keys.get("cluster");
 -        if (StringUtils.isNumeric(clusterId)) {
 -          Clusters clusters = injector.getInstance(Clusters.class);
 -          try {
 -            return clusters.getCluster(Long.valueOf(clusterId));
 -          } catch (AmbariException e) {
 -            LOG.error(String.format("Failed to obtain cluster using cluster id %s -  %s", clusterId, e.getMessage()), e);
 -          }
 -        } else {
 -          LOG.error(String.format("Failed to obtain cluster id from artifact entity with foreign keys: %s", keys));
 -        }
 -      }
 -    }
 -
 -    return null;
 -  }
 -
 -  /**
 -   * Recursively traverses the Kerberos descriptor to find and fix the identity references.
 -   * <p>
 -   * Each found identity descriptor that indicates it is a reference by having a <code>name</code>
 -   * value that starts with a "/" or a "./" is fixed by clearing the <code>principal name</code>value,
 -   * setting the <code>reference</code> value to the <code>name</code> value and changing the
 -   * <code>name</code> value to a name with the following pattern:
 -   * <code>SERVICE_COMPONENT_IDENTITY</code>
 -   * <p>
 -   * For example, if the identity is for the "SERVICE1" service and is a reference to "HDFS/NAMENODE/hdfs";
 -   * then the name is set to "<code>service1_hdfs</code>"
 -   * <p>
 -   * For example, if the identity is for the "COMPONENT21" component of the "SERVICE2" service and is a reference to "HDFS/NAMENODE/hdfs";
 -   * then the name is set to "<code>service2_component21_hdfs</code>"
 -   * <p>
 -   * Once the identity descriptor properties of the identity are fixed, the relevant configuration
 -   * value is fixed to match the value if the referenced identity. This may lead to a new version
 -   * of the relevant configuration type.
 -   *
 -   * @param cluster   the cluster
 -   * @param container the current Kerberos descriptor container
 -   * @throws AmbariException if an error occurs
 -   */
 -  private void fixIdentityReferences(Cluster cluster, AbstractKerberosDescriptorContainer container)
 -      throws AmbariException {
 -    List<KerberosIdentityDescriptor> identities = container.getIdentities();
 -    if (identities != null) {
 -      for (KerberosIdentityDescriptor identity : identities) {
 -        String name = identity.getName();
 -
 -        if (!StringUtils.isEmpty(name) && (name.startsWith("/") || name.startsWith("./"))) {
 -          String[] parts = name.split("/");
 -          String newName = buildName(identity.getParent(), parts[parts.length - 1]);
 -
 -          identity.setName(newName);
 -          identity.setReference(name);
 -        }
 -
 -        String identityReference = identity.getReference();
 -        if (!StringUtils.isEmpty(identityReference)) {
 -          // If this identity references another identity:
 -          //  * The principal name needs to be the same as the referenced identity
 -          //    - ensure that no principal name is being set for this identity
 -          //  * Any configuration set to contain the reference principal name needs to be fixed to
 -          //    be the correct principal name
 -          KerberosPrincipalDescriptor principal = identity.getPrincipalDescriptor();
 -          if (principal != null) {
 -            // Fix the value
 -            principal.setValue(null);
 -
 -            // Fix the relative configuration
 -            if (!StringUtils.isEmpty(principal.getConfiguration())) {
 -              String referencedPrincipalName = getConfiguredPrincipalNameFromReference(cluster, container, identityReference);
 -
 -              if(!StringUtils.isEmpty(referencedPrincipalName)) {
 -                String[] parts = principal.getConfiguration().split("/");
 -                if (parts.length == 2) {
 -                  String type = parts[0];
 -                  String property = parts[1];
 -
 -                  updateConfigurationPropertiesForCluster(cluster,
 -                      type,
 -                      Collections.singletonMap(property, referencedPrincipalName),
 -                      true,
 -                      false);
 -                }
 -              }
 -            }
 -          }
 -        }
 -      }
 -    }
 -
 -    if (container instanceof KerberosDescriptor) {
 -      Map<String, KerberosServiceDescriptor> services = ((KerberosDescriptor) container).getServices();
 -      if (services != null) {
 -        for (KerberosServiceDescriptor serviceDescriptor : services.values()) {
 -          fixIdentityReferences(cluster, serviceDescriptor);
 -        }
 -      }
 -    } else if (container instanceof KerberosServiceDescriptor) {
 -      Map<String, KerberosComponentDescriptor> components = ((KerberosServiceDescriptor) container).getComponents();
 -      if (components != null) {
 -        for (KerberosComponentDescriptor componentDescriptor : components.values()) {
 -          fixIdentityReferences(cluster, componentDescriptor);
 -        }
 -      }
 -    }
 -  }
 -
 -  /**
 -   * Finds the value of the configuration found for the principal in the referenced identity
 -   * descriptor.
 -   *
 -   * @param cluster           the cluster
 -   * @param container         the current {@link KerberosIdentityDescriptor}, ideally the identity's parent descriptor
 -   * @param identityReference the path to the referenced identity
 -   * @return the value of the configuration specified in the referenced identity's principal descriptor
 -   * @throws AmbariException if an error occurs
 -   */
 -  private String getConfiguredPrincipalNameFromReference(Cluster cluster,
 -                                                         AbstractKerberosDescriptorContainer container,
 -                                                         String identityReference)
 -      throws AmbariException {
 -    KerberosIdentityDescriptor identityDescriptor = container.getReferencedIdentityDescriptor(identityReference);
 -
 -    if (identityDescriptor != null) {
 -      KerberosPrincipalDescriptor principal = identityDescriptor.getPrincipalDescriptor();
 -      if ((principal != null) && (!StringUtils.isEmpty(principal.getConfiguration()))) {
 -        String[] parts = principal.getConfiguration().split("/");
 -        if (parts.length == 2) {
 -          String type = parts[0];
 -          String property = parts[1];
 -
 -          Config config = cluster.getDesiredConfigByType(type);
 -
 -          if (config != null) {
 -            return config.getProperties().get(property);
 -          }
 -        }
 -      }
 -    }
 -
 -    return null;
 -  }
 -
 -  /**
 -   * Builds the name of an identity based on the identity's container and the referenced identity's name.
 -   * <p>
 -   * The calculated name will be in the following format and converted to all lowercase characters:
 -   * <code>SERVICE_COMPONENT_IDENTITY</code>
 -   *
 -   * @param container    the current {@link KerberosIdentityDescriptor}, ideally the identity's parent descriptor
 -   * @param identityName the referenced identity's name
 -   * @return a name
 -   */
 -  private String buildName(AbstractKerberosDescriptor container, String identityName) {
 -    if (container instanceof KerberosServiceDescriptor) {
 -      return container.getName().toLowerCase() + "_" + identityName;
 -    } else if (container instanceof KerberosComponentDescriptor) {
 -      return container.getParent().getName().toLowerCase() + "_" + container.getName().toLowerCase() + "_" + identityName;
 -    } else {
 -      return identityName;
 -    }
 -  }
 -
 -  /**
 -   * Sets all existing repository versions to be resolved (we have to assume
 -   * that they are good since they've been using them to run stuff).
 -   *
 -   * @throws AmbariException
 -   */
 -  protected void updateExistingRepositoriesToBeResolved() throws AmbariException {
 -    RepositoryVersionDAO repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class);
 -    List<RepositoryVersionEntity> repositoryVersions = repositoryVersionDAO.findAll();
 -    for (RepositoryVersionEntity repositoryVersion : repositoryVersions) {
 -      repositoryVersion.setResolved(true);
 -      repositoryVersionDAO.merge(repositoryVersion);
 -    }
 -  }
+ }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
index 633d837,bfe2a13..f4a2a78
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
@@@ -294,16 -244,103 +244,103 @@@ public class UpgradeCatalog300 extends 
            Collection<Config> configs = cluster.getAllConfigs();
            for (Config config : configs) {
              String configType = config.getType();
-             if (!configType.endsWith("-logsearch-conf")) {
-               continue;
+             if (configType.endsWith("-logsearch-conf")) {
+               configHelper.removeConfigsByType(cluster, configType);
+             }
+           }
+ 
+           Config logSearchEnv = cluster.getDesiredConfigByType("logsearch-env");
+ 
+           String oldProtocolProperty = null;
+           String oldPortProperty = null;
+           if (logSearchEnv != null) {
+             oldProtocolProperty = logSearchEnv.getProperties().get("logsearch_ui_port");
+             oldPortProperty = logSearchEnv.getProperties().get("logsearch_ui_protocol");
+           }
+ 
+           Config logSearchProperties = cluster.getDesiredConfigByType("logsearch-properties");
+           Config logFeederProperties = cluster.getDesiredConfigByType("logfeeder-properties");
+           if (logSearchProperties != null && logFeederProperties != null) {
+             configHelper.createConfigType(cluster, cluster.getDesiredStackVersion(), ambariManagementController,
+                 "logsearch-common-properties", Collections.emptyMap(), "ambari-upgrade",
+                 String.format("Updated logsearch-common-properties during Ambari Upgrade from %s to %s",
+                     getSourceVersion(), getTargetVersion()));
 -            
++
+             String defaultLogLevels = logSearchProperties.getProperties().get("logsearch.logfeeder.include.default.level");
+ 
+             Set<String> removeProperties = Sets.newHashSet("logsearch.logfeeder.include.default.level");
+             removeConfigurationPropertiesFromCluster(cluster, "logsearch-properties", removeProperties);
+ 
+             Map<String, String> newLogSearchProperties = new HashMap<>();
+             if (oldProtocolProperty != null) {
+               newLogSearchProperties.put("logsearch.protocol", oldProtocolProperty);
+             }
+ 
+             if (oldPortProperty != null) {
+               newLogSearchProperties.put("logsearch.http.port", oldPortProperty);
+               newLogSearchProperties.put("logsearch.https.port", oldPortProperty);
+             }
+             if (!newLogSearchProperties.isEmpty()) {
+               updateConfigurationPropertiesForCluster(cluster, "logsearch-properties", newLogSearchProperties, true, true);
+             }
+ 
+             Map<String, String> newLogfeederProperties = new HashMap<>();
+             newLogfeederProperties.put("logfeeder.include.default.level", defaultLogLevels);
+             updateConfigurationPropertiesForCluster(cluster, "logfeeder-properties", newLogfeederProperties, true, true);
+           }
+ 
+           Config logFeederLog4jProperties = cluster.getDesiredConfigByType("logfeeder-log4j");
+           if (logFeederLog4jProperties != null) {
+             String content = logFeederLog4jProperties.getProperties().get("content");
+             if (content.contains("<!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\">")) {
+               content = content.replace("<!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\">", "<!DOCTYPE log4j:configuration SYSTEM \"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd\">");
+               updateConfigurationPropertiesForCluster(cluster, "logfeeder-log4j", Collections.singletonMap("content", content), true, true);
+             }
+           }
+ 
+           Config logSearchLog4jProperties = cluster.getDesiredConfigByType("logsearch-log4j");
+           if (logSearchLog4jProperties != null) {
+             String content = logSearchLog4jProperties.getProperties().get("content");
+             if (content.contains("<!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\">")) {
+               content = content.replace("<!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\">", "<!DOCTYPE log4j:configuration SYSTEM \"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd\">");
+               updateConfigurationPropertiesForCluster(cluster, "logsearch-log4j", Collections.singletonMap("content", content), true, true);
+             }
+           }
+ 
+           Config logSearchServiceLogsConfig = cluster.getDesiredConfigByType("logsearch-service_logs-solrconfig");
+           if (logSearchServiceLogsConfig != null) {
+             String content = logSearchServiceLogsConfig.getProperties().get("content");
+             if (content.contains("class=\"solr.admin.AdminHandlers\"")) {
+               content = content.replaceAll("(?s)<requestHandler name=\"/admin/\".*?class=\"solr.admin.AdminHandlers\" />", "");
+               updateConfigurationPropertiesForCluster(cluster, "logsearch-service_logs-solrconfig", Collections.singletonMap("content", content), true, true);
+             }
+           }
+ 
+           Config logSearchAuditLogsConfig = cluster.getDesiredConfigByType("logsearch-audit_logs-solrconfig");
+           if (logSearchAuditLogsConfig != null) {
+             String content = logSearchAuditLogsConfig.getProperties().get("content");
+             if (content.contains("class=\"solr.admin.AdminHandlers\"")) {
+               content = content.replaceAll("(?s)<requestHandler name=\"/admin/\".*?class=\"solr.admin.AdminHandlers\" />", "");
+               updateConfigurationPropertiesForCluster(cluster, "logsearch-audit_logs-solrconfig", Collections.singletonMap("content", content), true, true);
              }
-             
-             Set<String> removeProperties = new HashSet<>();
-             removeProperties.add("service_name");
-             removeProperties.add("component_mappings");
-             removeProperties.add("content");
-             
-             removeConfigurationPropertiesFromCluster(cluster, configType, removeProperties);
+           }
 -          
++
+           Config logFeederOutputConfig = cluster.getDesiredConfigByType("logfeeder-output-config");
+           if (logFeederOutputConfig != null) {
+             String content = logFeederOutputConfig.getProperties().get("content");
+             content = content.replace(
+                 "      \"collection\":\"{{logsearch_solr_collection_service_logs}}\",\n" +
+                 "      \"number_of_shards\": \"{{logsearch_collection_service_logs_numshards}}\",\n" +
+                 "      \"splits_interval_mins\": \"{{logsearch_service_logs_split_interval_mins}}\",\n",
+                 "      \"type\": \"service\",\n");
+ 
+             content = content.replace(
+                 "      \"collection\":\"{{logsearch_solr_collection_audit_logs}}\",\n" +
+                 "      \"number_of_shards\": \"{{logsearch_collection_audit_logs_numshards}}\",\n" +
+                 "      \"splits_interval_mins\": \"{{logsearch_audit_logs_split_interval_mins}}\",\n",
+                 "      \"type\": \"audit\",\n");
+ 
+             updateConfigurationPropertiesForCluster(cluster, "logfeeder-output-config", Collections.singletonMap("content", content), true, true);
            }
          }
        }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
index c7b2f79,c50276e..aa2e7ab
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
@@@ -975,10 -964,15 +964,15 @@@ public class ViewRegistry 
      try {
        org.apache.ambari.server.state.Cluster cluster = clusters.getClusterById(clusterId);
        String clusterName = cluster.getClusterName();
 -      
 +
-       StackId stackId = cluster.getCurrentStackVersion();
+       Set<StackId> stackIds = new HashSet<>();
        Set<String> serviceNames = cluster.getServices().keySet();
 -      
 +
+       for (String serviceName : serviceNames) {
+         Service service = cluster.getService(serviceName);
+         stackIds.add(service.getDesiredStackId());
+       }
+ 
        for (ViewEntity viewEntity : getDefinitions()) {
  
          String viewName = viewEntity.getName();


[05/50] [abbrv] ambari git commit: AMBARI-22034. AMS: Add smart configs support for service. Addendum fix (swagle)

Posted by ao...@apache.org.
AMBARI-22034. AMS: Add smart configs support for service. Addendum fix (swagle)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/5d5cc4ff
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/5d5cc4ff
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/5d5cc4ff

Branch: refs/heads/branch-3.0-perf
Commit: 5d5cc4ff024965210aaa4fcccb17d694b69c9927
Parents: 19b1607
Author: Siddharth Wagle <sw...@hortonworks.com>
Authored: Fri Sep 22 14:19:31 2017 -0700
Committer: Siddharth Wagle <sw...@hortonworks.com>
Committed: Fri Sep 22 14:19:31 2017 -0700

----------------------------------------------------------------------
 .../AMBARI_METRICS/0.1.0/configuration/ams-site.xml                | 2 --
 1 file changed, 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/5d5cc4ff/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/configuration/ams-site.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/configuration/ams-site.xml b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/configuration/ams-site.xml
index ab14f18..b7ae456 100644
--- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/configuration/ams-site.xml
+++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/configuration/ams-site.xml
@@ -31,8 +31,6 @@
       2) distributed: HBase daemons writing to HDFS
     </description>
     <on-ambari-upgrade add="true"/>
-    <display-name>Operation Mode</display-name>
-    <description>Metrics service Operation mode</description>
     <value-attributes>
       <overridable>false</overridable>
       <type>value-list</type>


[12/50] [abbrv] ambari git commit: AMBARI-22017 stack advisor recommends all components on single host for HDP-2.6 Ambari trunk build (dsen)

Posted by ao...@apache.org.
AMBARI-22017 stack advisor recommends all components on single host for HDP-2.6 Ambari trunk build (dsen)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/999daefe
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/999daefe
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/999daefe

Branch: refs/heads/branch-3.0-perf
Commit: 999daefe0f09b92f42e50ff12f66dd95a112a003
Parents: 986a65d
Author: Dmytro Sen <ds...@apache.org>
Authored: Mon Sep 25 16:39:09 2017 +0300
Committer: Dmytro Sen <ds...@apache.org>
Committed: Mon Sep 25 16:39:09 2017 +0300

----------------------------------------------------------------------
 .../stacks/HDP/2.1/services/stack_advisor.py    |  4 +++
 .../stacks/2.1/common/test_stack_advisor.py     | 28 ++++++++++++++++++++
 2 files changed, 32 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/999daefe/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py b/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py
index ddd795f..aefb603 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py
@@ -86,6 +86,10 @@ class HDP21StackAdvisor(HDP206StackAdvisor):
 
     Must be overriden in child class.
     """
+
+    # since old stack advisors are extending each other they should call parent method first
+    super(HDP21StackAdvisor, self).modifyComponentLayoutSchemes()
+
     self.componentLayoutSchemes.update({
       'APP_TIMELINE_SERVER': {31: 1, "else": 2},
       'FALCON_SERVER': {6: 1, 31: 2, "else": 3}

http://git-wip-us.apache.org/repos/asf/ambari/blob/999daefe/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py b/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py
index bdd34fc..6bd02bf 100644
--- a/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py
+++ b/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py
@@ -557,3 +557,31 @@ class TestHDP21StackAdvisor(TestCase):
 
     res = self.stackAdvisor.validateHiveConfigurations(properties, recommendedDefaults, configurations, '', '')
     self.assertEquals(res, res_expected)
+
+  def test_modifyComponentLayoutSchemes(self):
+    res_expected = {}
+    res_expected.update({
+      'NAMENODE': {"else": 0},
+      'SECONDARY_NAMENODE': {"else": 1},
+      'HBASE_MASTER': {6: 0, 31: 2, "else": 3},
+
+      'HISTORYSERVER': {31: 1, "else": 2},
+      'RESOURCEMANAGER': {31: 1, "else": 2},
+
+      'OOZIE_SERVER': {6: 1, 31: 2, "else": 3},
+
+      'HIVE_SERVER': {6: 1, 31: 2, "else": 4},
+      'HIVE_METASTORE': {6: 1, 31: 2, "else": 4},
+      'WEBHCAT_SERVER': {6: 1, 31: 2, "else": 4},
+      'METRICS_COLLECTOR': {3: 2, 6: 2, 31: 3, "else": 5},
+    })
+
+    res_expected.update({
+      'APP_TIMELINE_SERVER': {31: 1, "else": 2},
+      'FALCON_SERVER': {6: 1, 31: 2, "else": 3}
+    })
+
+    self.stackAdvisor.modifyComponentLayoutSchemes()
+    res = self.stackAdvisor.getComponentLayoutSchemes()
+
+    self.assertEquals(res, res_expected)


[41/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/YARN/3.0.0.3.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/YARN/3.0.0.3.0/package/scripts/params_linux.py
index 73c1c8f,e66ec3c..d28920b
--- a/ambari-server/src/main/resources/common-services/YARN/3.0.0.3.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/YARN/3.0.0.3.0/package/scripts/params_linux.py
@@@ -166,11 -166,8 +166,8 @@@ rm_hosts = config['clusterHostInfo']['r
  rm_host = rm_hosts[0]
  rm_port = config['configurations']['yarn-site']['yarn.resourcemanager.webapp.address'].split(':')[-1]
  rm_https_port = default('/configurations/yarn-site/yarn.resourcemanager.webapp.https.address', ":8090").split(':')[-1]
- # TODO UPGRADE default, update site during upgrade
- rm_nodes_exclude_path = default("/configurations/yarn-site/yarn.resourcemanager.nodes.exclude-path","/etc/hadoop/conf/yarn.exclude")
- rm_nodes_exclude_dir = os.path.dirname(rm_nodes_exclude_path)
  
 -java64_home = config['hostLevelParams']['java_home']
 +java64_home = config['ambariLevelParams']['java_home']
  java_exec = format("{java64_home}/bin/java")
  hadoop_ssl_enabled = default("/configurations/core-site/hadoop.ssl.enabled", False)
  
@@@ -238,6 -235,16 +235,16 @@@ user_group = config['configurations']['
  #exclude file
  exclude_hosts = default("/clusterHostInfo/decom_nm_hosts", [])
  exclude_file_path = default("/configurations/yarn-site/yarn.resourcemanager.nodes.exclude-path","/etc/hadoop/conf/yarn.exclude")
+ rm_nodes_exclude_dir = os.path.dirname(exclude_file_path)
+ 
 -nm_hosts = default("/clusterHostInfo/nm_hosts", [])
++nm_hosts = default("/clusterHostInfo/nodemanager_hosts", [])
+ #incude file
+ include_file_path = default("/configurations/yarn-site/yarn.resourcemanager.nodes.include-path", None)
+ include_hosts = None
+ manage_include_files = default("/configurations/yarn-site/manage.include.files", False)
+ if include_file_path and manage_include_files:
+   rm_nodes_include_dir = os.path.dirname(include_file_path)
+   include_hosts = list(set(nm_hosts) - set(exclude_hosts))
  
  ats_host = set(default("/clusterHostInfo/app_timeline_server_hosts", []))
  has_ats = not len(ats_host) == 0
@@@ -247,6 -253,9 +253,9 @@@
  # don't using len(nm_hosts) here, because check can take too much time on large clusters
  number_of_nm = 1
  
 -hs_host = default("/clusterHostInfo/hs_host", [])
++hs_host = default("/clusterHostInfo/historyserver_hosts", [])
+ has_hs = not len(hs_host) == 0
+ 
  # default kinit commands
  rm_kinit_cmd = ""
  yarn_timelineservice_kinit_cmd = ""

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/YARN/3.0.0.3.0/package/scripts/params_windows.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/YARN/3.0.0.3.0/package/scripts/yarn.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py
index 0000000,0fdc27c..f8af7bb
mode 000000,100644..100644
--- a/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py
+++ b/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py
@@@ -1,0 -1,522 +1,522 @@@
+ #!/usr/bin/env python
+ """
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+     http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ 
+ """
+ 
+ import glob
+ import os
+ 
+ from resource_management.core import shell, sudo
+ from resource_management.core.logger import Logger
+ from resource_management.core.resources import Directory
+ from resource_management.core.resources.system import Execute, File
+ from resource_management.core.source import InlineTemplate
+ from resource_management.libraries import XmlConfig
+ from resource_management.libraries.functions import StackFeature
+ from resource_management.libraries.functions import get_kinit_path
+ from resource_management.libraries.functions import stack_select
+ from resource_management.libraries.functions.check_process_status import check_process_status
+ from resource_management.libraries.functions.default import default
+ from resource_management.libraries.functions.format import format
+ from resource_management.libraries.functions.stack_features import check_stack_feature
+ from resource_management.libraries.functions.version import format_stack_version
+ from resource_management.libraries.script.script import Script
+ 
+ 
+ class Master(Script):
+   def install(self, env):
+     import params
+     env.set_params(params)
+     self.install_packages(env)
+ 
+     self.create_zeppelin_log_dir(env)
+ 
+     if params.spark_version:
+       Execute('echo spark_version:' + str(params.spark_version) + ' detected for spark_home: '
+               + params.spark_home + ' >> ' + params.zeppelin_log_file, user=params.zeppelin_user)
+     if params.spark2_version:
+       Execute('echo spark2_version:' + str(params.spark2_version) + ' detected for spark2_home: '
+               + params.spark2_home + ' >> ' + params.zeppelin_log_file, user=params.zeppelin_user)
+ 
+   def create_zeppelin_dir(self, params):
+     params.HdfsResource(format("/user/{zeppelin_user}"),
+                         type="directory",
+                         action="create_on_execute",
+                         owner=params.zeppelin_user,
+                         recursive_chown=True,
+                         recursive_chmod=True
+                         )
+     params.HdfsResource(format("/user/{zeppelin_user}/test"),
+                         type="directory",
+                         action="create_on_execute",
+                         owner=params.zeppelin_user,
+                         recursive_chown=True,
+                         recursive_chmod=True
+                         )
+     params.HdfsResource(format("/apps/zeppelin"),
+                         type="directory",
+                         action="create_on_execute",
+                         owner=params.zeppelin_user,
+                         recursive_chown=True,
+                         recursive_chmod=True
+                         )
+ 
+     spark_deps_full_path = self.get_zeppelin_spark_dependencies()[0]
+     spark_dep_file_name = os.path.basename(spark_deps_full_path)
+ 
+     params.HdfsResource(params.spark_jar_dir + "/" + spark_dep_file_name,
+                         type="file",
+                         action="create_on_execute",
+                         source=spark_deps_full_path,
+                         group=params.zeppelin_group,
+                         owner=params.zeppelin_user,
+                         mode=0444,
+                         replace_existing_files=True,
+                         )
+ 
+     params.HdfsResource(None, action="execute")
+ 
+   def create_zeppelin_log_dir(self, env):
+     import params
+     env.set_params(params)
+     Directory([params.zeppelin_log_dir],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               cd_access="a",
+               create_parents=True,
+               mode=0755
+               )
+ 
+   def create_zeppelin_hdfs_conf_dir(self, env):
+     import params
+     env.set_params(params)
+     Directory([params.external_dependency_conf],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               cd_access="a",
+               create_parents=True,
+               mode=0755
+               )
+ 
+   def chown_zeppelin_pid_dir(self, env):
+     import params
+     env.set_params(params)
+     Execute(("chown", "-R", format("{zeppelin_user}") + ":" + format("{zeppelin_group}"), params.zeppelin_pid_dir),
+             sudo=True)
+ 
+   def configure(self, env):
+     import params
+     import status_params
+     env.set_params(params)
+     env.set_params(status_params)
+     self.create_zeppelin_log_dir(env)
+ 
+     # create the pid and zeppelin dirs
+     Directory([params.zeppelin_pid_dir, params.zeppelin_dir],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               cd_access="a",
+               create_parents=True,
+               mode=0755
+     )
+     self.chown_zeppelin_pid_dir(env)
+ 
+     # write out zeppelin-site.xml
+     XmlConfig("zeppelin-site.xml",
+               conf_dir=params.conf_dir,
+               configurations=params.config['configurations']['zeppelin-config'],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group
+               )
+     # write out zeppelin-env.sh
+     env_content = InlineTemplate(params.zeppelin_env_content)
+     File(format("{params.conf_dir}/zeppelin-env.sh"), content=env_content,
+          owner=params.zeppelin_user, group=params.zeppelin_group)
+ 
+     # write out shiro.ini
+     shiro_ini_content = InlineTemplate(params.shiro_ini_content)
+     File(format("{params.conf_dir}/shiro.ini"), content=shiro_ini_content,
+          owner=params.zeppelin_user, group=params.zeppelin_group)
+ 
+     # write out log4j.properties
+     File(format("{params.conf_dir}/log4j.properties"), content=params.log4j_properties_content,
+          owner=params.zeppelin_user, group=params.zeppelin_group)
+ 
+     self.create_zeppelin_hdfs_conf_dir(env)
+ 
+     if len(params.hbase_master_hosts) > 0 and params.is_hbase_installed:
+       # copy hbase-site.xml
+       XmlConfig("hbase-site.xml",
+               conf_dir=params.external_dependency_conf,
+               configurations=params.config['configurations']['hbase-site'],
 -              configuration_attributes=params.config['configuration_attributes']['hbase-site'],
++              configuration_attributes=params.config['configurationAttributes']['hbase-site'],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               mode=0644)
+ 
+       XmlConfig("hdfs-site.xml",
+                 conf_dir=params.external_dependency_conf,
+                 configurations=params.config['configurations']['hdfs-site'],
 -                configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
++                configuration_attributes=params.config['configurationAttributes']['hdfs-site'],
+                 owner=params.zeppelin_user,
+                 group=params.zeppelin_group,
+                 mode=0644)
+ 
+       XmlConfig("core-site.xml",
+                 conf_dir=params.external_dependency_conf,
+                 configurations=params.config['configurations']['core-site'],
 -                configuration_attributes=params.config['configuration_attributes']['core-site'],
++                configuration_attributes=params.config['configurationAttributes']['core-site'],
+                 owner=params.zeppelin_user,
+                 group=params.zeppelin_group,
+                 mode=0644)
+ 
+   def check_and_copy_notebook_in_hdfs(self, params):
+     if params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir'].startswith("/"):
+       notebook_directory = params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir']
+     else:
+       notebook_directory = "/user/" + format("{zeppelin_user}") + "/" + \
+                            params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir']
+ 
+     kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
+     kinit_if_needed = format("{kinit_path_local} -kt {zeppelin_kerberos_keytab} {zeppelin_kerberos_principal};")
+ 
+     notebook_directory_exists = shell.call(format("{kinit_if_needed} hdfs --config {hadoop_conf_dir} dfs -test -e {notebook_directory};echo $?"),
+                                            user=params.zeppelin_user)[1]
+ 
+     #if there is no kerberos setup then the string will contain "-bash: kinit: command not found"
+     if "\n" in notebook_directory_exists:
+       notebook_directory_exists = notebook_directory_exists.split("\n")[1]
+ 
+     # '1' means it does not exists
+     if notebook_directory_exists == '1':
+       # hdfs dfs -mkdir {notebook_directory}
+       params.HdfsResource(format("{notebook_directory}"),
+                           type="directory",
+                           action="create_on_execute",
+                           owner=params.zeppelin_user,
+                           recursive_chown=True,
+                           recursive_chmod=True
+                           )
+ 
+       # hdfs dfs -put /usr/hdp/current/zeppelin-server/notebook/ {notebook_directory}
+       params.HdfsResource(format("{notebook_directory}"),
+                             type="directory",
+                             action="create_on_execute",
+                             source=params.notebook_dir,
+                             owner=params.zeppelin_user,
+                             recursive_chown=True,
+                             recursive_chmod=True
+                             )
+ 
+ 
+   def stop(self, env, upgrade_type=None):
+     import params
+     self.create_zeppelin_log_dir(env)
+     self.chown_zeppelin_pid_dir(env)
+     Execute(params.zeppelin_dir + '/bin/zeppelin-daemon.sh stop >> ' + params.zeppelin_log_file,
+             user=params.zeppelin_user)
+ 
+   def start(self, env, upgrade_type=None):
+     import params
+     import status_params
+     self.configure(env)
+ 
+     Execute(("chown", "-R", format("{zeppelin_user}") + ":" + format("{zeppelin_group}"), "/etc/zeppelin"),
+             sudo=True)
+     Execute(("chown", "-R", format("{zeppelin_user}") + ":" + format("{zeppelin_group}"),
+              os.path.join(params.zeppelin_dir, "notebook")), sudo=True)
+ 
+     if 'zeppelin.notebook.storage' in params.config['configurations']['zeppelin-config'] \
+         and params.config['configurations']['zeppelin-config']['zeppelin.notebook.storage'] == 'org.apache.zeppelin.notebook.repo.FileSystemNotebookRepo':
+       self.check_and_copy_notebook_in_hdfs(params)
+ 
+     if params.security_enabled:
+         zeppelin_kinit_cmd = format("{kinit_path_local} -kt {zeppelin_kerberos_keytab} {zeppelin_kerberos_principal}; ")
+         Execute(zeppelin_kinit_cmd, user=params.zeppelin_user)
+ 
+     zeppelin_spark_dependencies = self.get_zeppelin_spark_dependencies()
+     if zeppelin_spark_dependencies and os.path.exists(zeppelin_spark_dependencies[0]):
+       self.create_zeppelin_dir(params)
+ 
+     # if first_setup:
+     if not glob.glob(params.conf_dir + "/interpreter.json") and \
+       not os.path.exists(params.conf_dir + "/interpreter.json"):
+       self.create_interpreter_json()
+       self.update_zeppelin_interpreter()
+ 
+     if params.zeppelin_interpreter_config_upgrade == True:
+       self.reset_interpreter_settings()
+       self.update_zeppelin_interpreter()
+ 
+     Execute(params.zeppelin_dir + '/bin/zeppelin-daemon.sh restart >> '
+             + params.zeppelin_log_file, user=params.zeppelin_user)
+     pidfile = glob.glob(os.path.join(status_params.zeppelin_pid_dir,
+                                      'zeppelin-' + params.zeppelin_user + '*.pid'))[0]
+     Logger.info(format("Pid file is: {pidfile}"))
+ 
+   def status(self, env):
+     import status_params
+     env.set_params(status_params)
+ 
+     try:
+         pid_file = glob.glob(status_params.zeppelin_pid_dir + '/zeppelin-' +
+                              status_params.zeppelin_user + '*.pid')[0]
+     except IndexError:
+         pid_file = ''
+     check_process_status(pid_file)
+ 
+   def reset_interpreter_settings(self):
+     import json
+     import interpreter_json_template
+     interpreter_json_template = json.loads(interpreter_json_template.template)['interpreterSettings']
+     config_data = self.get_interpreter_settings()
+     interpreter_settings = config_data['interpreterSettings']
+ 
+     for setting_key in interpreter_json_template.keys():
+       if setting_key not in interpreter_settings:
+         interpreter_settings[setting_key] = interpreter_json_template[
+           setting_key]
+ 
+     self.set_interpreter_settings(config_data)
+ 
+   def get_interpreter_settings(self):
+     import params
+     import json
+ 
+     interpreter_config = os.path.join(params.conf_dir, "interpreter.json")
+     config_content = sudo.read_file(interpreter_config)
+     config_data = json.loads(config_content)
+     return config_data
+ 
+   def pre_upgrade_restart(self, env, upgrade_type=None):
+     Logger.info("Executing Stack Upgrade pre-restart")
+     import params
+     env.set_params(params)
+ 
+     if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, format_stack_version(params.version)):
+       stack_select.select_packages(params.version)
+ 
+   def set_interpreter_settings(self, config_data):
+     import params
+     import json
+ 
+     interpreter_config = os.path.join(params.conf_dir, "interpreter.json")
+     File(interpreter_config,
+          group=params.zeppelin_group,
+          owner=params.zeppelin_user,
+          content=json.dumps(config_data, indent=2)
+          )
+ 
+   def update_kerberos_properties(self):
+     import params
+     config_data = self.get_interpreter_settings()
+     interpreter_settings = config_data['interpreterSettings']
+     for interpreter_setting in interpreter_settings:
+       interpreter = interpreter_settings[interpreter_setting]
+       if interpreter['group'] == 'livy' and params.livy_livyserver_host:
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['zeppelin.livy.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['zeppelin.livy.keytab'] = params.zeppelin_kerberos_keytab
+         else:
+           interpreter['properties']['zeppelin.livy.principal'] = ""
+           interpreter['properties']['zeppelin.livy.keytab'] = ""
+       elif interpreter['group'] == 'spark':
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['spark.yarn.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['spark.yarn.keytab'] = params.zeppelin_kerberos_keytab
+         else:
+           interpreter['properties']['spark.yarn.principal'] = ""
+           interpreter['properties']['spark.yarn.keytab'] = ""
+       elif interpreter['group'] == 'jdbc':
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['zeppelin.jdbc.auth.type'] = "KERBEROS"
+           interpreter['properties']['zeppelin.jdbc.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['zeppelin.jdbc.keytab.location'] = params.zeppelin_kerberos_keytab
+           if params.zookeeper_znode_parent \
+               and params.hbase_zookeeper_quorum \
+               and 'phoenix.url' in interpreter['properties'] \
+               and params.zookeeper_znode_parent not in interpreter['properties']['phoenix.url']:
+             interpreter['properties']['phoenix.url'] = "jdbc:phoenix:" + \
+                                                        params.hbase_zookeeper_quorum + ':' + \
+                                                        params.zookeeper_znode_parent
+         else:
+           interpreter['properties']['zeppelin.jdbc.auth.type'] = "SIMPLE"
+           interpreter['properties']['zeppelin.jdbc.principal'] = ""
+           interpreter['properties']['zeppelin.jdbc.keytab.location'] = ""
+       elif interpreter['group'] == 'sh':
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['zeppelin.shell.auth.type'] = "KERBEROS"
+           interpreter['properties']['zeppelin.shell.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['zeppelin.shell.keytab.location'] = params.zeppelin_kerberos_keytab
+         else:
+           interpreter['properties']['zeppelin.shell.auth.type'] = ""
+           interpreter['properties']['zeppelin.shell.principal'] = ""
+           interpreter['properties']['zeppelin.shell.keytab.location'] = ""
+ 
+     self.set_interpreter_settings(config_data)
+ 
+   def update_zeppelin_interpreter(self):
+     import params
+     config_data = self.get_interpreter_settings()
+     interpreter_settings = config_data['interpreterSettings']
+ 
+     if 'spark2-defaults' in params.config['configurations']:
+       spark2_config = self.get_spark2_interpreter_config()
+       config_id = spark2_config["id"]
+       interpreter_settings[config_id] = spark2_config
+ 
+     if params.livy2_livyserver_host:
+       livy2_config = self.get_livy2_interpreter_config()
+       config_id = livy2_config["id"]
+       interpreter_settings[config_id] = livy2_config
+ 
+     if params.zeppelin_interpreter:
+       settings_to_delete = []
+       for settings_key, interpreter in interpreter_settings.items():
+         if interpreter['group'] not in params.zeppelin_interpreter:
+           settings_to_delete.append(settings_key)
+ 
+       for key in settings_to_delete:
+         del interpreter_settings[key]
+ 
+     hive_interactive_properties_key = 'hive_interactive'
+     for setting_key in interpreter_settings.keys():
+       interpreter = interpreter_settings[setting_key]
+       if interpreter['group'] == 'jdbc':
+         interpreter['dependencies'] = []
+ 
+         if not params.hive_server_host and params.hive_server_interactive_hosts:
+           hive_interactive_properties_key = 'hive'
+ 
+         if params.hive_server_host:
+           interpreter['properties']['hive.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties']['hive.user'] = 'hive'
+           interpreter['properties']['hive.password'] = ''
+           interpreter['properties']['hive.proxy.user.property'] = 'hive.server2.proxy.user'
+           if params.hive_server2_support_dynamic_service_discovery:
+             interpreter['properties']['hive.url'] = 'jdbc:hive2://' + \
+                                                  params.hive_zookeeper_quorum + \
+                                                  '/;' + 'serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=' + \
+                                                     params.hive_zookeeper_namespace
+           else:
+             interpreter['properties']['hive.url'] = 'jdbc:hive2://' + \
+                                                  params.hive_server_host + \
+                                                      ':' + params.hive_server_port
+         if params.hive_server_interactive_hosts:
+           interpreter['properties'][hive_interactive_properties_key + '.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties'][hive_interactive_properties_key + '.user'] = 'hive'
+           interpreter['properties'][hive_interactive_properties_key + '.password'] = ''
+           interpreter['properties'][hive_interactive_properties_key + '.proxy.user.property'] = 'hive.server2.proxy.user'
+           if params.hive_server2_support_dynamic_service_discovery:
+             interpreter['properties'][hive_interactive_properties_key + '.url'] = 'jdbc:hive2://' + \
+                                                     params.hive_zookeeper_quorum + \
+                                                     '/;' + 'serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=' + \
+                                                     params.hive_interactive_zookeeper_namespace
+           else:
+             interpreter['properties'][hive_interactive_properties_key + '.url'] = 'jdbc:hive2://' + \
+                                                     params.hive_server_interactive_hosts + \
+                                                     ':' + params.hive_server_port
+ 
+         if params.spark_thrift_server_hosts:
+           interpreter['properties']['spark.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties']['spark.user'] = 'hive'
+           interpreter['properties']['spark.password'] = ''
+           interpreter['properties']['spark.proxy.user.property'] = 'hive.server2.proxy.user'
+           interpreter['properties']['spark.url'] = 'jdbc:hive2://' + \
+               params.spark_thrift_server_hosts + ':' + params.spark_hive_thrift_port + '/'
+           if params.spark_hive_principal:
+             interpreter['properties']['spark.url'] += ';principal=' + params.spark_hive_principal
+ 
+         if params.spark2_thrift_server_hosts:
+           interpreter['properties']['spark2.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties']['spark2.user'] = 'hive'
+           interpreter['properties']['spark2.password'] = ''
+           interpreter['properties']['spark2.proxy.user.property'] = 'hive.server2.proxy.user'
+           interpreter['properties']['spark2.url'] = 'jdbc:hive2://' + \
+               params.spark2_thrift_server_hosts + ':' + params.spark2_hive_thrift_port + '/'
+           if params.spark_hive_principal:
+             interpreter['properties']['spark2.url'] += ';principal=' + params.spark2_hive_principal
+ 
+         if params.zookeeper_znode_parent \
+                 and params.hbase_zookeeper_quorum:
+             interpreter['properties']['phoenix.driver'] = 'org.apache.phoenix.jdbc.PhoenixDriver'
+             interpreter['properties']['phoenix.hbase.client.retries.number'] = '1'
+             interpreter['properties']['phoenix.user'] = 'phoenixuser'
+             interpreter['properties']['phoenix.password'] = ''
+             interpreter['properties']['phoenix.url'] = "jdbc:phoenix:" + \
+                                                     params.hbase_zookeeper_quorum + ':' + \
+                                                     params.zookeeper_znode_parent
+ 
+       elif interpreter['group'] == 'livy' and interpreter['name'] == 'livy':
+         if params.livy_livyserver_host:
+           interpreter['properties']['zeppelin.livy.url'] = "http://" + params.livy_livyserver_host + \
+                                                            ":" + params.livy_livyserver_port
+         else:
+           del interpreter_settings[setting_key]
+ 
+       elif interpreter['group'] == 'livy' and interpreter['name'] == 'livy2':
+         if params.livy2_livyserver_host:
+           interpreter['properties']['zeppelin.livy.url'] = "http://" + params.livy2_livyserver_host + \
+                                                            ":" + params.livy2_livyserver_port
+         else:
+           del interpreter_settings[setting_key]
+ 
+ 
+       elif interpreter['group'] == 'spark' and interpreter['name'] == 'spark':
+         if 'spark-env' in params.config['configurations']:
+           interpreter['properties']['master'] = "yarn-client"
+           interpreter['properties']['SPARK_HOME'] = "/usr/hdp/current/spark-client/"
+         else:
+           del interpreter_settings[setting_key]
+ 
+       elif interpreter['group'] == 'spark' and interpreter['name'] == 'spark2':
+         if 'spark2-env' in params.config['configurations']:
+           interpreter['properties']['master'] = "yarn-client"
+           interpreter['properties']['SPARK_HOME'] = "/usr/hdp/current/spark2-client/"
+         else:
+           del interpreter_settings[setting_key]
+ 
+     self.set_interpreter_settings(config_data)
+     self.update_kerberos_properties()
+ 
+   def create_interpreter_json(self):
+     import interpreter_json_template
+     import params
+ 
+     interpreter_json = interpreter_json_template.template
+     File(format("{params.conf_dir}/interpreter.json"), content=interpreter_json,
+          owner=params.zeppelin_user, group=params.zeppelin_group)
+ 
+   def get_zeppelin_spark_dependencies(self):
+     import params
+     return glob.glob(params.zeppelin_dir + '/interpreter/spark/dep/zeppelin-spark-dependencies*.jar')
+ 
+   def get_spark2_interpreter_config(self):
+     import spark2_config_template
+     import json
+ 
+     return json.loads(spark2_config_template.template)
+ 
+   def get_livy2_interpreter_config(self):
+     import livy2_config_template
+     import json
+ 
+     return json.loads(livy2_config_template.template)
+ 
+ if __name__ == "__main__":
+   Master().execute()

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py
index 0000000,3242f26..dd370bd
mode 000000,100644..100644
--- a/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py
@@@ -1,0 -1,258 +1,258 @@@
+ #!/usr/bin/env python
+ """
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+     http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ 
+ """
+ 
+ import functools
+ import os
+ import re
+ from resource_management.libraries.functions import StackFeature
+ from resource_management.libraries.functions import conf_select
+ from resource_management.libraries.functions import get_kinit_path
+ from resource_management.libraries.functions import stack_select
+ from resource_management.libraries.functions.default import default
+ from resource_management.libraries.functions.format import format
+ from resource_management.libraries.functions.get_stack_version import get_stack_version
+ from resource_management.libraries.functions.stack_features import check_stack_feature
+ from resource_management.libraries.functions.version import format_stack_version, get_major_version
+ from resource_management.libraries.resources.hdfs_resource import HdfsResource
+ from resource_management.libraries.script.script import Script
+ 
+ def get_port_from_url(address):
+   if not (address is None):
+     return address.split(':')[-1]
+   else:
+     return address
+ 
+ def extract_spark_version(spark_home):
+   try:
+     with open(spark_home + "/RELEASE") as fline:
+       return re.search('Spark (\d\.\d).+', fline.readline().rstrip()).group(1)
+   except:
+     pass
+   return None
+ 
+ 
+ # server configurations
+ config = Script.get_config()
+ stack_root = Script.get_stack_root()
+ 
+ # e.g. /var/lib/ambari-agent/cache/stacks/HDP/2.2/services/zeppelin-stack/package
+ service_packagedir = os.path.realpath(__file__).split('/scripts')[0]
+ 
+ zeppelin_dirname = 'zeppelin-server'
+ 
+ install_dir = os.path.join(stack_root, "current")
+ executor_mem = config['configurations']['zeppelin-env']['zeppelin.executor.mem']
+ executor_instances = config['configurations']['zeppelin-env'][
+   'zeppelin.executor.instances']
+ 
+ security_enabled = config['configurations']['cluster-env']['security_enabled']
+ 
+ spark_jar_dir = config['configurations']['zeppelin-env']['zeppelin.spark.jar.dir']
+ spark_jar = format("{spark_jar_dir}/zeppelin-spark-0.5.5-SNAPSHOT.jar")
+ setup_view = True
+ temp_file = config['configurations']['zeppelin-env']['zeppelin.temp.file']
+ 
+ spark_home = ""
+ spark_version = None
+ spark2_home = ""
+ spark2_version = None
+ if 'spark-defaults' in config['configurations']:
+   spark_home = os.path.join(stack_root, "current", 'spark-client')
+   spark_version = extract_spark_version(spark_home)
+ if 'spark2-defaults' in config['configurations']:
+   spark2_home = os.path.join(stack_root, "current", 'spark2-client')
+   spark2_version = extract_spark_version(spark2_home)
+ 
+ # New Cluster Stack Version that is defined during the RESTART of a Rolling Upgrade
+ version = default("/commandParams/version", None)
 -stack_name = default("/hostLevelParams/stack_name", None)
++stack_name = default("/clusterLevelParams/stack_name", None)
+ 
+ # params from zeppelin-config
+ zeppelin_port = str(config['configurations']['zeppelin-config']['zeppelin.server.port'])
+ zeppelin_interpreter = None
+ if 'zeppelin.interpreter.group.order' in config['configurations']['zeppelin-config']:
+   zeppelin_interpreter = str(config['configurations']['zeppelin-config']
+                              ['zeppelin.interpreter.group.order']).split(",")
+ 
+ # params from zeppelin-env
+ zeppelin_user = config['configurations']['zeppelin-env']['zeppelin_user']
+ zeppelin_group = config['configurations']['zeppelin-env']['zeppelin_group']
+ zeppelin_log_dir = config['configurations']['zeppelin-env']['zeppelin_log_dir']
+ zeppelin_pid_dir = config['configurations']['zeppelin-env']['zeppelin_pid_dir']
+ zeppelin_log_file = os.path.join(zeppelin_log_dir, 'zeppelin-setup.log')
+ zeppelin_hdfs_user_dir = format("/user/{zeppelin_user}")
+ 
+ zeppelin_dir = os.path.join(*[install_dir, zeppelin_dirname])
+ conf_dir = "/etc/zeppelin/conf"
+ external_dependency_conf = "/etc/zeppelin/conf/external-dependency-conf"
+ notebook_dir = os.path.join(*[install_dir, zeppelin_dirname, 'notebook'])
+ 
+ # zeppelin-env.sh
+ zeppelin_env_content = config['configurations']['zeppelin-env']['zeppelin_env_content']
+ 
+ # shiro.ini
+ shiro_ini_content = config['configurations']['zeppelin-shiro-ini']['shiro_ini_content']
+ 
+ # log4j.properties
+ log4j_properties_content = config['configurations']['zeppelin-log4j-properties']['log4j_properties_content']
+ 
+ # detect configs
+ master_configs = config['clusterHostInfo']
 -java64_home = config['hostLevelParams']['java_home']
++java64_home = config['ambariLevelParams']['java_home']
+ ambari_host = str(master_configs['ambari_server_host'][0])
+ zeppelin_host = str(master_configs['zeppelin_master_hosts'][0])
+ ui_ssl_enabled = config['configurations']['zeppelin-config']['zeppelin.ssl']
+ 
+ # detect HS2 details, if installed
+ 
+ hive_server_host = None
+ hive_metastore_host = '0.0.0.0'
+ hive_metastore_port = None
+ hive_server_port = None
+ hive_zookeeper_quorum = None
+ hive_server2_support_dynamic_service_discovery = None
+ is_hive_installed = False
+ hive_zookeeper_namespace = None
+ hive_interactive_zookeeper_namespace = None
+ 
+ if 'hive_server_host' in master_configs and len(master_configs['hive_server_host']) != 0:
+   is_hive_installed = True
+   spark_hive_properties = {
+     'hive.metastore.uris': default('/configurations/hive-site/hive.metastore.uris', '')
+   }
+   hive_server_host = str(master_configs['hive_server_host'][0])
+   hive_metastore_host = str(master_configs['hive_metastore_host'][0])
+   hive_metastore_port = str(
+     get_port_from_url(default('/configurations/hive-site/hive.metastore.uris', '')))
+   hive_server_port = str(config['configurations']['hive-site']['hive.server2.thrift.http.port'])
+   hive_zookeeper_quorum = config['configurations']['hive-site']['hive.zookeeper.quorum']
+   hive_zookeeper_namespace = config['configurations']['hive-site']['hive.server2.zookeeper.namespace']
+   hive_server2_support_dynamic_service_discovery = config['configurations']['hive-site']['hive.server2.support.dynamic.service.discovery']
+ 
+ hive_server_interactive_hosts = None
+ if 'hive_server_interactive_hosts' in master_configs and len(master_configs['hive_server_interactive_hosts']) != 0:
+     hive_server_interactive_hosts = str(master_configs['hive_server_interactive_hosts'][0])
+     hive_interactive_zookeeper_namespace = config['configurations']['hive-interactive-site']['hive.server2.zookeeper.namespace']
+     hive_server_port = str(config['configurations']['hive-site']['hive.server2.thrift.http.port'])
+     hive_zookeeper_quorum = config['configurations']['hive-site']['hive.zookeeper.quorum']
+     hive_server2_support_dynamic_service_discovery = config['configurations']['hive-site']['hive.server2.support.dynamic.service.discovery']
+ 
+ spark_thrift_server_hosts = None
+ spark_hive_thrift_port = None
+ spark_hive_principal = None
+ if 'spark_thriftserver_hosts' in master_configs and len(master_configs['spark_thriftserver_hosts']) != 0:
+   spark_thrift_server_hosts = str(master_configs['spark_thriftserver_hosts'][0])
+   if config['configurations']['spark-hive-site-override']:
+     spark_hive_thrift_port = config['configurations']['spark-hive-site-override']['hive.server2.thrift.port']
+   if config['configurations']['spark-thrift-sparkconf'] and \
+       'spark.sql.hive.hiveserver2.jdbc.url.principal' in config['configurations']['spark-thrift-sparkconf']:
+     spark_hive_principal = config['configurations']['spark-thrift-sparkconf']['spark.sql.hive.hiveserver2.jdbc.url.principal']
+ 
+ spark2_thrift_server_hosts = None
+ spark2_hive_thrift_port = None
+ spark2_hive_principal = None
+ if 'spark2_thriftserver_hosts' in master_configs and len(master_configs['spark2_thriftserver_hosts']) != 0:
+   spark2_thrift_server_hosts = str(master_configs['spark2_thriftserver_hosts'][0])
+   if config['configurations']['spark2-hive-site-override']:
+     spark2_hive_thrift_port = config['configurations']['spark2-hive-site-override']['hive.server2.thrift.port']
+   if config['configurations']['spark2-thrift-sparkconf'] and \
+       'spark.sql.hive.hiveserver2.jdbc.url.principal' in config['configurations']['spark2-thrift-sparkconf']:
+     spark2_hive_principal = config['configurations']['spark2-thrift-sparkconf']['spark.sql.hive.hiveserver2.jdbc.url.principal']
+ 
+ 
+ # detect hbase details if installed
+ zookeeper_znode_parent = None
+ hbase_zookeeper_quorum = None
+ is_hbase_installed = False
+ if 'hbase_master_hosts' in master_configs and 'hbase-site' in config['configurations']:
+   is_hbase_installed = True
+   zookeeper_znode_parent = config['configurations']['hbase-site']['zookeeper.znode.parent']
+   hbase_zookeeper_quorum = config['configurations']['hbase-site']['hbase.zookeeper.quorum']
+ 
+ # detect spark queue
+ if 'spark-defaults' in config['configurations'] and 'spark.yarn.queue' in config['configurations']['spark-defaults']:
+   spark_queue = config['configurations']['spark-defaults']['spark.yarn.queue']
+ elif 'spark2-defaults' in config['configurations'] and 'spark.yarn.queue' in config['configurations']['spark2-defaults']:
+   spark_queue = config['configurations']['spark2-defaults']['spark.yarn.queue']
+ else:
+   spark_queue = 'default'
+ 
+ zeppelin_kerberos_keytab = config['configurations']['zeppelin-env']['zeppelin.server.kerberos.keytab']
+ zeppelin_kerberos_principal = config['configurations']['zeppelin-env']['zeppelin.server.kerberos.principal']
+ if 'zeppelin.interpreter.config.upgrade' in config['configurations']['zeppelin-config']:
+   zeppelin_interpreter_config_upgrade = config['configurations']['zeppelin-config']['zeppelin.interpreter.config.upgrade']
+ else:
+   zeppelin_interpreter_config_upgrade = False
+ 
+ # e.g. 2.3
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
++stack_version_unformatted = config['clusterLevelParams']['stack_version']
+ 
+ # e.g. 2.3.0.0
+ stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
+ 
+ # e.g. 2.3.0.0-2130
+ full_stack_version = default("/commandParams/version", None)
+ 
+ spark_client_version = get_stack_version('spark-client')
+ 
+ hbase_master_hosts = default("/clusterHostInfo/hbase_master_hosts", [])
+ livy_hosts = default("/clusterHostInfo/livy_server_hosts", [])
+ livy2_hosts = default("/clusterHostInfo/livy2_server_hosts", [])
+ 
+ livy_livyserver_host = None
+ livy_livyserver_port = None
+ livy2_livyserver_host = None
+ livy2_livyserver_port = None
+ if stack_version_formatted and check_stack_feature(StackFeature.SPARK_LIVY, stack_version_formatted) and \
+     len(livy_hosts) > 0:
+   livy_livyserver_host = str(livy_hosts[0])
+   livy_livyserver_port = config['configurations']['livy-conf']['livy.server.port']
+ 
+ if stack_version_formatted and check_stack_feature(StackFeature.SPARK_LIVY2, stack_version_formatted) and \
+     len(livy2_hosts) > 0:
+   livy2_livyserver_host = str(livy2_hosts[0])
+   livy2_livyserver_port = config['configurations']['livy2-conf']['livy.server.port']
+ 
+ hdfs_user = config['configurations']['hadoop-env']['hdfs_user']
+ security_enabled = config['configurations']['cluster-env']['security_enabled']
+ hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab']
+ kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
+ hadoop_bin_dir = stack_select.get_hadoop_dir("bin")
+ hadoop_conf_dir = conf_select.get_hadoop_conf_dir()
+ hdfs_principal_name = config['configurations']['hadoop-env']['hdfs_principal_name']
+ hdfs_site = config['configurations']['hdfs-site']
+ default_fs = config['configurations']['core-site']['fs.defaultFS']
+ 
+ # create partial functions with common arguments for every HdfsResource call
+ # to create hdfs directory we need to call params.HdfsResource in code
+ HdfsResource = functools.partial(
+   HdfsResource,
+   user=hdfs_user,
+   hdfs_resource_ignore_file="/var/lib/ambari-agent/data/.hdfs_resource_ignore",
+   security_enabled=security_enabled,
+   keytab=hdfs_user_keytab,
+   kinit_path_local=kinit_path_local,
+   hadoop_bin_dir=hadoop_bin_dir,
+   hadoop_conf_dir=hadoop_conf_dir,
+   principal_name=hdfs_principal_name,
+   hdfs_site=hdfs_site,
+   default_fs=default_fs
+ )

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
index 0000000,8bdfaec..e1b21b6
mode 000000,100644..100644
--- a/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
+++ b/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py
@@@ -1,0 -1,564 +1,564 @@@
+ #!/usr/bin/env python
+ """
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+     http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ 
+ """
+ 
+ import glob
+ import os
+ 
+ from resource_management.core import shell, sudo
+ from resource_management.core.logger import Logger
+ from resource_management.core.exceptions import Fail
+ from resource_management.core.resources import Directory
+ from resource_management.core.resources.system import Execute, File
+ from resource_management.core.source import InlineTemplate
+ from resource_management.libraries import XmlConfig
+ from resource_management.libraries.functions import StackFeature
+ from resource_management.libraries.functions import get_kinit_path
+ from resource_management.libraries.functions import stack_select
+ from resource_management.libraries.functions.check_process_status import check_process_status
+ from resource_management.libraries.functions.default import default
+ from resource_management.libraries.functions.format import format
+ from resource_management.libraries.functions.stack_features import check_stack_feature
+ from resource_management.libraries.functions.version import format_stack_version
+ from resource_management.libraries.script.script import Script
+ 
+ 
+ class Master(Script):
+   def install(self, env):
+     import params
+     env.set_params(params)
+     self.install_packages(env)
+ 
+     self.create_zeppelin_log_dir(env)
+ 
+     if params.spark_version:
+       Execute('echo spark_version:' + str(params.spark_version) + ' detected for spark_home: '
+               + params.spark_home + ' >> ' + params.zeppelin_log_file, user=params.zeppelin_user)
+     if params.spark2_version:
+       Execute('echo spark2_version:' + str(params.spark2_version) + ' detected for spark2_home: '
+               + params.spark2_home + ' >> ' + params.zeppelin_log_file, user=params.zeppelin_user)
+ 
+   def create_zeppelin_dir(self, params):
+     params.HdfsResource(format("/user/{zeppelin_user}"),
+                         type="directory",
+                         action="create_on_execute",
+                         owner=params.zeppelin_user,
+                         recursive_chown=True,
+                         recursive_chmod=True
+                         )
+     params.HdfsResource(format("/user/{zeppelin_user}/test"),
+                         type="directory",
+                         action="create_on_execute",
+                         owner=params.zeppelin_user,
+                         recursive_chown=True,
+                         recursive_chmod=True
+                         )
+     params.HdfsResource(format("/apps/zeppelin"),
+                         type="directory",
+                         action="create_on_execute",
+                         owner=params.zeppelin_user,
+                         recursive_chown=True,
+                         recursive_chmod=True
+                         )
+ 
+     spark_deps_full_path = self.get_zeppelin_spark_dependencies()[0]
+     spark_dep_file_name = os.path.basename(spark_deps_full_path)
+ 
+     params.HdfsResource(params.spark_jar_dir + "/" + spark_dep_file_name,
+                         type="file",
+                         action="create_on_execute",
+                         source=spark_deps_full_path,
+                         group=params.zeppelin_group,
+                         owner=params.zeppelin_user,
+                         mode=0444,
+                         replace_existing_files=True,
+                         )
+ 
+     params.HdfsResource(None, action="execute")
+ 
+   def create_zeppelin_log_dir(self, env):
+     import params
+     env.set_params(params)
+     Directory([params.zeppelin_log_dir],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               cd_access="a",
+               create_parents=True,
+               mode=0755
+               )
+ 
+   def create_zeppelin_hdfs_conf_dir(self, env):
+     import params
+     env.set_params(params)
+     Directory([params.external_dependency_conf],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               cd_access="a",
+               create_parents=True,
+               mode=0755
+               )
+ 
+   def chown_zeppelin_pid_dir(self, env):
+     import params
+     env.set_params(params)
+     Execute(("chown", "-R", format("{zeppelin_user}") + ":" + format("{zeppelin_group}"), params.zeppelin_pid_dir),
+             sudo=True)
+ 
+   def configure(self, env):
+     import params
+     import status_params
+     env.set_params(params)
+     env.set_params(status_params)
+     self.create_zeppelin_log_dir(env)
+ 
+     # create the pid and zeppelin dirs
+     Directory([params.zeppelin_pid_dir, params.zeppelin_dir],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               cd_access="a",
+               create_parents=True,
+               mode=0755
+     )
+     self.chown_zeppelin_pid_dir(env)
+ 
+     # write out zeppelin-site.xml
+     XmlConfig("zeppelin-site.xml",
+               conf_dir=params.conf_dir,
+               configurations=params.config['configurations']['zeppelin-config'],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group
+               )
+     # write out zeppelin-env.sh
+     env_content = InlineTemplate(params.zeppelin_env_content)
+     File(format("{params.conf_dir}/zeppelin-env.sh"), content=env_content,
+          owner=params.zeppelin_user, group=params.zeppelin_group)
+ 
+     # write out shiro.ini
+     shiro_ini_content = InlineTemplate(params.shiro_ini_content)
+     File(format("{params.conf_dir}/shiro.ini"), content=shiro_ini_content,
+          owner=params.zeppelin_user, group=params.zeppelin_group)
+ 
+     # write out log4j.properties
+     File(format("{params.conf_dir}/log4j.properties"), content=params.log4j_properties_content,
+          owner=params.zeppelin_user, group=params.zeppelin_group)
+ 
+     self.create_zeppelin_hdfs_conf_dir(env)
+ 
+     if len(params.hbase_master_hosts) > 0 and params.is_hbase_installed:
+       # copy hbase-site.xml
+       XmlConfig("hbase-site.xml",
+               conf_dir=params.external_dependency_conf,
+               configurations=params.config['configurations']['hbase-site'],
 -              configuration_attributes=params.config['configuration_attributes']['hbase-site'],
++              configuration_attributes=params.config['configurationAttributes']['hbase-site'],
+               owner=params.zeppelin_user,
+               group=params.zeppelin_group,
+               mode=0644)
+ 
+       XmlConfig("hdfs-site.xml",
+                 conf_dir=params.external_dependency_conf,
+                 configurations=params.config['configurations']['hdfs-site'],
 -                configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
++                configuration_attributes=params.config['configurationAttributes']['hdfs-site'],
+                 owner=params.zeppelin_user,
+                 group=params.zeppelin_group,
+                 mode=0644)
+ 
+       XmlConfig("core-site.xml",
+                 conf_dir=params.external_dependency_conf,
+                 configurations=params.config['configurations']['core-site'],
 -                configuration_attributes=params.config['configuration_attributes']['core-site'],
++                configuration_attributes=params.config['configurationAttributes']['core-site'],
+                 owner=params.zeppelin_user,
+                 group=params.zeppelin_group,
+                 mode=0644)
+ 
+   def check_and_copy_notebook_in_hdfs(self, params):
+     if params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir'].startswith("/"):
+       notebook_directory = params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir']
+     else:
+       notebook_directory = "/user/" + format("{zeppelin_user}") + "/" + \
+                            params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir']
+ 
+     kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
+     kinit_if_needed = format("{kinit_path_local} -kt {zeppelin_kerberos_keytab} {zeppelin_kerberos_principal};")
+ 
+     notebook_directory_exists = shell.call(format("{kinit_if_needed} hdfs --config {hadoop_conf_dir} dfs -test -e {notebook_directory};echo $?"),
+                                            user=params.zeppelin_user)[1]
+ 
+     #if there is no kerberos setup then the string will contain "-bash: kinit: command not found"
+     if "\n" in notebook_directory_exists:
+       notebook_directory_exists = notebook_directory_exists.split("\n")[1]
+ 
+     # '1' means it does not exists
+     if notebook_directory_exists == '1':
+       # hdfs dfs -mkdir {notebook_directory}
+       params.HdfsResource(format("{notebook_directory}"),
+                           type="directory",
+                           action="create_on_execute",
+                           owner=params.zeppelin_user,
+                           recursive_chown=True,
+                           recursive_chmod=True
+                           )
+ 
+       # hdfs dfs -put /usr/hdp/current/zeppelin-server/notebook/ {notebook_directory}
+       params.HdfsResource(format("{notebook_directory}"),
+                             type="directory",
+                             action="create_on_execute",
+                             source=params.notebook_dir,
+                             owner=params.zeppelin_user,
+                             recursive_chown=True,
+                             recursive_chmod=True
+                             )
+ 
+ 
+   def stop(self, env, upgrade_type=None):
+     import params
+     self.create_zeppelin_log_dir(env)
+     self.chown_zeppelin_pid_dir(env)
+     Execute(params.zeppelin_dir + '/bin/zeppelin-daemon.sh stop >> ' + params.zeppelin_log_file,
+             user=params.zeppelin_user)
+ 
+   def start(self, env, upgrade_type=None):
+     import params
+     import status_params
+     self.configure(env)
+ 
+     Execute(("chown", "-R", format("{zeppelin_user}") + ":" + format("{zeppelin_group}"), "/etc/zeppelin"),
+             sudo=True)
+     Execute(("chown", "-R", format("{zeppelin_user}") + ":" + format("{zeppelin_group}"),
+              os.path.join(params.zeppelin_dir, "notebook")), sudo=True)
+ 
+     if 'zeppelin.notebook.storage' in params.config['configurations']['zeppelin-config'] \
+         and params.config['configurations']['zeppelin-config']['zeppelin.notebook.storage'] == 'org.apache.zeppelin.notebook.repo.FileSystemNotebookRepo':
+       self.check_and_copy_notebook_in_hdfs(params)
+ 
+     if params.security_enabled:
+         zeppelin_kinit_cmd = format("{kinit_path_local} -kt {zeppelin_kerberos_keytab} {zeppelin_kerberos_principal}; ")
+         Execute(zeppelin_kinit_cmd, user=params.zeppelin_user)
+ 
+     zeppelin_spark_dependencies = self.get_zeppelin_spark_dependencies()
+     if zeppelin_spark_dependencies and os.path.exists(zeppelin_spark_dependencies[0]):
+       self.create_zeppelin_dir(params)
+ 
+     # if first_setup:
+     if not glob.glob(params.conf_dir + "/interpreter.json") and \
+       not os.path.exists(params.conf_dir + "/interpreter.json"):
+       self.create_interpreter_json()
+       self.update_zeppelin_interpreter()
+ 
+     if params.zeppelin_interpreter_config_upgrade == True:
+       self.reset_interpreter_settings()
+       self.update_zeppelin_interpreter()
+ 
+     Execute(params.zeppelin_dir + '/bin/zeppelin-daemon.sh restart >> '
+             + params.zeppelin_log_file, user=params.zeppelin_user)
+     pidfile = glob.glob(os.path.join(status_params.zeppelin_pid_dir,
+                                      'zeppelin-' + params.zeppelin_user + '*.pid'))[0]
+     Logger.info(format("Pid file is: {pidfile}"))
+ 
+   def status(self, env):
+     import status_params
+     env.set_params(status_params)
+ 
+     try:
+         pid_file = glob.glob(status_params.zeppelin_pid_dir + '/zeppelin-' +
+                              status_params.zeppelin_user + '*.pid')[0]
+     except IndexError:
+         pid_file = ''
+     check_process_status(pid_file)
+ 
+   def reset_interpreter_settings(self):
+     import json
+     import interpreter_json_template
+     interpreter_json_template = json.loads(interpreter_json_template.template)['interpreterSettings']
+     config_data = self.get_interpreter_settings()
+     interpreter_settings = config_data['interpreterSettings']
+ 
+     for setting_key in interpreter_json_template.keys():
+       if setting_key not in interpreter_settings:
+         interpreter_settings[setting_key] = interpreter_json_template[
+           setting_key]
+ 
+     self.set_interpreter_settings(config_data)
+ 
+   def pre_upgrade_restart(self, env, upgrade_type=None):
+     Logger.info("Executing Stack Upgrade pre-restart")
+     import params
+     env.set_params(params)
+ 
+     if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, format_stack_version(params.version)):
+       stack_select.select_packages(params.version)
+ 
+   def getZeppelinConfFS(self, params):
+     hdfs_interpreter_config = params.config['configurations']['zeppelin-config']['zeppelin.config.fs.dir'] + "/interpreter.json"
+ 
+     if not hdfs_interpreter_config.startswith("/"):
+       hdfs_interpreter_config = "/user/" + format("{zeppelin_user}") + "/" + hdfs_interpreter_config
+ 
+     return hdfs_interpreter_config
+ 
+   def get_interpreter_settings(self):
+     import params
+     import json
+ 
+     interpreter_config = os.path.join(params.conf_dir, "interpreter.json")
+     if 'zeppelin.notebook.storage' in params.config['configurations']['zeppelin-config'] \
+       and params.config['configurations']['zeppelin-config']['zeppelin.notebook.storage'] == 'org.apache.zeppelin.notebook.repo.FileSystemNotebookRepo':
+ 
+       if 'zeppelin.config.fs.dir' in params.config['configurations']['zeppelin-config']:
+         try:
+           # copy from hdfs to /etc/zeppelin/conf/interpreter.json
+           params.HdfsResource(interpreter_config,
+                               type="file",
+                               action="download_on_execute",
+                               source=self.getZeppelinConfFS(params),
+                               group=params.zeppelin_group,
+                               owner=params.zeppelin_user)
+         except Fail as fail:
+           if "doesn't exist" not in fail.args[0]:
+             print "Error getting interpreter.json from HDFS"
+             print fail.args
+             raise Fail
+ 
+     config_content = sudo.read_file(interpreter_config)
+     config_data = json.loads(config_content)
+     return config_data
+ 
+   def set_interpreter_settings(self, config_data):
+     import params
+     import json
+ 
+     interpreter_config = os.path.join(params.conf_dir, "interpreter.json")
+     File(interpreter_config,
+          group=params.zeppelin_group,
+          owner=params.zeppelin_user,
+          content=json.dumps(config_data, indent=2))
+ 
+     if 'zeppelin.notebook.storage' in params.config['configurations']['zeppelin-config'] \
+       and params.config['configurations']['zeppelin-config']['zeppelin.notebook.storage'] == 'org.apache.zeppelin.notebook.repo.FileSystemNotebookRepo':
+ 
+       if 'zeppelin.config.fs.dir' in params.config['configurations']['zeppelin-config']:
+         params.HdfsResource(self.getZeppelinConfFS(params),
+                             type="file",
+                             action="create_on_execute",
+                             source=interpreter_config,
+                             group=params.zeppelin_group,
+                             owner=params.zeppelin_user,
+                             user=params.zeppelin_user,
+                             replace_existing_files=True)
+ 
+   def update_kerberos_properties(self):
+     import params
+     config_data = self.get_interpreter_settings()
+     interpreter_settings = config_data['interpreterSettings']
+     for interpreter_setting in interpreter_settings:
+       interpreter = interpreter_settings[interpreter_setting]
+       if interpreter['group'] == 'livy' and params.livy_livyserver_host:
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['zeppelin.livy.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['zeppelin.livy.keytab'] = params.zeppelin_kerberos_keytab
+         else:
+           interpreter['properties']['zeppelin.livy.principal'] = ""
+           interpreter['properties']['zeppelin.livy.keytab'] = ""
+       elif interpreter['group'] == 'spark':
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['spark.yarn.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['spark.yarn.keytab'] = params.zeppelin_kerberos_keytab
+         else:
+           interpreter['properties']['spark.yarn.principal'] = ""
+           interpreter['properties']['spark.yarn.keytab'] = ""
+       elif interpreter['group'] == 'jdbc':
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['zeppelin.jdbc.auth.type'] = "KERBEROS"
+           interpreter['properties']['zeppelin.jdbc.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['zeppelin.jdbc.keytab.location'] = params.zeppelin_kerberos_keytab
+           if params.zookeeper_znode_parent \
+               and params.hbase_zookeeper_quorum \
+               and 'phoenix.url' in interpreter['properties'] \
+               and params.zookeeper_znode_parent not in interpreter['properties']['phoenix.url']:
+             interpreter['properties']['phoenix.url'] = "jdbc:phoenix:" + \
+                                                        params.hbase_zookeeper_quorum + ':' + \
+                                                        params.zookeeper_znode_parent
+         else:
+           interpreter['properties']['zeppelin.jdbc.auth.type'] = "SIMPLE"
+           interpreter['properties']['zeppelin.jdbc.principal'] = ""
+           interpreter['properties']['zeppelin.jdbc.keytab.location'] = ""
+       elif interpreter['group'] == 'sh':
+         if params.zeppelin_kerberos_principal and params.zeppelin_kerberos_keytab and params.security_enabled:
+           interpreter['properties']['zeppelin.shell.auth.type'] = "KERBEROS"
+           interpreter['properties']['zeppelin.shell.principal'] = params.zeppelin_kerberos_principal
+           interpreter['properties']['zeppelin.shell.keytab.location'] = params.zeppelin_kerberos_keytab
+         else:
+           interpreter['properties']['zeppelin.shell.auth.type'] = ""
+           interpreter['properties']['zeppelin.shell.principal'] = ""
+           interpreter['properties']['zeppelin.shell.keytab.location'] = ""
+ 
+     self.set_interpreter_settings(config_data)
+ 
+   def update_zeppelin_interpreter(self):
+     import params
+     config_data = self.get_interpreter_settings()
+     interpreter_settings = config_data['interpreterSettings']
+ 
+     if 'spark2-defaults' in params.config['configurations']:
+       spark2_config = self.get_spark2_interpreter_config()
+       config_id = spark2_config["id"]
+       interpreter_settings[config_id] = spark2_config
+ 
+     if params.livy2_livyserver_host:
+       livy2_config = self.get_livy2_interpreter_config()
+       config_id = livy2_config["id"]
+       interpreter_settings[config_id] = livy2_config
+ 
+     if params.zeppelin_interpreter:
+       settings_to_delete = []
+       for settings_key, interpreter in interpreter_settings.items():
+         if interpreter['group'] not in params.zeppelin_interpreter:
+           settings_to_delete.append(settings_key)
+ 
+       for key in settings_to_delete:
+         del interpreter_settings[key]
+ 
+     hive_interactive_properties_key = 'hive_interactive'
+     for setting_key in interpreter_settings.keys():
+       interpreter = interpreter_settings[setting_key]
+       if interpreter['group'] == 'jdbc':
+         interpreter['dependencies'] = []
+ 
+         if not params.hive_server_host and params.hive_server_interactive_hosts:
+           hive_interactive_properties_key = 'hive'
+ 
+         if params.hive_server_host:
+           interpreter['properties']['hive.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties']['hive.user'] = 'hive'
+           interpreter['properties']['hive.password'] = ''
+           interpreter['properties']['hive.proxy.user.property'] = 'hive.server2.proxy.user'
+           if params.hive_server2_support_dynamic_service_discovery:
+             interpreter['properties']['hive.url'] = 'jdbc:hive2://' + \
+                                                  params.hive_zookeeper_quorum + \
+                                                  '/;' + 'serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=' + \
+                                                     params.hive_zookeeper_namespace
+           else:
+             interpreter['properties']['hive.url'] = 'jdbc:hive2://' + \
+                                                  params.hive_server_host + \
+                                                      ':' + params.hive_server_port
+         if params.hive_server_interactive_hosts:
+           interpreter['properties'][hive_interactive_properties_key + '.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties'][hive_interactive_properties_key + '.user'] = 'hive'
+           interpreter['properties'][hive_interactive_properties_key + '.password'] = ''
+           interpreter['properties'][hive_interactive_properties_key + '.proxy.user.property'] = 'hive.server2.proxy.user'
+           if params.hive_server2_support_dynamic_service_discovery:
+             interpreter['properties'][hive_interactive_properties_key + '.url'] = 'jdbc:hive2://' + \
+                                                     params.hive_zookeeper_quorum + \
+                                                     '/;' + 'serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=' + \
+                                                     params.hive_interactive_zookeeper_namespace
+           else:
+             interpreter['properties'][hive_interactive_properties_key + '.url'] = 'jdbc:hive2://' + \
+                                                     params.hive_server_interactive_hosts + \
+                                                     ':' + params.hive_server_port
+ 
+         if params.spark_thrift_server_hosts:
+           interpreter['properties']['spark.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties']['spark.user'] = 'hive'
+           interpreter['properties']['spark.password'] = ''
+           interpreter['properties']['spark.proxy.user.property'] = 'hive.server2.proxy.user'
+           interpreter['properties']['spark.url'] = 'jdbc:hive2://' + \
+               params.spark_thrift_server_hosts + ':' + params.spark_hive_thrift_port + '/'
+           if params.spark_hive_principal:
+             interpreter['properties']['spark.url'] += ';principal=' + params.spark_hive_principal
+ 
+         if params.spark2_thrift_server_hosts:
+           interpreter['properties']['spark2.driver'] = 'org.apache.hive.jdbc.HiveDriver'
+           interpreter['properties']['spark2.user'] = 'hive'
+           interpreter['properties']['spark2.password'] = ''
+           interpreter['properties']['spark2.proxy.user.property'] = 'hive.server2.proxy.user'
+           interpreter['properties']['spark2.url'] = 'jdbc:hive2://' + \
+               params.spark2_thrift_server_hosts + ':' + params.spark2_hive_thrift_port + '/'
+           if params.spark_hive_principal:
+             interpreter['properties']['spark2.url'] += ';principal=' + params.spark2_hive_principal
+ 
+         if params.zookeeper_znode_parent \
+                 and params.hbase_zookeeper_quorum:
+             interpreter['properties']['phoenix.driver'] = 'org.apache.phoenix.jdbc.PhoenixDriver'
+             interpreter['properties']['phoenix.hbase.client.retries.number'] = '1'
+             interpreter['properties']['phoenix.user'] = 'phoenixuser'
+             interpreter['properties']['phoenix.password'] = ''
+             interpreter['properties']['phoenix.url'] = "jdbc:phoenix:" + \
+                                                     params.hbase_zookeeper_quorum + ':' + \
+                                                     params.zookeeper_znode_parent
+ 
+       elif interpreter['group'] == 'livy' and interpreter['name'] == 'livy':
+         if params.livy_livyserver_host:
+           interpreter['properties']['zeppelin.livy.url'] = "http://" + params.livy_livyserver_host + \
+                                                            ":" + params.livy_livyserver_port
+         else:
+           del interpreter_settings[setting_key]
+ 
+       elif interpreter['group'] == 'livy' and interpreter['name'] == 'livy2':
+         if params.livy2_livyserver_host:
+           interpreter['properties']['zeppelin.livy.url'] = "http://" + params.livy2_livyserver_host + \
+                                                            ":" + params.livy2_livyserver_port
+         else:
+           del interpreter_settings[setting_key]
+ 
+ 
+       elif interpreter['group'] == 'spark' and interpreter['name'] == 'spark':
+         if 'spark-env' in params.config['configurations']:
+           interpreter['properties']['master'] = "yarn-client"
+           interpreter['properties']['SPARK_HOME'] = "/usr/hdp/current/spark-client/"
+         else:
+           del interpreter_settings[setting_key]
+ 
+       elif interpreter['group'] == 'spark' and interpreter['name'] == 'spark2':
+         if 'spark2-env' in params.config['configurations']:
+           interpreter['properties']['master'] = "yarn-client"
+           interpreter['properties']['SPARK_HOME'] = "/usr/hdp/current/spark2-client/"
+         else:
+           del interpreter_settings[setting_key]
+ 
+     self.set_interpreter_settings(config_data)
+     self.update_kerberos_properties()
+ 
+   def create_interpreter_json(self):
+     import interpreter_json_template
+     import params
+ 
+     interpreter_json = interpreter_json_template.template
+     File(format("{params.conf_dir}/interpreter.json"),
+          content=interpreter_json,
+          owner=params.zeppelin_user,
+          group=params.zeppelin_group,
+          mode=0664)
+ 
+   def get_zeppelin_spark_dependencies(self):
+     import params
+     return glob.glob(params.zeppelin_dir + '/interpreter/spark/dep/zeppelin-spark-dependencies*.jar')
+ 
+   def get_spark2_interpreter_config(self):
+     import spark2_config_template
+     import json
+ 
+     return json.loads(spark2_config_template.template)
+ 
+   def get_livy2_interpreter_config(self):
+     import livy2_config_template
+     import json
+ 
+     return json.loads(livy2_config_template.template)
+ 
+ if __name__ == "__main__":
+   Master().execute()

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py
index 0000000,3242f26..dd370bd
mode 000000,100644..100644
--- a/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py
@@@ -1,0 -1,258 +1,258 @@@
+ #!/usr/bin/env python
+ """
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+     http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ 
+ """
+ 
+ import functools
+ import os
+ import re
+ from resource_management.libraries.functions import StackFeature
+ from resource_management.libraries.functions import conf_select
+ from resource_management.libraries.functions import get_kinit_path
+ from resource_management.libraries.functions import stack_select
+ from resource_management.libraries.functions.default import default
+ from resource_management.libraries.functions.format import format
+ from resource_management.libraries.functions.get_stack_version import get_stack_version
+ from resource_management.libraries.functions.stack_features import check_stack_feature
+ from resource_management.libraries.functions.version import format_stack_version, get_major_version
+ from resource_management.libraries.resources.hdfs_resource import HdfsResource
+ from resource_management.libraries.script.script import Script
+ 
+ def get_port_from_url(address):
+   if not (address is None):
+     return address.split(':')[-1]
+   else:
+     return address
+ 
+ def extract_spark_version(spark_home):
+   try:
+     with open(spark_home + "/RELEASE") as fline:
+       return re.search('Spark (\d\.\d).+', fline.readline().rstrip()).group(1)
+   except:
+     pass
+   return None
+ 
+ 
+ # server configurations
+ config = Script.get_config()
+ stack_root = Script.get_stack_root()
+ 
+ # e.g. /var/lib/ambari-agent/cache/stacks/HDP/2.2/services/zeppelin-stack/package
+ service_packagedir = os.path.realpath(__file__).split('/scripts')[0]
+ 
+ zeppelin_dirname = 'zeppelin-server'
+ 
+ install_dir = os.path.join(stack_root, "current")
+ executor_mem = config['configurations']['zeppelin-env']['zeppelin.executor.mem']
+ executor_instances = config['configurations']['zeppelin-env'][
+   'zeppelin.executor.instances']
+ 
+ security_enabled = config['configurations']['cluster-env']['security_enabled']
+ 
+ spark_jar_dir = config['configurations']['zeppelin-env']['zeppelin.spark.jar.dir']
+ spark_jar = format("{spark_jar_dir}/zeppelin-spark-0.5.5-SNAPSHOT.jar")
+ setup_view = True
+ temp_file = config['configurations']['zeppelin-env']['zeppelin.temp.file']
+ 
+ spark_home = ""
+ spark_version = None
+ spark2_home = ""
+ spark2_version = None
+ if 'spark-defaults' in config['configurations']:
+   spark_home = os.path.join(stack_root, "current", 'spark-client')
+   spark_version = extract_spark_version(spark_home)
+ if 'spark2-defaults' in config['configurations']:
+   spark2_home = os.path.join(stack_root, "current", 'spark2-client')
+   spark2_version = extract_spark_version(spark2_home)
+ 
+ # New Cluster Stack Version that is defined during the RESTART of a Rolling Upgrade
+ version = default("/commandParams/version", None)
 -stack_name = default("/hostLevelParams/stack_name", None)
++stack_name = default("/clusterLevelParams/stack_name", None)
+ 
+ # params from zeppelin-config
+ zeppelin_port = str(config['configurations']['zeppelin-config']['zeppelin.server.port'])
+ zeppelin_interpreter = None
+ if 'zeppelin.interpreter.group.order' in config['configurations']['zeppelin-config']:
+   zeppelin_interpreter = str(config['configurations']['zeppelin-config']
+                              ['zeppelin.interpreter.group.order']).split(",")
+ 
+ # params from zeppelin-env
+ zeppelin_user = config['configurations']['zeppelin-env']['zeppelin_user']
+ zeppelin_group = config['configurations']['zeppelin-env']['zeppelin_group']
+ zeppelin_log_dir = config['configurations']['zeppelin-env']['zeppelin_log_dir']
+ zeppelin_pid_dir = config['configurations']['zeppelin-env']['zeppelin_pid_dir']
+ zeppelin_log_file = os.path.join(zeppelin_log_dir, 'zeppelin-setup.log')
+ zeppelin_hdfs_user_dir = format("/user/{zeppelin_user}")
+ 
+ zeppelin_dir = os.path.join(*[install_dir, zeppelin_dirname])
+ conf_dir = "/etc/zeppelin/conf"
+ external_dependency_conf = "/etc/zeppelin/conf/external-dependency-conf"
+ notebook_dir = os.path.join(*[install_dir, zeppelin_dirname, 'notebook'])
+ 
+ # zeppelin-env.sh
+ zeppelin_env_content = config['configurations']['zeppelin-env']['zeppelin_env_content']
+ 
+ # shiro.ini
+ shiro_ini_content = config['configurations']['zeppelin-shiro-ini']['shiro_ini_content']
+ 
+ # log4j.properties
+ log4j_properties_content = config['configurations']['zeppelin-log4j-properties']['log4j_properties_content']
+ 
+ # detect configs
+ master_configs = config['clusterHostInfo']
 -java64_home = config['hostLevelParams']['java_home']
++java64_home = config['ambariLevelParams']['java_home']
+ ambari_host = str(master_configs['ambari_server_host'][0])
+ zeppelin_host = str(master_configs['zeppelin_master_hosts'][0])
+ ui_ssl_enabled = config['configurations']['zeppelin-config']['zeppelin.ssl']
+ 
+ # detect HS2 details, if installed
+ 
+ hive_server_host = None
+ hive_metastore_host = '0.0.0.0'
+ hive_metastore_port = None
+ hive_server_port = None
+ hive_zookeeper_quorum = None
+ hive_server2_support_dynamic_service_discovery = None
+ is_hive_installed = False
+ hive_zookeeper_namespace = None
+ hive_interactive_zookeeper_namespace = None
+ 
+ if 'hive_server_host' in master_configs and len(master_configs['hive_server_host']) != 0:
+   is_hive_installed = True
+   spark_hive_properties = {
+     'hive.metastore.uris': default('/configurations/hive-site/hive.metastore.uris', '')
+   }
+   hive_server_host = str(master_configs['hive_server_host'][0])
+   hive_metastore_host = str(master_configs['hive_metastore_host'][0])
+   hive_metastore_port = str(
+     get_port_from_url(default('/configurations/hive-site/hive.metastore.uris', '')))
+   hive_server_port = str(config['configurations']['hive-site']['hive.server2.thrift.http.port'])
+   hive_zookeeper_quorum = config['configurations']['hive-site']['hive.zookeeper.quorum']
+   hive_zookeeper_namespace = config['configurations']['hive-site']['hive.server2.zookeeper.namespace']
+   hive_server2_support_dynamic_service_discovery = config['configurations']['hive-site']['hive.server2.support.dynamic.service.discovery']
+ 
+ hive_server_interactive_hosts = None
+ if 'hive_server_interactive_hosts' in master_configs and len(master_configs['hive_server_interactive_hosts']) != 0:
+     hive_server_interactive_hosts = str(master_configs['hive_server_interactive_hosts'][0])
+     hive_interactive_zookeeper_namespace = config['configurations']['hive-interactive-site']['hive.server2.zookeeper.namespace']
+     hive_server_port = str(config['configurations']['hive-site']['hive.server2.thrift.http.port'])
+     hive_zookeeper_quorum = config['configurations']['hive-site']['hive.zookeeper.quorum']
+     hive_server2_support_dynamic_service_discovery = config['configurations']['hive-site']['hive.server2.support.dynamic.service.discovery']
+ 
+ spark_thrift_server_hosts = None
+ spark_hive_thrift_port = None
+ spark_hive_principal = None
+ if 'spark_thriftserver_hosts' in master_configs and len(master_configs['spark_thriftserver_hosts']) != 0:
+   spark_thrift_server_hosts = str(master_configs['spark_thriftserver_hosts'][0])
+   if config['configurations']['spark-hive-site-override']:
+     spark_hive_thrift_port = config['configurations']['spark-hive-site-override']['hive.server2.thrift.port']
+   if config['configurations']['spark-thrift-sparkconf'] and \
+       'spark.sql.hive.hiveserver2.jdbc.url.principal' in config['configurations']['spark-thrift-sparkconf']:
+     spark_hive_principal = config['configurations']['spark-thrift-sparkconf']['spark.sql.hive.hiveserver2.jdbc.url.principal']
+ 
+ spark2_thrift_server_hosts = None
+ spark2_hive_thrift_port = None
+ spark2_hive_principal = None
+ if 'spark2_thriftserver_hosts' in master_configs and len(master_configs['spark2_thriftserver_hosts']) != 0:
+   spark2_thrift_server_hosts = str(master_configs['spark2_thriftserver_hosts'][0])
+   if config['configurations']['spark2-hive-site-override']:
+     spark2_hive_thrift_port = config['configurations']['spark2-hive-site-override']['hive.server2.thrift.port']
+   if config['configurations']['spark2-thrift-sparkconf'] and \
+       'spark.sql.hive.hiveserver2.jdbc.url.principal' in config['configurations']['spark2-thrift-sparkconf']:
+     spark2_hive_principal = config['configurations']['spark2-thrift-sparkconf']['spark.sql.hive.hiveserver2.jdbc.url.principal']
+ 
+ 
+ # detect hbase details if installed
+ zookeeper_znode_parent = None
+ hbase_zookeeper_quorum = None
+ is_hbase_installed = False
+ if 'hbase_master_hosts' in master_configs and 'hbase-site' in config['configurations']:
+   is_hbase_installed = True
+   zookeeper_znode_parent = config['configurations']['hbase-site']['zookeeper.znode.parent']
+   hbase_zookeeper_quorum = config['configurations']['hbase-site']['hbase.zookeeper.quorum']
+ 
+ # detect spark queue
+ if 'spark-defaults' in config['configurations'] and 'spark.yarn.queue' in config['configurations']['spark-defaults']:
+   spark_queue = config['configurations']['spark-defaults']['spark.yarn.queue']
+ elif 'spark2-defaults' in config['configurations'] and 'spark.yarn.queue' in config['configurations']['spark2-defaults']:
+   spark_queue = config['configurations']['spark2-defaults']['spark.yarn.queue']
+ else:
+   spark_queue = 'default'
+ 
+ zeppelin_kerberos_keytab = config['configurations']['zeppelin-env']['zeppelin.server.kerberos.keytab']
+ zeppelin_kerberos_principal = config['configurations']['zeppelin-env']['zeppelin.server.kerberos.principal']
+ if 'zeppelin.interpreter.config.upgrade' in config['configurations']['zeppelin-config']:
+   zeppelin_interpreter_config_upgrade = config['configurations']['zeppelin-config']['zeppelin.interpreter.config.upgrade']
+ else:
+   zeppelin_interpreter_config_upgrade = False
+ 
+ # e.g. 2.3
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
++stack_version_unformatted = config['clusterLevelParams']['stack_version']
+ 
+ # e.g. 2.3.0.0
+ stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
+ 
+ # e.g. 2.3.0.0-2130
+ full_stack_version = default("/commandParams/version", None)
+ 
+ spark_client_version = get_stack_version('spark-client')
+ 
+ hbase_master_hosts = default("/clusterHostInfo/hbase_master_hosts", [])
+ livy_hosts = default("/clusterHostInfo/livy_server_hosts", [])
+ livy2_hosts = default("/clusterHostInfo/livy2_server_hosts", [])
+ 
+ livy_livyserver_host = None
+ livy_livyserver_port = None
+ livy2_livyserver_host = None
+ livy2_livyserver_port = None
+ if stack_version_formatted and check_stack_feature(StackFeature.SPARK_LIVY, stack_version_formatted) and \
+     len(livy_hosts) > 0:
+   livy_livyserver_host = str(livy_hosts[0])
+   livy_livyserver_port = config['configurations']['livy-conf']['livy.server.port']
+ 
+ if stack_version_formatted and check_stack_feature(StackFeature.SPARK_LIVY2, stack_version_formatted) and \
+     len(livy2_hosts) > 0:
+   livy2_livyserver_host = str(livy2_hosts[0])
+   livy2_livyserver_port = config['configurations']['livy2-conf']['livy.server.port']
+ 
+ hdfs_user = config['configurations']['hadoop-env']['hdfs_user']
+ security_enabled = config['configurations']['cluster-env']['security_enabled']
+ hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab']
+ kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
+ hadoop_bin_dir = stack_select.get_hadoop_dir("bin")
+ hadoop_conf_dir = conf_select.get_hadoop_conf_dir()
+ hdfs_principal_name = config['configurations']['hadoop-env']['hdfs_principal_name']
+ hdfs_site = config['configurations']['hdfs-site']
+ default_fs = config['configurations']['core-site']['fs.defaultFS']
+ 
+ # create partial functions with common arguments for every HdfsResource call
+ # to create hdfs directory we need to call params.HdfsResource in code
+ HdfsResource = functools.partial(
+   HdfsResource,
+   user=hdfs_user,
+   hdfs_resource_ignore_file="/var/lib/ambari-agent/data/.hdfs_resource_ignore",
+   security_enabled=security_enabled,
+   keytab=hdfs_user_keytab,
+   kinit_path_local=kinit_path_local,
+   hadoop_bin_dir=hadoop_bin_dir,
+   hadoop_conf_dir=hadoop_conf_dir,
+   principal_name=hdfs_principal_name,
+   hdfs_site=hdfs_site,
+   default_fs=default_fs
+ )

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_linux.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/custom_actions/scripts/check_host.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/custom_actions/scripts/check_host.py
index 53fad7e,3ca2909..e610307
--- a/ambari-server/src/main/resources/custom_actions/scripts/check_host.py
+++ b/ambari-server/src/main/resources/custom_actions/scripts/check_host.py
@@@ -110,10 -110,11 +110,11 @@@ class CheckHost(Script)
    IGNORE_REPOS = [
      "HDP-UTILS", "AMBARI", "BASE", "EXTRAS"
    ]
 -  
 +
    def __init__(self):
      self.reportFileHandler = HostCheckReportFileHandler()
+     self.pkg_provider = get_provider("Package")
 -  
 +
    def actionexecute(self, env):
      Logger.info("Host checks started.")
      config = Script.get_config()

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/after-INSTALL/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/after-INSTALL/scripts/params.py
index 4f4386d,b517eba..f9490be
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/after-INSTALL/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/after-INSTALL/scripts/params.py
@@@ -39,11 -39,9 +39,9 @@@ host_sys_prepped = default("/ambariLeve
  
  sudo = AMBARI_SUDO_BINARY
  
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
- 
- # current host stack version
- current_version = default("/hostLevelParams/current_version", None)
+ major_stack_version = get_major_version(stack_version_formatted)
  
  # service name
  service_name = config['serviceName']

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/after-INSTALL/scripts/shared_initialization.py
----------------------------------------------------------------------


[02/50] [abbrv] ambari git commit: AMBARI-22038 Log Search UI: implement application of selected text to service logs filters. (ababiichuk)

Posted by ao...@apache.org.
AMBARI-22038 Log Search UI: implement application of selected text to service logs filters. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f067ec8c
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f067ec8c
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f067ec8c

Branch: refs/heads/branch-3.0-perf
Commit: f067ec8c3aaeb596760db4c2bcb98ce81f75769a
Parents: eead09b
Author: ababiichuk <ab...@hortonworks.com>
Authored: Fri Sep 22 13:19:37 2017 +0300
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Fri Sep 22 15:20:02 2017 +0300

----------------------------------------------------------------------
 .../ambari-logsearch-web/src/app/app.module.ts  |  2 +-
 .../src/app/classes/list-item.class.ts          | 25 ++++++++
 .../dropdown-button.component.ts                |  5 +-
 .../dropdown-list/dropdown-list.component.html  |  5 +-
 .../dropdown-list/dropdown-list.component.ts    |  7 ++-
 .../filter-button/filter-button.component.ts    |  3 +-
 .../filters-panel/filters-panel.component.html  |  3 +-
 .../filters-panel/filters-panel.component.ts    | 10 +++-
 .../logs-list/logs-list.component.html          |  7 ++-
 .../logs-list/logs-list.component.less          |  4 ++
 .../components/logs-list/logs-list.component.ts | 61 +++++++++++++++++++-
 .../menu-button/menu-button.component.spec.ts   | 19 +++++-
 .../menu-button/menu-button.component.ts        |  5 +-
 .../search-box/search-box.component.ts          | 35 ++++++++---
 .../src/app/services/filtering.service.ts       |  5 +-
 .../src/assets/i18n/en.json                     |  4 +-
 .../ambari-logsearch-web/src/polyfills.ts       |  2 +-
 17 files changed, 173 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
index acf1b9f..fca68b5 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
@@ -84,7 +84,7 @@ export function HttpLoaderFactory(http: Http) {
   return new TranslateHttpLoader(http, 'resources/assets/i18n/', '.json?static=true');
 }
 
-export function getXHRBackend(injector: Injector, browser: BrowserXhr, xsrf: XSRFStrategy, options: ResponseOptions): any {
+export function getXHRBackend(injector: Injector, browser: BrowserXhr, xsrf: XSRFStrategy, options: ResponseOptions): XHRBackend | InMemoryBackendService {
   if (environment.production) {
     return new XHRBackend(browser, options, xsrf);
   } else {

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/classes/list-item.class.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/classes/list-item.class.ts b/ambari-logsearch/ambari-logsearch-web/src/app/classes/list-item.class.ts
new file mode 100644
index 0000000..adb023b
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/classes/list-item.class.ts
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export interface ListItem {
+  id?: string;
+  label?: string;
+  value: any;
+  iconClass?: string;
+  isChecked?: boolean;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.ts
index 42b9451..43d79f8 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.ts
@@ -17,6 +17,7 @@
  */
 
 import {Component, OnInit, Input} from '@angular/core';
+import {ListItem} from '@app/classes/list-item.class';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {UtilsService} from '@app/services/utils.service';
 
@@ -47,7 +48,7 @@ export class DropdownButtonComponent implements OnInit {
   showSelectedValue: boolean = true;
 
   @Input()
-  options?: any[];
+  options?: ListItem[];
 
   @Input()
   defaultValue?: string;
@@ -82,7 +83,7 @@ export class DropdownButtonComponent implements OnInit {
     this.selectedValue = value;
   }
 
-  updateValue(eventOptions: any): void {
+  updateValue(eventOptions: ListItem): void {
     const value = eventOptions && eventOptions.value,
       action = this.action && this.actions[this.action];
     if (this.isMultipleChoice) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.html
index 1baebed..316d3f9 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.html
@@ -19,12 +19,15 @@
   <label class="list-item-label" *ngIf="isMultipleChoice">
     <input type="checkbox" [attr.id]="item.id || item.value" [attr.checked]="item.isChecked ? 'checked' : null"
            (change)="changeSelectedItem({value: item.value, isChecked: $event.currentTarget.checked})">
-    <label [attr.for]="item.id || item.value" class="label-container">{{item.label | translate}}
+    <label [attr.for]="item.id || item.value" class="label-container">
+      <span *ngIf="item.iconClass" [ngClass]="item.iconClass"></span>
+      {{item.label | translate}}
       <div #additionalComponent></div>
     </label>
   </label>
   <span class="list-item-label label-container" *ngIf="!isMultipleChoice"
         (click)="changeSelectedItem({value: item.value, label: item.label})">
+    <span *ngIf="item.iconClass" [ngClass]="item.iconClass"></span>
     {{item.label | translate}}
     <div #additionalComponent></div>
   </span>

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.ts
index 3de664e..82656cf 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.ts
@@ -17,6 +17,7 @@
  */
 
 import {Component, AfterViewInit, Input, Output, EventEmitter, ViewChildren, ViewContainerRef, QueryList} from '@angular/core';
+import {ListItem} from '@app/classes/list-item.class';
 import {ComponentGeneratorService} from '@app/services/component-generator.service';
 
 @Component({
@@ -37,7 +38,7 @@ export class DropdownListComponent implements AfterViewInit {
   }
 
   @Input()
-  items: any[];
+  items: ListItem[];
 
   @Input()
   defaultAction: Function;
@@ -49,14 +50,14 @@ export class DropdownListComponent implements AfterViewInit {
   additionalLabelComponentSetter?: string;
 
   @Output()
-  selectedItemChange: EventEmitter<any> = new EventEmitter();
+  selectedItemChange: EventEmitter<ListItem> = new EventEmitter();
 
   @ViewChildren('additionalComponent', {
     read: ViewContainerRef
   })
   containers: QueryList<ViewContainerRef>;
 
-  changeSelectedItem(options: any): void {
+  changeSelectedItem(options: ListItem): void {
     this.selectedItemChange.emit(options);
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.ts
index 9940d73..1481583 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.ts
@@ -18,6 +18,7 @@
 
 import {Component, Input, forwardRef} from '@angular/core';
 import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
+import {ListItem} from "@app/classes/list-item.class";
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {UtilsService} from '@app/services/utils.service';
 import {MenuButtonComponent} from '@app/components/menu-button/menu-button.component';
@@ -56,7 +57,7 @@ export class FilterButtonComponent extends MenuButtonComponent implements Contro
     this.onChange(newValue);
   }
 
-  updateValue(options: any): void {
+  updateValue(options: ListItem): void {
     const value = options && options.value;
     if (this.isMultipleChoice) {
       this.value = this.utils.updateMultiSelectValue(this.value, value, options.isChecked);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
index dc76e79..99dd43d 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.html
@@ -21,7 +21,8 @@
                      [defaultLabel]="filters.clusters.defaultLabel" [isMultipleChoice]="true"
                      class="filter-input"></filter-dropdown>
     <search-box formControlName="query" [items]="searchBoxItemsTranslated" class="filter-input"
-                [parameterNameChangeSubject]="queryParameterNameChange"></search-box>
+                [parameterNameChangeSubject]="queryParameterNameChange"
+                [parameterAddSubject]="queryParameterAdd"></search-box>
     <time-range-picker formControlName="timeRange" [defaultLabel]="filters.timeRange.defaultLabel"
                        class="filter-input"></time-range-picker>
     <timezone-picker class="filter-input"></timezone-picker>

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
index 72ab222..42056c6 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filters-panel/filters-panel.component.ts
@@ -20,6 +20,8 @@ import {Component} from '@angular/core';
 import {FormGroup} from '@angular/forms';
 import {Subject} from 'rxjs/Subject';
 import {TranslateService} from '@ngx-translate/core';
+import {ListItem} from '@app/classes/list-item.class';
+import {CommonEntry} from '@app/models/common-entry.model';
 import {FilteringService} from '@app/services/filtering.service';
 import {LogsContainerService} from '@app/services/logs-container.service';
 import {AppStateService} from '@app/services/storage/app-state.service';
@@ -67,9 +69,9 @@ export class FiltersPanelComponent {
 
   private logsType: string; // TODO implement setting the parameter depending on user's navigation
 
-  searchBoxItems: any[] = [];
+  searchBoxItems: ListItem[] = [];
 
-  searchBoxItemsTranslated: any[] = [];
+  searchBoxItemsTranslated: CommonEntry[] = [];
 
   get filters(): any {
     return this.filtering.filters;
@@ -83,4 +85,8 @@ export class FiltersPanelComponent {
     return this.filtering.queryParameterNameChange;
   }
 
+  get queryParameterAdd(): Subject<any> {
+    return this.filtering.queryParameterAdd;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.html
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.html b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.html
index 29a85c5..2942b20 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.html
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.html
@@ -46,7 +46,10 @@
           <span class="action-icon fa fa-crosshairs"></span>
         </div>
         <div class="log-content-inner-wrapper">
-          <div class="log-content" *ngIf="isColumnDisplayed('log_message')">{{log.log_message}}</div>
+          <div class="log-content" *ngIf="isColumnDisplayed('log_message')"
+               (contextmenu)="openMessageContextMenu($event)">
+            {{log.log_message}}
+          </div>
         </div>
       </div>
       <div *ngFor="let column of displayedColumns">
@@ -56,5 +59,7 @@
     </ng-template>
   </accordion-panel>
 </div>
+<ul #contextmenu data-component="dropdown-list" class="dropdown-menu context-menu" [items]="contextMenuItems"
+    (selectedItemChange)="updateQuery($event)"></ul>
 <pagination class="col-md-12" *ngIf="logs && logs.length" [totalCount]="totalCount" [filtersForm]="filtersForm"
             [filterInstance]="filters.pageSize" [currentCount]="logs.length"></pagination>

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.less
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.less b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.less
index 584c1a7..577043f 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.less
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.less
@@ -135,3 +135,7 @@
     }
   }
 }
+
+.context-menu {
+  position: fixed;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.ts
index a081e1b..aeb55da 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/logs-list/logs-list.component.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import {Component, Input} from '@angular/core';
+import {Component, OnInit, Input, ViewChild, ElementRef} from '@angular/core';
 import {FormGroup} from '@angular/forms';
 import 'rxjs/add/operator/map';
 import {FilteringService} from '@app/services/filtering.service';
@@ -26,11 +26,15 @@ import {UtilsService} from '@app/services/utils.service';
   templateUrl: './logs-list.component.html',
   styleUrls: ['./logs-list.component.less']
 })
-export class LogsListComponent {
+export class LogsListComponent implements OnInit {
 
   constructor(private filtering: FilteringService, private utils: UtilsService) {
   }
 
+  ngOnInit() {
+    this.contextMenuElement = this.contextMenu.nativeElement;
+  }
+
   @Input()
   logs: any[] = [];
 
@@ -40,8 +44,32 @@ export class LogsListComponent {
   @Input()
   displayedColumns: any[] = [];
 
+  @ViewChild('contextmenu', {
+    read: ElementRef
+  })
+  contextMenu: ElementRef;
+
+  private contextMenuElement: HTMLElement;
+
+  private selectedText: string = '';
+
+  private readonly messageFilterParameterName = 'log_message';
+
   readonly customStyledColumns = ['level', 'type', 'logtime', 'log_message'];
 
+  readonly contextMenuItems = [
+    {
+      label: 'logs.addToQuery',
+      iconClass: 'fa fa-search-plus',
+      value: false // 'isExclude' is false
+    },
+    {
+      label: 'logs.excludeFromQuery',
+      iconClass: 'fa fa-search-minus',
+      value: true // 'isExclude' is true
+    }
+  ];
+
   readonly dateFormat: string = 'dddd, MMMM Do';
 
   readonly timeFormat: string = 'h:mm:ss A';
@@ -66,4 +94,33 @@ export class LogsListComponent {
     return this.displayedColumns.some(column => column.name === key);
   }
 
+  openMessageContextMenu(event: MouseEvent): void {
+    const selectedText = getSelection().toString();
+    if (selectedText) {
+      let contextMenuStyle = this.contextMenuElement.style;
+      Object.assign(contextMenuStyle, {
+        left: `${event.clientX}px`,
+        top: `${event.clientY}px`,
+        display: 'block'
+      });
+      this.selectedText = selectedText;
+      document.body.addEventListener('click', this.dismissContextMenu);
+      event.preventDefault();
+    }
+  }
+
+  updateQuery(event: any) {
+    this.filtering.queryParameterAdd.next({
+      name: this.messageFilterParameterName,
+      value: this.selectedText,
+      isExclude: event.value
+    });
+  }
+
+  private dismissContextMenu = (): void => {
+    this.selectedText = '';
+    this.contextMenuElement.style.display = 'none';
+    document.body.removeEventListener('click', this.dismissContextMenu);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
index 65f0ee6..f736fd5 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
@@ -28,6 +28,7 @@ import {HostsService, hosts} from '@app/services/storage/hosts.service';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import {FilteringService} from '@app/services/filtering.service';
 import {HttpClientService} from '@app/services/http-client.service';
+import {ListItem} from "@app/classes/list-item.class";
 
 import {MenuButtonComponent} from './menu-button.component';
 
@@ -86,7 +87,11 @@ describe('MenuButtonComponent', () => {
         title: 'empty sub-items array'
       },
       {
-        subItems: [{}],
+        subItems: [
+          {
+            value: null
+          }
+        ],
         hasSubItems: true,
         title: 'sub-items present'
       }
@@ -115,13 +120,21 @@ describe('MenuButtonComponent', () => {
         title: 'empty sub-items array'
       },
       {
-        subItems: [{}],
+        subItems: [
+          {
+            value: null
+          }
+        ],
         hideCaret: false,
         hasCaret: true,
         title: 'sub-items present, caret not hidden'
       },
       {
-        subItems: [{}],
+        subItems: [
+          {
+            value: null
+          }
+        ],
         hideCaret: true,
         hasCaret: true,
         title: 'sub-items present, caret hidden'

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.ts
index b674ec6..7e347e6 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.ts
@@ -17,6 +17,7 @@
  */
 
 import {Component, Input, ViewChild, ElementRef} from '@angular/core';
+import {ListItem} from '@app/classes/list-item.class';
 import {ComponentActionsService} from '@app/services/component-actions.service';
 import * as $ from 'jquery';
 
@@ -46,7 +47,7 @@ export class MenuButtonComponent {
   labelClass?: string;
 
   @Input()
-  subItems?: any[];
+  subItems?: ListItem[];
 
   @Input()
   isMultipleChoice: boolean = false;
@@ -90,7 +91,7 @@ export class MenuButtonComponent {
     }
   }
   
-  updateValue(options: any) {
+  updateValue(options: ListItem) {
     // TODO implement value change behaviour
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.ts
index 4730190..e547a62 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/search-box/search-box.component.ts
@@ -19,6 +19,7 @@
 import {Component, OnInit, OnDestroy, Input, ViewChild, ElementRef, forwardRef} from '@angular/core';
 import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
 import {Subject} from 'rxjs/Subject';
+import {CommonEntry} from '@app/models/common-entry.model';
 import {UtilsService} from '@app/services/utils.service';
 
 @Component({
@@ -48,6 +49,7 @@ export class SearchBoxComponent implements OnInit, OnDestroy, ControlValueAccess
     this.parameterInput.addEventListener('blur', this.onParameterInputBlur);
     this.valueInput.addEventListener('blur', this.onValueInputBlur);
     this.parameterNameChangeSubject.subscribe(this.onParameterNameChange);
+    this.parameterAddSubject.subscribe(this.onParameterAdd);
   }
 
   ngOnDestroy() {
@@ -57,6 +59,7 @@ export class SearchBoxComponent implements OnInit, OnDestroy, ControlValueAccess
     this.parameterInput.removeEventListener('blur', this.onParameterInputBlur);
     this.valueInput.removeEventListener('blur', this.onValueInputBlur);
     this.parameterNameChangeSubject.unsubscribe();
+    this.parameterAddSubject.unsubscribe();
   }
 
   private currentId: number = 0;
@@ -74,22 +77,25 @@ export class SearchBoxComponent implements OnInit, OnDestroy, ControlValueAccess
   currentValue: string;
 
   @Input()
-  items: any[] = [];
+  items: CommonEntry[] = [];
 
   @Input()
   parameterNameChangeSubject: Subject<any> = this.defaultSubject;
 
+  @Input()
+  parameterAddSubject: Subject<any> = this.defaultSubject;
+
   @ViewChild('parameterInput')
   parameterInputRef: ElementRef;
 
   @ViewChild('valueInput')
   valueInputRef: ElementRef;
 
-  rootElement: HTMLElement;
+  private rootElement: HTMLElement;
 
-  parameterInput: HTMLElement;
+  private parameterInput: HTMLElement;
 
-  valueInput: HTMLElement;
+  private valueInput: HTMLElement;
 
   activeItem?: any;
 
@@ -127,13 +133,17 @@ export class SearchBoxComponent implements OnInit, OnDestroy, ControlValueAccess
     }
   };
 
+  private getItem(name: string): CommonEntry {
+    return this.items.find(field => field.value === name);
+  }
+
   clear(): void {
     this.isActive = false;
     this.activeItem = null;
     this.currentValue = null;
   }
 
-  itemsListFormatter(item: any): string {
+  itemsListFormatter(item: CommonEntry): string {
     return item.name;
   }
 
@@ -142,8 +152,7 @@ export class SearchBoxComponent implements OnInit, OnDestroy, ControlValueAccess
   }
 
   onParameterNameChange = (options: any): void => {
-    this.activeItem = typeof options.item === 'string' ?
-      this.items.find(field => field.value === options.item) : options.item;
+    this.activeItem = typeof options.item === 'string' ? this.getItem(options.item) : options.item;
     this.isExclude = options.isExclude;
     this.isActive = true;
     this.isParameterInput = false;
@@ -168,6 +177,18 @@ export class SearchBoxComponent implements OnInit, OnDestroy, ControlValueAccess
     }
   }
 
+  onParameterAdd = (options: any): void => {
+    const item = this.getItem(options.name);
+    this.parameters.push({
+      id: this.currentId++,
+      name: options.name,
+      label: item.name,
+      value: options.value,
+      isExclude: options.isExclude
+    });
+    this.updateValue();
+  }
+
   removeParameter(event: MouseEvent, id: number): void {
     this.parameters = this.parameters.filter(parameter => parameter.id !== id);
     this.updateValue();

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
index 627dc27..beaf91c 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/filtering.service.ts
@@ -20,6 +20,7 @@ import {Injectable} from '@angular/core';
 import {FormControl, FormGroup} from '@angular/forms';
 import {Subject} from 'rxjs/Subject';
 import * as moment from 'moment-timezone';
+import {ListItem} from '@app/classes/list-item.class';
 import {AppSettingsService} from '@app/services/storage/app-settings.service';
 import {ClustersService} from '@app/services/storage/clusters.service';
 import {ComponentsService} from '@app/services/storage/components.service';
@@ -47,7 +48,7 @@ export class FilteringService {
     });
   }
 
-  private getListItem(name: string): any {
+  private getListItem(name: string): ListItem {
     return {
       label: name,
       value: name
@@ -403,6 +404,8 @@ export class FilteringService {
 
   queryParameterNameChange: Subject<any> = new Subject();
 
+  queryParameterAdd: Subject<any> = new Subject();
+
   loadClusters(): void {
     this.httpClient.get('clusters').subscribe(response => {
       const clusterNames = response.json();

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
index 1235a80..8750d64 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
+++ b/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
@@ -139,5 +139,7 @@
   "logs.stack": "Stack",
   "logs.taskId": "Task Id",
   "logs.versionNote": "Version Note",
-  "logs.versionNumber": "Version Number"
+  "logs.versionNumber": "Version Number",
+  "logs.addToQuery": "Add to Query",
+  "logs.excludeFromQuery": "Exclude from Query"
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f067ec8c/ambari-logsearch/ambari-logsearch-web/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/polyfills.ts b/ambari-logsearch/ambari-logsearch-web/src/polyfills.ts
index 0ab921a..016ab77 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/polyfills.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/polyfills.ts
@@ -42,7 +42,7 @@ import 'core-js/es6/object';
 // import 'core-js/es6/function';
 // import 'core-js/es6/parse-int';
 // import 'core-js/es6/parse-float';
-// import 'core-js/es6/number';
+import 'core-js/es6/number';
 // import 'core-js/es6/math';
 import 'core-js/es6/string';
 // import 'core-js/es6/date';


[28/50] [abbrv] ambari git commit: AMBARI-22055. Make Log Search IT work with the new UI (oleewere)

Posted by ao...@apache.org.
AMBARI-22055. Make Log Search IT work with the new UI (oleewere)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/fe7a8e4b
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/fe7a8e4b
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/fe7a8e4b

Branch: refs/heads/branch-3.0-perf
Commit: fe7a8e4bb681720021c3d4dc60f02ef422aaf3f7
Parents: 6a99bd8
Author: Oliver Szabo <ol...@gmail.com>
Authored: Mon Sep 25 21:09:43 2017 +0200
Committer: Oliver Szabo <ol...@gmail.com>
Committed: Tue Sep 26 13:51:01 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/ambari/logsearch/steps/LogSearchUISteps.java | 4 +---
 .../src/test/resources/stories/selenium/login.ui.story           | 4 ++--
 2 files changed, 3 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/fe7a8e4b/ambari-logsearch/ambari-logsearch-it/src/test/java/org/apache/ambari/logsearch/steps/LogSearchUISteps.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-it/src/test/java/org/apache/ambari/logsearch/steps/LogSearchUISteps.java b/ambari-logsearch/ambari-logsearch-it/src/test/java/org/apache/ambari/logsearch/steps/LogSearchUISteps.java
index b40a2bc..1b7c634 100644
--- a/ambari-logsearch/ambari-logsearch-it/src/test/java/org/apache/ambari/logsearch/steps/LogSearchUISteps.java
+++ b/ambari-logsearch/ambari-logsearch-it/src/test/java/org/apache/ambari/logsearch/steps/LogSearchUISteps.java
@@ -22,11 +22,9 @@ import junit.framework.Assert;
 import org.apache.ambari.logsearch.domain.StoryDataRegistry;
 import org.apache.ambari.logsearch.web.Home;
 import org.jbehave.core.annotations.AfterScenario;
-import org.jbehave.core.annotations.AfterStories;
 import org.jbehave.core.annotations.AfterStory;
 import org.jbehave.core.annotations.BeforeScenario;
 import org.jbehave.core.annotations.BeforeStories;
-import org.jbehave.core.annotations.BeforeStory;
 import org.jbehave.core.annotations.Given;
 import org.jbehave.core.annotations.Named;
 import org.jbehave.core.annotations.Then;
@@ -92,7 +90,7 @@ public class LogSearchUISteps extends AbstractLogSearchSteps {
     LOG.info("Type password: {}", password);
     home.findElement(By.id("password")).sendKeys(password);
     LOG.info("Click on Sign In button.");
-    home.findElement(By.className("custLogin")).click();
+    home.findElement(By.cssSelector("login-form > div > form > button")).click();
     closeTourPopup();
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/fe7a8e4b/ambari-logsearch/ambari-logsearch-it/src/test/resources/stories/selenium/login.ui.story
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-it/src/test/resources/stories/selenium/login.ui.story b/ambari-logsearch/ambari-logsearch-it/src/test/resources/stories/selenium/login.ui.story
index 543c211..4824335 100644
--- a/ambari-logsearch/ambari-logsearch-it/src/test/resources/stories/selenium/login.ui.story
+++ b/ambari-logsearch/ambari-logsearch-it/src/test/resources/stories/selenium/login.ui.story
@@ -10,11 +10,11 @@ Scenario: login with admin/admin
 Given logsearch docker container
 And open logsearch home page
 When login with admin / admin
-Then page contains text: 'Service Logs'
+Then page contains text: 'Refresh'
 
 Scenario: login with admin and wrong password
 
 Given logsearch docker container
 And open logsearch home page
 When login with admin / wrongpassword
-Then page does not contain text: 'Service Logs'
\ No newline at end of file
+Then page does not contain text: 'Refresh'
\ No newline at end of file


[47/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 4ba5427,b2993e3..d14bd33
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@@ -77,8 -63,8 +78,9 @@@ import java.util.Map
  import java.util.Map.Entry;
  import java.util.Set;
  import java.util.TreeMap;
+ import java.util.UUID;
  import java.util.concurrent.TimeUnit;
 +import java.util.stream.Collectors;
  
  import javax.persistence.RollbackException;
  
@@@ -228,8 -201,8 +227,9 @@@ import org.apache.ambari.server.topolog
  import org.apache.ambari.server.utils.SecretReference;
  import org.apache.ambari.server.utils.StageUtils;
  import org.apache.commons.collections.CollectionUtils;
 +import org.apache.commons.collections.MapUtils;
  import org.apache.commons.io.IOUtils;
+ import org.apache.commons.lang.BooleanUtils;
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.lang.math.NumberUtils;
  import org.apache.http.client.utils.URIBuilder;
@@@ -341,23 -313,12 +341,27 @@@ public class AmbariManagementController
    @Inject
    private ExtensionDAO extensionDAO;
    @Inject
+   private ExtensionLinkDAO linkDAO;
+   @Inject
    private StackDAO stackDAO;
+   @Inject
+   protected OsFamily osFamily;
  
 +  @Inject
 +  private TopologyDeleteFormer topologyDeleteFormer;
 +
 +  @Inject
 +  private AmbariCustomCommandExecutionHelper ambariCustomCommandExecutionHelper;
 +
 +  @Inject
 +  private Provider<TopologyHolder> m_topologyHolder;
 +
 +  @Inject
 +  private Provider<MetadataHolder> m_metadataHolder;
 +
 +  @Inject
 +  private Provider<AgentConfigsHolder> m_agentConfigsHolder;
 +
    /**
     * The KerberosHelper to help setup for enabling for disabling Kerberos
     */
@@@ -2447,57 -2452,37 +2548,25 @@@
      if (customCommandExecutionHelper.isTopologyRefreshRequired(roleCommand.name(), clusterName, serviceName)) {
        commandParams.put(ExecutionCommand.KeyNames.REFRESH_TOPOLOGY, "True");
      }
+     StageUtils.useAmbariJdkInCommandParams(commandParams, configs);
  
-     String repoInfo = ambariMetaInfo.getRepoInfoString(cluster, hostEntity.getOsType(), osFamily , hostname);
 -    String repoInfo = customCommandExecutionHelper.getRepoInfo(cluster, component, host);
++    String repoInfo = ambariMetaInfo.getRepoInfoString(cluster, component, host);
      if (LOG.isDebugEnabled()) {
-       LOG.debug("Sending repo information to agent"
-         + ", hostname=" + scHost.getHostName()
-         + ", clusterName=" + clusterName
-         + ", stackInfo=" + stackId.getStackId()
-         + ", repoInfo=" + repoInfo);
+       LOG.debug("Sending repo information to agent, hostname={}, clusterName={}, stackInfo={}, repoInfo={}",
+         scHost.getHostName(), clusterName, stackId.getStackId(), repoInfo);
      }
  
      Map<String, String> hostParams = new TreeMap<>();
      hostParams.put(REPO_INFO, repoInfo);
      hostParams.putAll(getRcaParameters());
  
-     Map<String, String> roleParams = new TreeMap<>();
- 
-     // use the effective cluster version here since this command might happen
-     // in the context of an upgrade and we should send the repo ID which matches
-     // the version being send down
-     RepositoryVersionEntity repoVersion = null;
-     if (null != effectiveClusterVersion) {
-       repoVersion = effectiveClusterVersion.getRepositoryVersion();
-     } else {
-       List<ClusterVersionEntity> list = clusterVersionDAO.findByClusterAndState(cluster.getClusterName(),
-           RepositoryVersionState.INIT);
-       if (1 == list.size()) {
-         repoVersion = list.get(0).getRepositoryVersion();
-       }
-     }
- 
--    if (null != repoVersion) {
--      try {
--        VersionDefinitionXml xml = repoVersion.getRepositoryXml();
--        if (null != xml && !StringUtils.isBlank(xml.getPackageVersion(osFamily))) {
-           roleParams.put(PACKAGE_VERSION, xml.getPackageVersion(osFamily));
 -          hostParams.put(PACKAGE_VERSION, xml.getPackageVersion(osFamily));
--        }
--      } catch (Exception e) {
--        throw new AmbariException(String.format("Could not load version xml from repo version %s",
--            repoVersion.getVersion()), e);
--      }
- 
-       roleParams.put(KeyNames.REPO_VERSION_ID, repoVersion.getId().toString());
-     }
--
 -      hostParams.put(KeyNames.REPO_VERSION_ID, repoVersion.getId().toString());
 +    if (roleCommand.equals(RoleCommand.INSTALL)) {
 +      List<ServiceOsSpecific.Package> packages =
 +          getPackagesForServiceHost(serviceInfo, hostParams, osFamily);
 +      String packageList = gson.toJson(packages);
 +      commandParams.put(PACKAGE_LIST, packageList);
      }
  
 -    List<ServiceOsSpecific.Package> packages =
 -            getPackagesForServiceHost(serviceInfo, hostParams, osFamily);
 -    String packageList = gson.toJson(packages);
 -    hostParams.put(PACKAGE_LIST, packageList);
 -
      Set<PropertyInfo> stackProperties = ambariMetaInfo.getStackProperties(stackInfo.getName(), stackInfo.getVersion());
  
      Set<String> userSet = configHelper.getPropertyValuesWithPropertyType(PropertyType.USER, cluster, clusterDesiredConfigs, servicesMap, stackProperties);
@@@ -2548,11 -2552,10 +2620,9 @@@
      execCmd.setRoleParams(roleParams);
      execCmd.setCommandParams(commandParams);
  
-     execCmd.setAvailableServicesFromServiceInfoMap(ambariMetaInfo.getServices(stackId.getStackName(), stackId.getStackVersion()));
- 
 -    execCmd.setRepositoryFile(customCommandExecutionHelper.getCommandRepository(cluster, component, host));
 -    execCmdWrapper.setVersions(cluster);
++    execCmd.setRepositoryFile(ambariMetaInfo.getCommandRepository(cluster, component, host));
  
 -    if (execCmd.getConfigurationTags().containsKey("cluster-env")) {
 +    if ((execCmd != null) && (execCmd.getConfigurationTags().containsKey("cluster-env"))) {
        LOG.debug("AmbariManagementControllerImpl.createHostAction: created ExecutionCommand for host {}, role {}, roleCommand {}, and command ID {}, with cluster-env tags {}",
          execCmd.getHostname(), execCmd.getRole(), execCmd.getRoleCommand(), execCmd.getCommandId(), execCmd.getConfigurationTags().get("cluster-env").get("tag"));
      }
@@@ -2941,18 -2957,25 +3024,18 @@@
                  }
                  break;
                case INIT:
 -                if (oldSchState == State.INSTALLED ||
 -                    oldSchState == State.INSTALL_FAILED ||
 -                    oldSchState == State.INIT) {
 -                  scHost.setState(State.INIT);
 -                  continue;
 -                } else  {
 -                  throw new AmbariException("Unsupported transition to INIT for"
 -                      + " servicecomponenthost"
 -                      + ", clusterName=" + cluster.getClusterName()
 -                      + ", clusterId=" + cluster.getClusterId()
 -                      + ", serviceName=" + scHost.getServiceName()
 -                      + ", componentName=" + scHost.getServiceComponentName()
 -                      + ", hostname=" + scHost.getHostName()
 -                      + ", currentState=" + oldSchState
 -                      + ", newDesiredState=" + newState);
 -                }
 +                throw new AmbariException("Unsupported transition to INIT for"
 +                    + " servicecomponenthost"
 +                    + ", clusterName=" + cluster.getClusterName()
 +                    + ", clusterId=" + cluster.getClusterId()
 +                    + ", serviceName=" + scHost.getServiceName()
 +                    + ", componentName=" + scHost.getServiceComponentName()
 +                    + ", hostname=" + scHost.getHostName()
 +                    + ", currentState=" + oldSchState
 +                    + ", newDesiredState=" + newState);
                default:
                  throw new AmbariException("Unsupported state change operation"
-                     + ", newState=" + newState.toString());
+                     + ", newState=" + newState);
              }
  
              if (LOG.isDebugEnabled()) {
@@@ -3550,21 -3624,51 +3684,51 @@@
      for (Entry<ServiceComponent, Set<ServiceComponentHost>> entry : safeToRemoveSCHs.entrySet()) {
        for (ServiceComponentHost componentHost : entry.getValue()) {
          try {
-           deleteHostComponent(entry.getKey(), componentHost, deleteMetaData);
+           //actually delete the component
 -          entry.getKey().deleteServiceComponentHosts(componentHost.getHostName());
++          entry.getKey().deleteServiceComponentHosts(componentHost.getHostName(), deleteMetaData);
+ 
+           //create cluster-master-service map to update all include/exclude files in one action
+           String componentName = componentHost.getServiceComponentName();
+           if (masterToSlaveMappingForDecom.containsValue(componentName)) {
+             String masterComponentName = null;
+             for (Entry<String, String> entrySet : masterToSlaveMappingForDecom.entrySet()) {
+               if (entrySet.getValue().equals(componentName)) {
+                 masterComponentName = entrySet.getKey();
+               }
+             }
+             if (clusterServiceMasterForDecommissionMap.containsKey(componentHost.getClusterName())) {
+               clusterServiceMasterForDecommissionMap.get(componentHost.getClusterName()).put(componentHost.getServiceName(), masterComponentName);
+               Map<String, Set<String>> masterSlaveMap  = clusterMasterSlaveHostsMap.get(componentHost.getClusterName());
+               masterSlaveMap.putIfAbsent(masterComponentName, new HashSet<>());
+               masterSlaveMap.get(masterComponentName).add(componentHost.getHostName());
+             } else {
+               Map<String, String> serviceMasterMap = new HashMap<>();
+               serviceMasterMap.put(componentHost.getServiceName(), masterComponentName);
+               clusterServiceMasterForDecommissionMap.put(componentHost.getClusterName(), serviceMasterMap);
+ 
+               Map<String, Set<String>> masterSlaveHostsMap = new HashMap<>();
+               masterSlaveHostsMap.put(masterComponentName, new HashSet<>(Collections.singletonList(componentHost.getHostName())));
+               clusterMasterSlaveHostsMap.put(componentHost.getClusterName(), masterSlaveHostsMap);
+             }
+           }
 -          deleteStatusMetaData.addDeletedKey(componentHost.getHostName() + "/" + componentHost.getServiceComponentName());
          } catch (Exception ex) {
 -          deleteStatusMetaData.addException(componentHost.getHostName() + "/" + componentHost.getServiceComponentName(), ex);
 +          deleteMetaData.addException(componentHost.getHostName() + "/" + componentHost.getServiceComponentName(), ex);
          }
        }
      }
  
+     for (String cluster : clusterServiceMasterForDecommissionMap.keySet()) {
+       createAndExecuteRefreshIncludeExcludeFilesActionForMasters(clusterServiceMasterForDecommissionMap.get(cluster), clusterMasterSlaveHostsMap.get(cluster), cluster, true);
+     }
+ 
      //Do not break behavior for existing clients where delete request contains only 1 host component.
      //Response for these requests will have empty body with appropriate error code.
 -    if (deleteStatusMetaData.getDeletedKeys().size() + deleteStatusMetaData.getExceptionForKeys().size() == 1) {
 -      if (deleteStatusMetaData.getDeletedKeys().size() == 1) {
 +    if (deleteMetaData.getDeletedKeys().size() + deleteMetaData.getExceptionForKeys().size() == 1) {
 +      if (deleteMetaData.getDeletedKeys().size() == 1) {
 +        topologyDeleteFormer.processDeleteMetaData(deleteMetaData);
          return null;
        }
 -      Exception ex =  deleteStatusMetaData.getExceptionForKeys().values().iterator().next();
 +      Exception ex = deleteMetaData.getExceptionForKeys().values().iterator().next();
        if (ex instanceof AmbariException) {
          throw (AmbariException)ex;
        } else {
@@@ -3576,65 -3680,9 +3740,10 @@@
      if (!safeToRemoveSCHs.isEmpty()) {
        setMonitoringServicesRestartRequired(requests);
      }
 -    return deleteStatusMetaData;
 +    topologyDeleteFormer.processDeleteMetaData(deleteMetaData);
 +    return deleteMetaData;
    }
  
-   private void deleteHostComponent(ServiceComponent serviceComponent, ServiceComponentHost componentHost,
-                                    DeleteHostComponentStatusMetaData deleteMetaData) throws AmbariException {
-     String included_hostname = componentHost.getHostName();
-     String serviceName = serviceComponent.getServiceName();
-     String master_component_name = null;
-     String slave_component_name = componentHost.getServiceComponentName();
-     HostComponentAdminState desiredAdminState = componentHost.getComponentAdminState();
-     State slaveState = componentHost.getState();
-     //Delete hostcomponents
-     serviceComponent.deleteServiceComponentHosts(componentHost.getHostName(), deleteMetaData);
-     // If deleted hostcomponents support decomission and were decommited and stopped
-     if (AmbariCustomCommandExecutionHelper.masterToSlaveMappingForDecom.containsValue(slave_component_name)
-             && desiredAdminState.equals(HostComponentAdminState.DECOMMISSIONED)
-             && slaveState.equals(State.INSTALLED)) {
- 
-       for (Entry<String, String> entrySet : AmbariCustomCommandExecutionHelper.masterToSlaveMappingForDecom.entrySet()) {
-         if (entrySet.getValue().equals(slave_component_name)) {
-           master_component_name = entrySet.getKey();
-         }
-       }
-       //Clear exclud file or draining list except HBASE
-       if (!serviceName.equals(Service.Type.HBASE.toString())) {
-         HashMap<String, String> requestProperties = new HashMap<>();
-         requestProperties.put("context", "Remove host " +
-                 included_hostname + " from exclude file");
-         requestProperties.put("exclusive", "true");
-         HashMap<String, String> params = new HashMap<>();
-         params.put("included_hosts", included_hostname);
-         params.put("slave_type", slave_component_name);
-         params.put(AmbariCustomCommandExecutionHelper.UPDATE_EXCLUDE_FILE_ONLY, "true");
- 
-         //Create filter for RECOMISSION command
-         RequestResourceFilter resourceFilter
-                 = new RequestResourceFilter(serviceName, master_component_name, null);
-         //Create request for RECOMISSION command
-         ExecuteActionRequest actionRequest = new ExecuteActionRequest(
-                 serviceComponent.getClusterName(), AmbariCustomCommandExecutionHelper.DECOMMISSION_COMMAND_NAME, null,
-                 Collections.singletonList(resourceFilter), null, params, true);
-         //Send request
-         createAction(actionRequest, requestProperties);
-       }
- 
-       //Mark master component as needed to restart for remove host info from components UI
-       Cluster cluster = clusters.getCluster(serviceComponent.getClusterName());
-       Service service = cluster.getService(serviceName);
-       ServiceComponent sc = service.getServiceComponent(master_component_name);
- 
-       if (sc != null && sc.isMasterComponent()) {
-         for (ServiceComponentHost sch : sc.getServiceComponentHosts().values()) {
-           sch.setRestartRequired(true);
-         }
-       }
-     }
-   }
- 
    @Override
    public void deleteUsers(Set<UserRequest> requests)
      throws AmbariException {
@@@ -3662,6 -3709,47 +3770,48 @@@
      }
    }
  
+   /**
+    * Creates and triggers an action to update include and exclude files for the master components depending on current cluster topology and components state
+    * @param serviceMasterMap
+    * @param masterSlaveHostsMap
+    *@param clusterName  @throws AmbariException
+    */
+   private void createAndExecuteRefreshIncludeExcludeFilesActionForMasters(Map<String, String> serviceMasterMap, Map<String, Set<String>> masterSlaveHostsMap, String clusterName, boolean isDecommission) throws AmbariException {
+     //Clear include/exclude files or draining list except HBASE
+     serviceMasterMap.remove(Service.Type.HBASE.toString());
+     //exit if empty
+     if (serviceMasterMap.isEmpty()) {
+       return;
+     }
+     LOG.debug("Refresh include/exclude files action will be executed for " + serviceMasterMap);
+     HashMap<String, String> requestProperties = new HashMap<>();
+     requestProperties.put("context", "Update Include/Exclude Files for " + serviceMasterMap.keySet().toString());
++    requestProperties.put("exclusive", "true");
+     HashMap<String, String> params = new HashMap<>();
+     params.put(AmbariCustomCommandExecutionHelper.UPDATE_FILES_ONLY, String.valueOf(isDecommission));
+ 
+     for (String masterName : masterSlaveHostsMap.keySet()) {
+       if (!isDecommission) {
+         params.put(masterName + "_" + AmbariCustomCommandExecutionHelper.DECOM_INCLUDED_HOSTS, StringUtils.join(masterSlaveHostsMap.get(masterName).toArray(), ","));
+       }
+     }
+ 
+     params.put(AmbariCustomCommandExecutionHelper.IS_ADD_OR_DELETE_SLAVE_REQUEST, "true");
+ 
+     //Create filter for command
+     List<RequestResourceFilter> resourceFilters = new ArrayList<>(serviceMasterMap.size());
+     for (String serviceName : serviceMasterMap.keySet()) {
+       resourceFilters.add(new RequestResourceFilter(serviceName, serviceMasterMap.get(serviceName), null));
+     }
+ 
+     //Create request for command
+     ExecuteActionRequest actionRequest = new ExecuteActionRequest(
+       clusterName, AmbariCustomCommandExecutionHelper.DECOMMISSION_COMMAND_NAME, null,
 -      resourceFilters, null, params, false);
++      resourceFilters, null, params, true);
+     //Send action
+     createAction(actionRequest, requestProperties);
+   }
+ 
    @Override
    public void deleteMembers(java.util.Set<MemberRequest> requests) throws AmbariException {
      for (MemberRequest request : requests) {
@@@ -4361,7 -4473,8 +4535,7 @@@
          for (OperatingSystemEntity operatingSystem: repositoryVersion.getOperatingSystems()) {
            if (operatingSystem.getOsType().equals(osType)) {
              for (RepositoryEntity repository: operatingSystem.getRepositories()) {
-               final RepositoryResponse response = new RepositoryResponse(repository.getBaseUrl(), osType, repository.getRepositoryId(), repository.getName(), "", "", "");
 -              final RepositoryResponse response = new RepositoryResponse(repository.getBaseUrl(), osType, repository.getRepositoryId(),
 -                      repository.getName(), repository.getDistribution(), repository.getComponents(), "", "");
++              final RepositoryResponse response = new RepositoryResponse(repository.getBaseUrl(), osType, repository.getRepositoryId(), repository.getName(), "", "");
                if (null != versionDefinitionId) {
                  response.setVersionDefinitionId(versionDefinitionId);
                } else {
@@@ -4389,8 -4502,8 +4563,8 @@@
  
          for (RepositoryXml.Repo repo : os.getRepos()) {
            RepositoryResponse resp = new RepositoryResponse(repo.getBaseUrl(), os.getFamily(),
 -              repo.getRepoId(), repo.getRepoName(), repo.getDistribution(), repo.getComponents(), repo.getMirrorsList(),
 +              repo.getRepoId(), repo.getRepoName(), repo.getMirrorsList(),
-               repo.getBaseUrl(), repo.getLatestUri());
+               repo.getBaseUrl());
  
            resp.setVersionDefinitionId(versionDefinitionId);
            resp.setStackName(stackId.getStackName());
@@@ -5652,253 -5684,4 +5745,245 @@@
      return QuickLinkVisibilityControllerFactory.get(quickLinkProfileJson);
    }
  
 +  /**
 +   * Collects metadata info about clusters for agent.
 +   * @return metadata info about clusters
 +   * @throws AmbariException
 +   */
 +  public MetadataUpdateEvent getClustersMetadata() throws AmbariException {
 +    TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
 +
 +    for (Cluster cl : clusters.getClusters().values()) {
 +      StackId stackId = cl.getDesiredStackVersion();
 +
 +      SecurityType securityType = cl.getSecurityType();
 +
 +      TreeMap<String, MetadataServiceInfo> serviceLevelParams = new TreeMap<>();
 +      Collection<ServiceInfo> servicesInfo = ambariMetaInfo.getServices(stackId.getStackName(),
 +          stackId.getStackVersion()).values();
 +      for (ServiceInfo serviceInfo : servicesInfo) {
 +        Long statusCommandTimeout = null;
 +        if (serviceInfo.getCommandScript() != null) {
 +          statusCommandTimeout = new Long (ambariCustomCommandExecutionHelper.getStatusCommandTimeout(serviceInfo));
 +        }
 +
 +        String servicePackageFolder = serviceInfo.getServicePackageFolder();
 +
 +        serviceLevelParams.put(serviceInfo.getName(),
 +            new MetadataServiceInfo(serviceInfo.getVersion(),
 +                serviceInfo.isCredentialStoreEnabled(),
 +                statusCommandTimeout,
 +                servicePackageFolder));
 +      }
 +
 +      MetadataCluster metadataCluster = new MetadataCluster(securityType,
 +          serviceLevelParams,
 +          getMetadataClusterLevelParams(cl, stackId));
 +      metadataClusters.put(Long.toString(cl.getClusterId()), metadataCluster);
 +    }
 +
 +    MetadataUpdateEvent metadataUpdateEvent = new MetadataUpdateEvent(metadataClusters,
 +        getMetadataAmbariLevelParams());
 +    return metadataUpdateEvent;
 +  }
 +
 +  public MetadataUpdateEvent getClusterMetadata(Cluster cl) throws AmbariException {
 +    TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
 +    StackId stackId = cl.getDesiredStackVersion();
 +
 +    SecurityType securityType = cl.getSecurityType();
 +
 +    TreeMap<String, MetadataServiceInfo> serviceLevelParams = new TreeMap<>();
 +    Collection<ServiceInfo> servicesInfo = ambariMetaInfo.getServices(stackId.getStackName(),
 +        stackId.getStackVersion()).values();
 +    for (ServiceInfo serviceInfo : servicesInfo) {
 +      Long statusCommandTimeout = null;
 +      if (serviceInfo.getCommandScript() != null) {
 +        statusCommandTimeout = new Long(ambariCustomCommandExecutionHelper.getStatusCommandTimeout(serviceInfo));
 +      }
 +
 +      String servicePackageFolder = serviceInfo.getServicePackageFolder();
 +
 +      serviceLevelParams.put(serviceInfo.getName(),
 +          new MetadataServiceInfo(serviceInfo.getVersion(),
 +              serviceInfo.isCredentialStoreEnabled(),
 +              statusCommandTimeout,
 +              servicePackageFolder));
 +    }
 +
 +    MetadataCluster metadataCluster = new MetadataCluster(securityType,
 +        serviceLevelParams,
 +        getMetadataClusterLevelParams(cl, stackId));
 +    metadataClusters.put(Long.toString(cl.getClusterId()), metadataCluster);
 +
 +    MetadataUpdateEvent metadataUpdateEvent = new MetadataUpdateEvent(metadataClusters,
 +        null);
 +    return metadataUpdateEvent;
 +  }
 +
 +  public MetadataUpdateEvent getClusterMetadataOnConfigsUpdate(Cluster cl) throws AmbariException {
 +    TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
 +    StackId stackId = cl.getDesiredStackVersion();
 +
 +    MetadataCluster metadataCluster = new MetadataCluster(null,
 +        new TreeMap<>(),
 +        getMetadataClusterLevelConfigsParams(cl, stackId));
 +    metadataClusters.put(Long.toString(cl.getClusterId()), metadataCluster);
 +
 +    MetadataUpdateEvent metadataUpdateEvent = new MetadataUpdateEvent(metadataClusters,
 +        null);
 +    return metadataUpdateEvent;
 +  }
 +
 +  private String getClientsToUpdateConfigs(ComponentInfo componentInfo) {
 +    List<String> clientsToUpdateConfigsList = componentInfo.getClientsToUpdateConfigs();
 +    if (clientsToUpdateConfigsList == null) {
 +      clientsToUpdateConfigsList = new ArrayList<>();
 +      clientsToUpdateConfigsList.add("*");
 +    }
 +    return gson.toJson(clientsToUpdateConfigsList);
 +  }
 +
 +  private Boolean getUnlimitedKeyJCERequirement(ComponentInfo componentInfo, SecurityType clusterSecurityType) {
 +    UnlimitedKeyJCERequirement unlimitedKeyJCERequirement = componentInfo.getUnlimitedKeyJCERequired();
 +    // Ensure that the unlimited key requirement is set. If null, the default value should be used.
 +    if(unlimitedKeyJCERequirement == null) {
 +      unlimitedKeyJCERequirement = UnlimitedKeyJCERequirement.DEFAULT;
 +    }
 +
 +    return (UnlimitedKeyJCERequirement.ALWAYS == unlimitedKeyJCERequirement) ||
 +        ((UnlimitedKeyJCERequirement.KERBEROS_ENABLED == unlimitedKeyJCERequirement) &&
 +            (clusterSecurityType == SecurityType.KERBEROS));
 +
 +  }
 +
 +  //TODO will be a need to change to multi-instance usage
 +  public TreeMap<String, String> getTopologyComponentLevelParams(StackId stackId, String serviceName, String componentName,
 +                                                             SecurityType clusterSecurityType) throws AmbariException {
 +    ComponentInfo componentInfo = ambariMetaInfo.getComponent(
 +        stackId.getStackName(), stackId.getStackVersion(),
 +        serviceName, componentName);
 +
 +    TreeMap<String, String> statusCommandParams = new TreeMap<>();
 +    statusCommandParams.put(ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS,
 +        getClientsToUpdateConfigs(componentInfo));
 +    statusCommandParams.put(ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED,
 +         Boolean.toString(getUnlimitedKeyJCERequirement(componentInfo, clusterSecurityType)));
 +    return statusCommandParams;
 +  }
 +
 +  //TODO will be a need to change to multi-instance usage
 +  public TreeMap<String, String> getTopologyCommandParams(StackId stackId, String serviceName, String componentName) throws AmbariException {
 +    ServiceInfo serviceInfo = ambariMetaInfo.getService(stackId.getStackName(),
 +        stackId.getStackVersion(), serviceName);
 +    ComponentInfo componentInfo = ambariMetaInfo.getComponent(
 +        stackId.getStackName(), stackId.getStackVersion(),
 +        serviceName, componentName);
 +
 +    String scriptName = null;
 +    String scriptCommandTimeout = "";
 +    CommandScriptDefinition script = componentInfo.getCommandScript();
 +    if (serviceInfo.getSchemaVersion().equals(AmbariMetaInfo.SCHEMA_VERSION_2)) {
 +      if (script != null) {
 +        scriptName = script.getScript();
 +        if (script.getTimeout() > 0) {
 +          scriptCommandTimeout = String.valueOf(script.getTimeout());
 +        }
 +      } else {
 +        String message = String.format("Component %s of service %s has not " +
 +            "command script defined", componentName, serviceName);
 +        throw new AmbariException(message);
 +      }
 +    }
 +    String agentDefaultCommandTimeout = configs.getDefaultAgentTaskTimeout(false);
 +    String actualTimeout = (!scriptCommandTimeout.equals("") ? scriptCommandTimeout : agentDefaultCommandTimeout);
 +
 +    TreeMap<String, String> commandParams = new TreeMap<>();
 +    commandParams.put(COMMAND_TIMEOUT, actualTimeout);
 +    commandParams.put(SCRIPT, scriptName);
 +    commandParams.put(SCRIPT_TYPE, script.getScriptType().toString());
 +    return commandParams;
 +  }
 +
 +  public TreeMap<String, String> getMetadataClusterLevelParams(Cluster cluster, StackId stackId) throws AmbariException {
 +    TreeMap<String, String> clusterLevelParams = new TreeMap<>();
 +    clusterLevelParams.put(STACK_NAME, stackId.getStackName());
 +    clusterLevelParams.put(STACK_VERSION, stackId.getStackVersion());
 +
 +    Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
 +    if (MapUtils.isNotEmpty(desiredConfigs)) {
 +
 +      Set<String> userSet = configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.USER, cluster, desiredConfigs);
 +      String userList = gson.toJson(userSet);
 +      clusterLevelParams.put(USER_LIST, userList);
 +
 +      //Create a user_group mapping and send it as part of the hostLevelParams
 +      Map<String, Set<String>> userGroupsMap = configHelper.createUserGroupsMap(
 +          stackId, cluster, desiredConfigs);
 +      String userGroups = gson.toJson(userGroupsMap);
 +      clusterLevelParams.put(USER_GROUPS, userGroups);
 +
 +      Set<String> groupSet = configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.GROUP, cluster, desiredConfigs);
 +      String groupList = gson.toJson(groupSet);
 +      clusterLevelParams.put(GROUP_LIST, groupList);
 +    }
 +    Set<String> notManagedHdfsPathSet = configHelper.getPropertyValuesWithPropertyType(stackId,
 +        PropertyType.NOT_MANAGED_HDFS_PATH, cluster, desiredConfigs);
 +    String notManagedHdfsPathList = gson.toJson(notManagedHdfsPathSet);
 +    clusterLevelParams.put(NOT_MANAGED_HDFS_PATH_LIST, notManagedHdfsPathList);
 +
 +    clusterLevelParams.put(CLUSTER_NAME, cluster.getClusterName());
 +
 +    StackInfo stackInfo = ambariMetaInfo.getStack(stackId.getStackName(), stackId.getStackVersion());
 +    clusterLevelParams.put(HOOKS_FOLDER, stackInfo.getStackHooksFolder());
 +
 +    return clusterLevelParams;
 +  }
 +
 +  public TreeMap<String, String> getMetadataClusterLevelConfigsParams(Cluster cluster, StackId stackId) throws AmbariException {
 +    TreeMap<String, String> clusterLevelParams = new TreeMap<>();
 +
 +    Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
 +    if (MapUtils.isNotEmpty(desiredConfigs)) {
 +
 +      Set<String> userSet = configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.USER, cluster, desiredConfigs);
 +      String userList = gson.toJson(userSet);
 +      clusterLevelParams.put(USER_LIST, userList);
 +
 +      //Create a user_group mapping and send it as part of the hostLevelParams
 +      Map<String, Set<String>> userGroupsMap = configHelper.createUserGroupsMap(
 +          stackId, cluster, desiredConfigs);
 +      String userGroups = gson.toJson(userGroupsMap);
 +      clusterLevelParams.put(USER_GROUPS, userGroups);
 +
 +      Set<String> groupSet = configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.GROUP, cluster, desiredConfigs);
 +      String groupList = gson.toJson(groupSet);
 +      clusterLevelParams.put(GROUP_LIST, groupList);
 +    }
 +    Set<String> notManagedHdfsPathSet = configHelper.getPropertyValuesWithPropertyType(stackId,
 +        PropertyType.NOT_MANAGED_HDFS_PATH, cluster, desiredConfigs);
 +    String notManagedHdfsPathList = gson.toJson(notManagedHdfsPathSet);
 +    clusterLevelParams.put(NOT_MANAGED_HDFS_PATH_LIST, notManagedHdfsPathList);
 +
 +    return clusterLevelParams;
 +  }
 +
 +  public TreeMap<String, String> getMetadataAmbariLevelParams() throws AmbariException {
 +    TreeMap<String, String> clusterLevelParams = new TreeMap<>();
 +    clusterLevelParams.put(JDK_LOCATION, getJdkResourceUrl());
 +    clusterLevelParams.put(JAVA_HOME, getJavaHome());
 +    clusterLevelParams.put(JAVA_VERSION, String.valueOf(configs.getJavaVersion()));
 +    clusterLevelParams.put(JDK_NAME, getJDKName());
 +    clusterLevelParams.put(JCE_NAME, getJCEName());
 +    clusterLevelParams.put(DB_NAME, getServerDB());
 +    clusterLevelParams.put(MYSQL_JDBC_URL, getMysqljdbcUrl());
 +    clusterLevelParams.put(ORACLE_JDBC_URL, getOjdbcUrl());
 +    clusterLevelParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName());
 +    clusterLevelParams.putAll(getRcaParameters());
 +    clusterLevelParams.put(HOST_SYS_PREPPED, configs.areHostsSysPrepped());
 +    clusterLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, configs.isAgentStackRetryOnInstallEnabled());
 +    clusterLevelParams.put(AGENT_STACK_RETRY_COUNT, configs.getAgentStackRetryOnInstallCount());
 +
 +    return clusterLevelParams;
 +  }
- 
-   public TreeMap<String, String> getTopologyHostLevelParams(Cluster cluster, Host host) throws AmbariException {
-     TreeMap<String, String> hostLevelParams = new TreeMap<>();
-     String repoInfo = ambariMetaInfo.getRepoInfoString(cluster, host);
- 
-     hostLevelParams.put(REPO_INFO, repoInfo);
-     return hostLevelParams;
-   }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
index 3a3908d,8988be0..4143beb
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
@@@ -598,30 -618,25 +603,31 @@@ public class AmbariServer 
  
        String srvrCrtPass = configsMap.get(Configuration.SRVR_CRT_PASS.getKey());
  
 +
 +      HttpConfiguration https_config = new HttpConfiguration();
 +      https_config.addCustomizer(new SecureRequestCustomizer());
 +      https_config.setRequestHeaderSize(configs.getHttpRequestHeaderSize());
 +      https_config.setResponseHeaderSize(configs.getHttpResponseHeaderSize());
++      https_config.setSendServerVersion(false);
 +
        // Secured connector - default constructor sets trustAll = true for certs
 -      SslContextFactory contextFactory = new SslContextFactory();
 -      disableInsecureProtocols(contextFactory);
 -
 -      SslSelectChannelConnector agentSslConnector = new SslSelectChannelConnector(contextFactory);
 -      agentSslConnector.setKeystore(keystore);
 -      agentSslConnector.setTruststore(truststore);
 -      agentSslConnector.setPassword(srvrCrtPass);
 -      agentSslConnector.setKeyPassword(srvrCrtPass);
 -      agentSslConnector.setTrustPassword(srvrCrtPass);
 -      agentSslConnector.setKeystoreType(configsMap.get(Configuration.KSTR_TYPE.getKey()));
 -      agentSslConnector.setTruststoreType(configsMap.get(Configuration.TSTR_TYPE.getKey()));
 -      agentSslConnector.setNeedClientAuth(needClientAuth);
 -      agentSslConnector.setRequestHeaderSize(configs.getHttpRequestHeaderSize());
 -      agentSslConnector.setResponseHeaderSize(configs.getHttpResponseHeaderSize());
 +      SslContextFactory sslContextFactory = new SslContextFactory();
 +      disableInsecureProtocols(sslContextFactory);
 +      sslContextFactory.setKeyStorePath(keystore);
 +      sslContextFactory.setTrustStorePath(truststore);
 +      sslContextFactory.setKeyStorePassword(srvrCrtPass);
 +      sslContextFactory.setKeyManagerPassword(srvrCrtPass);
 +      sslContextFactory.setTrustStorePassword(srvrCrtPass);
 +      sslContextFactory.setKeyStoreType(configsMap.get(Configuration.KSTR_TYPE.getKey()));
 +      sslContextFactory.setTrustStoreType(configsMap.get(Configuration.TSTR_TYPE.getKey()));
 +      sslContextFactory.setNeedClientAuth(needClientAuth);
 +      ServerConnector agentSslConnector = new ServerConnector(server, acceptors, -1,
 +        new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.toString()),
 +        new HttpConnectionFactory(https_config));
        agentConnector = agentSslConnector;
      } else {
 -      agentConnector = new SelectChannelConnector();
 -      agentConnector.setMaxIdleTime(configs.getConnectionMaxIdleTime());
 +      agentConnector = new ServerConnector(server, acceptors, -1);
 +      agentConnector.setIdleTimeout(configs.getConnectionMaxIdleTime());
      }
  
      agentConnector.setPort(port);
@@@ -630,13 -645,10 +636,14 @@@
    }
  
    @SuppressWarnings("deprecation")
 -  private SelectChannelConnector createSelectChannelConnectorForClient() {
 +  private ServerConnector createSelectChannelConnectorForClient(Server server, int acceptors) {
      Map<String, String> configsMap = configs.getConfigsMap();
 -    SelectChannelConnector apiConnector;
 +    ServerConnector apiConnector;
  
 +    HttpConfiguration http_config = new HttpConfiguration();
 +    http_config.setRequestHeaderSize(configs.getHttpRequestHeaderSize());
 +    http_config.setResponseHeaderSize(configs.getHttpResponseHeaderSize());
++    http_config.setSendServerVersion(false);
      if (configs.getApiSSLAuthentication()) {
        String httpsKeystore = configsMap.get(Configuration.CLIENT_API_SSL_KSTR_DIR_NAME.getKey()) +
          File.separator + configsMap.get(Configuration.CLIENT_API_SSL_KSTR_NAME.getKey());

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariSessionManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigGroupRequest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java
index 0000000,29f8e2a..a7b9d80
mode 000000,100644..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java
@@@ -1,0 -1,329 +1,328 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.ambari.server.controller;
+ 
+ import static java.util.Collections.singleton;
+ import static java.util.stream.Collectors.toSet;
+ import static org.apache.ambari.server.controller.KerberosHelperImpl.BASE_LOG_DIR;
+ 
+ import java.io.File;
+ import java.lang.reflect.Type;
+ import java.util.ArrayList;
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+ import java.util.concurrent.ConcurrentMap;
+ 
+ import org.apache.ambari.server.AmbariException;
+ import org.apache.ambari.server.Role;
+ import org.apache.ambari.server.RoleCommand;
+ import org.apache.ambari.server.actionmanager.HostRoleStatus;
+ import org.apache.ambari.server.actionmanager.Stage;
+ import org.apache.ambari.server.actionmanager.StageFactory;
+ import org.apache.ambari.server.agent.CommandReport;
+ import org.apache.ambari.server.controller.internal.RequestResourceFilter;
+ import org.apache.ambari.server.serveraction.ServerAction;
+ import org.apache.ambari.server.serveraction.kerberos.AbstractPrepareKerberosServerAction;
+ import org.apache.ambari.server.serveraction.kerberos.Component;
+ import org.apache.ambari.server.serveraction.kerberos.DestroyPrincipalsServerAction;
+ import org.apache.ambari.server.serveraction.kerberos.KDCType;
+ import org.apache.ambari.server.serveraction.kerberos.KerberosOperationHandler;
+ import org.apache.ambari.server.serveraction.kerberos.KerberosServerAction;
+ import org.apache.ambari.server.state.Cluster;
+ import org.apache.ambari.server.state.Config;
+ import org.apache.ambari.server.state.StackId;
+ import org.apache.ambari.server.state.kerberos.KerberosDescriptor;
+ import org.apache.ambari.server.state.svccomphost.ServiceComponentHostServerActionEvent;
+ import org.apache.ambari.server.utils.StageUtils;
+ 
+ import com.google.gson.reflect.TypeToken;
+ 
+ 
+ /**
+  * I delete kerberos identities (principals and keytabs) of a given component.
+  */
+ class DeleteIdentityHandler {
+   private final AmbariCustomCommandExecutionHelper customCommandExecutionHelper;
+   private final Integer taskTimeout;
+   private final StageFactory stageFactory;
+   private final AmbariManagementController ambariManagementController;
+ 
+   public DeleteIdentityHandler(AmbariCustomCommandExecutionHelper customCommandExecutionHelper, Integer taskTimeout, StageFactory stageFactory, AmbariManagementController ambariManagementController) {
+     this.customCommandExecutionHelper = customCommandExecutionHelper;
+     this.taskTimeout = taskTimeout;
+     this.stageFactory = stageFactory;
+     this.ambariManagementController = ambariManagementController;
+   }
+ 
+   /**
+    * Creates and adds stages to the given stage container for deleting kerberos identities.
+    * The service component that belongs to the identity doesn't need to be installed.
+    */
+   public void addDeleteIdentityStages(Cluster cluster, OrderedRequestStageContainer stageContainer, CommandParams commandParameters, boolean manageIdentities)
+     throws AmbariException
+   {
+     ServiceComponentHostServerActionEvent event = new ServiceComponentHostServerActionEvent("AMBARI_SERVER", StageUtils.getHostName(), System.currentTimeMillis());
+     String hostParamsJson = StageUtils.getGson().toJson(customCommandExecutionHelper.createDefaultHostParams(cluster, cluster.getDesiredStackVersion()));
+     stageContainer.setClusterHostInfo(StageUtils.getGson().toJson(StageUtils.getClusterHostInfo(cluster)));
+     if (manageIdentities) {
+       addPrepareDeleteIdentity(cluster, hostParamsJson, event, commandParameters, stageContainer);
+       addDestroyPrincipals(cluster, hostParamsJson, event, commandParameters, stageContainer);
+       addDeleteKeytab(cluster, commandParameters.getAffectedHostNames(), hostParamsJson, commandParameters, stageContainer);
+     }
+     addFinalize(cluster, hostParamsJson, event, stageContainer, commandParameters);
+   }
+ 
+   private void addPrepareDeleteIdentity(Cluster cluster,
+                                         String hostParamsJson, ServiceComponentHostServerActionEvent event,
+                                         CommandParams commandParameters,
+                                         OrderedRequestStageContainer stageContainer)
+     throws AmbariException
+   {
+     Stage stage = createServerActionStage(stageContainer.getLastStageId(),
+       cluster,
+       stageContainer.getId(),
+       "Prepare delete identities",
+       "{}",
+       hostParamsJson,
+       PrepareDeleteIdentityServerAction.class,
+       event,
+       commandParameters.asMap(),
+       "Prepare delete identities",
+       taskTimeout);
+     stageContainer.addStage(stage);
+   }
+ 
+   private void addDestroyPrincipals(Cluster cluster,
+                                     String hostParamsJson, ServiceComponentHostServerActionEvent event,
+                                     CommandParams commandParameters,
+                                     OrderedRequestStageContainer stageContainer)
+     throws AmbariException
+   {
+     Stage stage = createServerActionStage(stageContainer.getLastStageId(),
+       cluster,
+       stageContainer.getId(),
+       "Destroy Principals",
+       "{}",
+       hostParamsJson,
+       DestroyPrincipalsServerAction.class,
+       event,
+       commandParameters.asMap(),
+       "Destroy Principals",
+       Math.max(ServerAction.DEFAULT_LONG_RUNNING_TASK_TIMEOUT_SECONDS, taskTimeout));
+     stageContainer.addStage(stage);
+   }
+ 
+   private void addDeleteKeytab(Cluster cluster,
+                                Set<String> hostFilter,
+                                String hostParamsJson,
+                                CommandParams commandParameters,
+                                OrderedRequestStageContainer stageContainer)
+     throws AmbariException
+   {
+     Stage stage = createNewStage(stageContainer.getLastStageId(),
+       cluster,
+       stageContainer.getId(),
+       "Delete Keytabs",
+       commandParameters.asJson(),
+       hostParamsJson);
+ 
+     Map<String, String> requestParams = new HashMap<>();
+     List<RequestResourceFilter> requestResourceFilters = new ArrayList<>();
+     RequestResourceFilter reqResFilter = new RequestResourceFilter("KERBEROS", "KERBEROS_CLIENT", new ArrayList<>(hostFilter));
+     requestResourceFilters.add(reqResFilter);
+ 
+     ActionExecutionContext actionExecContext = new ActionExecutionContext(
+       cluster.getClusterName(),
+       "REMOVE_KEYTAB",
+       requestResourceFilters,
+       requestParams);
+     customCommandExecutionHelper.addExecutionCommandsToStage(actionExecContext, stage, requestParams, null);
+     stageContainer.addStage(stage);
+   }
+ 
+   private void addFinalize(Cluster cluster,
+                            String hostParamsJson, ServiceComponentHostServerActionEvent event,
+                            OrderedRequestStageContainer requestStageContainer,
+                            CommandParams commandParameters)
+     throws AmbariException
+   {
+     Stage stage = createServerActionStage(requestStageContainer.getLastStageId(),
+       cluster,
+       requestStageContainer.getId(),
+       "Finalize Operations",
+       "{}",
+       hostParamsJson,
+       DeleteDataDirAction.class,
+       event,
+       commandParameters.asMap(),
+       "Finalize Operations", 300);
+     requestStageContainer.addStage(stage);
+   }
+ 
+ 
+   public static class CommandParams {
+     private final List<Component> components;
+     private final Set<String> identities;
+     private final String authName;
+     private final File dataDirectory;
+     private final String defaultRealm;
+     private final KDCType kdcType;
+ 
+     public CommandParams(List<Component> components, Set<String> identities, String authName, File dataDirectory, String defaultRealm, KDCType kdcType) {
+       this.components = components;
+       this.identities = identities;
+       this.authName = authName;
+       this.dataDirectory = dataDirectory;
+       this.defaultRealm = defaultRealm;
+       this.kdcType = kdcType;
+     }
+ 
+     public Map<String, String> asMap() {
+       Map<String, String> commandParameters = new HashMap<>();
+       commandParameters.put(KerberosServerAction.AUTHENTICATED_USER_NAME, authName);
+       commandParameters.put(KerberosServerAction.DEFAULT_REALM, defaultRealm);
+       commandParameters.put(KerberosServerAction.KDC_TYPE, kdcType.name());
+       commandParameters.put(KerberosServerAction.IDENTITY_FILTER, StageUtils.getGson().toJson(identities));
+       commandParameters.put(KerberosServerAction.COMPONENT_FILTER, StageUtils.getGson().toJson(components));
+       commandParameters.put(KerberosServerAction.DATA_DIRECTORY, dataDirectory.getAbsolutePath());
+       return commandParameters;
+     }
+ 
+     public Set<String> getAffectedHostNames() {
+       return components.stream().map(Component::getHostName).collect(toSet());
+     }
+ 
+     public String asJson() {
+       return StageUtils.getGson().toJson(asMap());
+     }
+   }
+ 
+   private static class PrepareDeleteIdentityServerAction extends AbstractPrepareKerberosServerAction {
+     @Override
+     public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext) throws AmbariException, InterruptedException {
+       KerberosDescriptor kerberosDescriptor = getKerberosDescriptor();
+       processServiceComponents(
+         getCluster(),
+         kerberosDescriptor,
+         componentFilter(),
+         getIdentityFilter(),
+         dataDirectory(),
+         calculateConfig(kerberosDescriptor, serviceNames()),
+         new HashMap<>(),
+         false,
 -        new HashMap<>(),
 -          false);
++        new HashMap<>());
+       return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", actionLog.getStdOut(), actionLog.getStdErr());
+     }
+ 
+     private Set<String> serviceNames() {
+       return componentFilter().stream().map(component -> component.getServiceName()).collect(toSet());
+     }
+ 
+     private List<Component> componentFilter() {
+       Type jsonType = new TypeToken<List<Component>>() {}.getType();
+       return StageUtils.getGson().fromJson(getCommandParameterValue(KerberosServerAction.COMPONENT_FILTER), jsonType);
+     }
+ 
+     /**
+      * Cleaning identities is asynchronous, it can happen that the service and its configuration is already deleted at this point.
+      * We're extending the actual config with the properties of the latest deleted configuration of the service.
+      * The service configuration is needed because principal names may contain placeholder variables which are replaced based on the service configuration.
+      */
+     private Map<String, Map<String, String>> calculateConfig(KerberosDescriptor kerberosDescriptor, Set<String> serviceNames) throws AmbariException {
+       Map<String, Map<String, String>> actualConfig = getKerberosHelper().calculateConfigurations(getCluster(), null, kerberosDescriptor, false, false);
+       extendWithDeletedConfigOfService(actualConfig, serviceNames);
+       return actualConfig;
+     }
+ 
+     private void extendWithDeletedConfigOfService(Map<String, Map<String, String>> configToBeExtended, Set<String> serviceNames) throws AmbariException {
+       Set<String> deletedConfigTypes = serviceNames.stream()
+         .flatMap(serviceName -> configTypesOfService(serviceName).stream())
+         .collect(toSet());
+       for (Config deletedConfig : getCluster().getLatestConfigsWithTypes(deletedConfigTypes)) {
+         configToBeExtended.put(deletedConfig.getType(), deletedConfig.getProperties());
+       }
+     }
+ 
+     private Set<String> configTypesOfService(String serviceName) {
+       try {
+         StackId stackId = getCluster().getCurrentStackVersion();
+         StackServiceRequest stackServiceRequest = new StackServiceRequest(stackId.getStackName(), stackId.getStackVersion(), serviceName);
+         return AmbariServer.getController().getStackServices(singleton(stackServiceRequest)).stream()
+           .findFirst()
+           .orElseThrow(() -> new IllegalArgumentException("Could not find stack service " + serviceName))
+           .getConfigTypes()
+           .keySet();
+       } catch (AmbariException e) {
+         throw new RuntimeException(e);
+       }
+     }
+ 
+     private String dataDirectory() {
+       return getCommandParameterValue(getCommandParameters(), DATA_DIRECTORY);
+     }
+ 
+     private KerberosDescriptor getKerberosDescriptor() throws AmbariException {
+       return getKerberosHelper().getKerberosDescriptor(getCluster(), false);
+     }
+   }
+ 
+   private Stage createNewStage(long id, Cluster cluster, long requestId, String requestContext, String commandParams, String hostParams) {
+     Stage stage = stageFactory.createNew(requestId,
+       BASE_LOG_DIR + File.pathSeparator + requestId,
+       cluster.getClusterName(),
+       cluster.getClusterId(),
+       requestContext,
+       commandParams,
+       hostParams);
+     stage.setStageId(id);
+     return stage;
+   }
+ 
+   private Stage createServerActionStage(long id, Cluster cluster, long requestId,
+                                        String requestContext,
+                                        String commandParams, String hostParams,
+                                        Class<? extends ServerAction> actionClass,
+                                        ServiceComponentHostServerActionEvent event,
+                                        Map<String, String> commandParameters, String commandDetail,
+                                        Integer timeout) throws AmbariException {
+ 
+     Stage stage = createNewStage(id, cluster, requestId, requestContext,  commandParams, hostParams);
+     stage.addServerActionCommand(actionClass.getName(), null, Role.AMBARI_SERVER_ACTION,
+       RoleCommand.EXECUTE, cluster.getClusterName(), event, commandParameters, commandDetail,
+       ambariManagementController.findConfigurationTagsWithOverrides(cluster, null), timeout,
+       false, false);
+ 
+     return stage;
+   }
+ 
+   private static class DeleteDataDirAction extends KerberosServerAction {
+ 
+     @Override
+     public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext) throws AmbariException, InterruptedException {
+       deleteDataDirectory(getCommandParameterValue(DATA_DIRECTORY));
+       return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", actionLog.getStdOut(), actionLog.getStdErr());
+     }
+ 
+     @Override
+     protected CommandReport processIdentity(Map<String, String> identityRecord, String evaluatedPrincipal, KerberosOperationHandler operationHandler, Map<String, String> kerberosConfiguration, Map<String, Object> requestSharedDataContext) throws AmbariException {
+       return null;
+     }
+   }
+ }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
index ca2dda5,20c5708..bb360b5
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
@@@ -49,6 -51,18 +51,14 @@@ public interface KerberosHelper 
     */
    String DIRECTIVE_REGENERATE_KEYTABS = "regenerate_keytabs";
    /**
+    * directive used to pass host list to regenerate keytabs on
+    */
+   String DIRECTIVE_HOSTS = "regenerate_hosts";
+   /**
+    * directive used to pass list of services and their components to regenerate keytabs for
+    */
+   String DIRECTIVE_COMPONENTS = "regenerate_components";
+   /**
 -   * directive used to pass host list to regenerate keytabs on
 -   */
 -  String DIRECTIVE_IGNORE_CONFIGS = "ignore_config_updates";
 -  /**
     * directive used to indicate that the enable Kerberos operation should proceed even if the
     * cluster's security type is not changing
     */

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
index 6687942,67b08fd..013a063
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
@@@ -248,10 -262,16 +262,13 @@@ public class KerberosHelperImpl impleme
  
                CreatePrincipalsAndKeytabsHandler handler = null;
  
+               Set<String> hostFilter = parseHostFilter(requestProperties);
+               Map<String, Set<String>> serviceComponentFilter = parseComponentFilter(requestProperties);
+ 
 -              boolean updateConfigurations = !requestProperties.containsKey(DIRECTIVE_IGNORE_CONFIGS)
 -                  || !"true".equalsIgnoreCase(requestProperties.get(DIRECTIVE_IGNORE_CONFIGS));
 -
                if ("true".equalsIgnoreCase(value) || "all".equalsIgnoreCase(value)) {
 -                handler = new CreatePrincipalsAndKeytabsHandler(true, updateConfigurations, true);
 +                handler = new CreatePrincipalsAndKeytabsHandler(true, true, true);
                } else if ("missing".equalsIgnoreCase(value)) {
 -                handler = new CreatePrincipalsAndKeytabsHandler(false, updateConfigurations, true);
 +                handler = new CreatePrincipalsAndKeytabsHandler(false, true, true);
                }
  
                if (handler != null) {
@@@ -1194,18 -1525,21 +1522,20 @@@
              }
  
              // Append an entry to the action data file builder...
-             kerberosIdentityDataFileWriter.writeRecord(
-                 hostname,
-                 serviceName,
-                 componentName,
-                 principal,
-                 principalType,
-                 keytabFilePath,
-                 keytabFileOwnerName,
-                 keytabFileOwnerAccess,
-                 keytabFileGroupName,
-                 keytabFileGroupAccess,
-                 (keytabIsCachable) ? "true" : "false");
+             if(kerberosIdentityDataFileWriter != null) {
+               kerberosIdentityDataFileWriter.writeRecord(
+                   hostname,
+                   serviceName,
+                   componentName,
+                   principal,
+                   principalType,
+                   keytabFilePath,
+                   keytabFileOwnerName,
+                   keytabFileOwnerAccess,
+                   keytabFileGroupName,
+                   keytabFileGroupAccess,
 -                  (keytabIsCachable) ? "true" : "false",
 -                  (ignoreHeadless && principalDescriptor.getType() == KerberosPrincipalType.USER) ? "true" : "false");
++                  (keytabIsCachable) ? "true" : "false");
+             }
  
              // Add the principal-related configuration to the map of configurations
              mergeConfiguration(kerberosConfigurations, principalConfiguration, principal, null);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
index 0735e27,8c68f41..792a166
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
@@@ -26,23 -26,26 +26,21 @@@ public class RepositoryResponse 
    private String osType;
    private String repoId;
    private String repoName;
 -  private String distribution;
 -  private String components;
    private String mirrorsList;
    private String defaultBaseUrl;
-   private String latestBaseUrl;
    private Long repositoryVersionId;
    private String versionDefinitionId;
    private Long clusterVersionId;
    private boolean unique;
  
    public RepositoryResponse(String baseUrl, String osType, String repoId,
-       String repoName, String mirrorsList, String defaultBaseUrl, String latestBaseUrl) {
 -                            String repoName, String distribution, String components,
 -                            String mirrorsList, String defaultBaseUrl) {
++                            String repoName, String mirrorsList, String defaultBaseUrl) {
      setBaseUrl(baseUrl);
      setOsType(osType);
      setRepoId(repoId);
      setRepoName(repoName);
 -    setDistribution(distribution);
 -    setComponents(components);
      setMirrorsList(mirrorsList);
      setDefaultBaseUrl(defaultBaseUrl);
-     setLatestBaseUrl(latestBaseUrl);
    }
  
    public String getStackName() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
index 6c4e096,1cd2d10..e0df487
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
@@@ -494,17 -524,17 +520,20 @@@ public abstract class AbstractProviderM
  
    @Override
    public String getPort(String clusterName, String componentName, String hostName, boolean httpsEnabled) throws SystemException {
 +    // Parent map need not be synchronized
-     ConcurrentMap<String, ConcurrentMap<String, String>> clusterJmxPorts = jmxPortMap.get(clusterName);
-     if (clusterJmxPorts == null) {
+     ConcurrentMap<String, ConcurrentMap<String, String>> clusterJmxPorts;
+     // Still need double check to ensure single init
+     if (!jmxPortMap.containsKey(clusterName)) {
        synchronized (jmxPortMap) {
-         clusterJmxPorts = jmxPortMap.get(clusterName);
-         if (clusterJmxPorts == null) {
+         if (!jmxPortMap.containsKey(clusterName)) {
            clusterJmxPorts = new ConcurrentHashMap<>();
            jmxPortMap.put(clusterName, clusterJmxPorts);
          }
        }
      }
++
+     clusterJmxPorts = jmxPortMap.get(clusterName);
++
      Service.Type service = componentServiceMap.get(componentName);
  
      if (service != null) {
@@@ -828,49 -866,33 +865,34 @@@
      }
    }
  
+   // TODO: Fix for multi-service feature support (trunk)
+   // Called from a synchornized block !
    private void initProviderMaps() throws SystemException {
-     ResourceProvider provider = getResourceProvider(Resource.Type.Cluster);
- 
-     Set<String> propertyIds = new HashSet<>();
-     propertyIds.add(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID);
- 
-     Map<String, String> requestInfoProperties = new HashMap<>();
-     requestInfoProperties.put(ClusterResourceProvider.GET_IGNORE_PERMISSIONS_PROPERTY_ID, "true");
- 
-     Request request = PropertyHelper.getReadRequest(propertyIds,
-         requestInfoProperties, null, null, null);
- 
-     try {
-       jmxPortMap.clear();
-       Set<Resource> clusters = provider.getResources(request, null);
- 
-       clusterHostComponentMap = new HashMap<>();
-       clusterGangliaCollectorMap = new HashMap<>();
- 
-       for (Resource cluster : clusters) {
  
-         String clusterName = (String) cluster.getPropertyValue(CLUSTER_NAME_PROPERTY_ID);
+     jmxPortMap.clear();
+     clusterHostComponentMap = new HashMap<>();
+     clusterGangliaCollectorMap = new HashMap<>();
  
-         // initialize the host component map and Ganglia server from the known hosts components...
-         provider = getResourceProvider(Resource.Type.HostComponent);
- 
-         request = PropertyHelper.getReadRequest(HOST_COMPONENT_HOST_NAME_PROPERTY_ID,
-             HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+     Map<String, Cluster> clusterMap = clusters.getClusters();
+     if (MapUtils.isEmpty(clusterMap)) {
+       return;
+     }
  
-         Predicate predicate = new PredicateBuilder().property(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID).
-             equals(clusterName).toPredicate();
+     for (Cluster cluster : clusterMap.values()) {
+       String clusterName = cluster.getClusterName();
 -      Map<String, String> hostComponentMap = clusterHostComponentMap.get(clusterName);
  
-         Set<Resource> hostComponents = provider.getResources(request, predicate);
-         Map<String, String> hostComponentMap = clusterHostComponentMap.get(clusterName);
++      Map<String, String> hostComponentMap = clusterHostComponentMap.get(clusterName);
+       if (hostComponentMap == null) {
+         hostComponentMap = new HashMap<>();
+         clusterHostComponentMap.put(clusterName, hostComponentMap);
+       }
  
-         if (hostComponentMap == null) {
-           hostComponentMap = new HashMap<>();
-           clusterHostComponentMap.put(clusterName, hostComponentMap);
-         }
+       List<ServiceComponentHost> serviceComponentHosts = cluster.getServiceComponentHosts();
 +
-         for (Resource hostComponent : hostComponents) {
-           String componentName = (String) hostComponent.getPropertyValue(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
-           String hostName = (String) hostComponent.getPropertyValue(HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
+       if (!CollectionUtils.isEmpty(serviceComponentHosts)) {
+         for (ServiceComponentHost sch : serviceComponentHosts) {
+           String componentName = sch.getServiceComponentName();
+           String hostName = sch.getHostName();
  
            hostComponentMap.put(componentName, hostName);
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
index 081737a,c7450b3..1d4c155
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
@@@ -427,36 -424,6 +427,44 @@@ public class CalculatedStatus 
    }
  
    /**
 +   * Calculates the status for specified request by id.
 +   * @param s_hostRoleCommandDAO is used to retrieve the map of stage-to-summary value objects
 +   * @param topologyManager topology manager
 +   * @param requestId the request id
 +   * @return the calculated status
 +   */
 +  public static CalculatedStatus statusFromRequest(HostRoleCommandDAO s_hostRoleCommandDAO,
 +                                                   TopologyManager topologyManager, Long requestId) {
 +    Map<Long, HostRoleCommandStatusSummaryDTO> summary = s_hostRoleCommandDAO.findAggregateCounts(requestId);
 +
 +    // get summaries from TopologyManager for logical requests
 +    summary.putAll(topologyManager.getStageSummaries(requestId));
 +
 +    // summary might be empty due to delete host have cleared all
 +    // HostRoleCommands or due to hosts haven't registered yet with the cluster
 +    // when the cluster is provisioned with a Blueprint
++    final CalculatedStatus status;
 +    LogicalRequest logicalRequest = topologyManager.getRequest(requestId);
 +    if (summary.isEmpty() && null != logicalRequest) {
-       // in this case, it appears that there are no tasks but this is a logical
++      // In this case, it appears that there are no tasks but this is a logical
 +      // topology request, so it's a matter of hosts simply not registering yet
-       // for tasks to be created
-       return CalculatedStatus.PENDING;
++      // for tasks to be created ==> status = PENDING.
++      // For a new LogicalRequest there should be at least one HostRequest,
++      // while if they were removed already ==> status = COMPLETED.
++      if (logicalRequest.getHostRequests().isEmpty()) {
++        status = CalculatedStatus.COMPLETED;
++      } else {
++        status = CalculatedStatus.PENDING;
++      }
 +    } else {
 +      // there are either tasks or this is not a logical request, so do normal
 +      // status calculations
-       return CalculatedStatus.statusFromStageSummary(summary, summary.keySet());
++      status = CalculatedStatus.statusFromStageSummary(summary, summary.keySet());
 +    }
++    return status;
 +  }
 +
 +  /**
     * Calculates the overall status of an upgrade. If there are no tasks, then a
     * status of {@link HostRoleStatus#COMPLETED} is returned.
     *

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
index cc5b6c0,9f4a4a0..0ad967b
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
@@@ -442,7 -443,10 +443,8 @@@ public class ClientConfigResourceProvid
          jsonContent.put("clusterHostInfo", clusterHostInfo);
          jsonContent.put("hostLevelParams", hostLevelParams);
          jsonContent.put("hostname", hostName);
+         jsonContent.put("public_hostname", publicHostName);
          jsonContent.put("clusterName", cluster.getClusterName());
 -        jsonContent.put("serviceName", serviceName);
 -        jsonContent.put("role", componentName);
          jsonConfigurations = gson.toJson(jsonContent);
  
          File tmpDirectory = new File(TMP_PATH);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
index ae2fa25,ba5a4e7..5d75b99
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
@@@ -190,23 -192,23 +197,29 @@@ public class ClusterStackVersionResourc
    private static Configuration configuration;
  
    @Inject
-   private static Injector injector;
+   private static RepositoryVersionHelper repoVersionHelper;
+ 
+   @Inject
+   private static Gson gson;
+ 
+   @Inject
+   private static Provider<AmbariMetaInfo> metaInfo;
  
    @Inject
-   private static HostComponentStateDAO hostComponentStateDAO;
+   private static Provider<Clusters> clusters;
  
 +  @Inject
 +  private static Provider<MetadataHolder> m_metadataHolder;
 +
 +  @Inject
 +  private static Provider<AmbariManagementControllerImpl> m_ambariManagementController;
 +
    /**
-    * We have to include such a hack here, because if we
-    * make finalizeUpgradeAction field static and request injection
-    * for it, there will be a circle dependency error
+    * Used for updating the existing stack tools with those of the stack being
+    * distributed.
     */
-   private FinalizeUpgradeAction finalizeUpgradeAction = injector.getInstance(FinalizeUpgradeAction.class);
+   @Inject
+   private static Provider<ConfigHelper> configHelperProvider;
  
    /**
     * Constructor.
@@@ -374,76 -442,74 +452,73 @@@
            String.format("Version %s is backed by a version definition, but it could not be parsed", desiredRepoVersion), e);
      }
  
-     // get all of the host eligible for stack distribution
-     List<Host> hosts = getHostsForStackDistribution(cluster);
+     // if true, then we need to force all new host versions into the INSTALLED state
+     boolean forceInstalled = Boolean.parseBoolean((String)propertyMap.get(
+         CLUSTER_STACK_VERSION_FORCE));
+ 
+     try {
+       // either create the necessary host version entries, or set them to INSTALLING when attempting to re-distribute an existing version
+       return createOrUpdateHostVersions(cluster, repoVersionEntity, desiredVersionDefinition,
+           stackId, forceInstalled, propertyMap);
+     } catch (AmbariException e) {
+       throw new SystemException("Can not persist request", e);
+     }
+   }
+ 
 -  @Transactional(rollbackOn = {RuntimeException.class, SystemException.class, AmbariException.class})
++  @Transactional
+   RequestStatus createOrUpdateHostVersions(Cluster cluster,
+       RepositoryVersionEntity repoVersionEntity, VersionDefinitionXml versionDefinitionXml,
+       StackId stackId, boolean forceInstalled, Map<String, Object> propertyMap)
+       throws AmbariException, SystemException {
  
-     /*
-     If there is a repository that is already ATTEMPTED to be installed and the version
-     is GREATER than the one trying to install, we must fail (until we can support that via Patch Upgrades)
+     final String desiredRepoVersion = repoVersionEntity.getVersion();
  
-     For example:
+     // get all of the hosts eligible for stack distribution
+     List<Host> hosts = Lists.newArrayList(cluster.getHosts());
  
-     1. Install 2.3.0.0
-     2. Register and Install 2.5.0.0 (with or without package-version; it gets computed correctly)
-     3. Register 2.4 (without package-version)
  
-     Installation of 2.4 will fail because the way agents invoke installation is to
-     install by name.  if the package-version is not known, then the 'newest' is ALWAYS installed.
-     In this case, 2.5.0.0.  2.4 is never picked up.
-     */
-     for (ClusterVersionEntity clusterVersion : clusterVersionDAO.findByCluster(clName)) {
-       RepositoryVersionEntity clusterRepoVersion = clusterVersion.getRepositoryVersion();
+     for (Host host : hosts) {
+       for (HostVersionEntity hostVersion : host.getAllHostVersions()) {
+         RepositoryVersionEntity hostRepoVersion = hostVersion.getRepositoryVersion();
  
-       int compare = compareVersions(clusterRepoVersion.getVersion(), desiredRepoVersion);
+         // !!! ignore stack differences
+         if (!hostRepoVersion.getStackName().equals(repoVersionEntity.getStackName())) {
+           continue;
+         }
  
-       // ignore earlier versions
-       if (compare <= 0) {
-         continue;
-       }
+         int compare = compareVersions(hostRepoVersion.getVersion(), desiredRepoVersion);
  
-       // !!! the version is greater to the one to install
+         // ignore earlier versions
+         if (compare <= 0) {
+           continue;
+         }
  
-       // if the stacks are different, then don't fail (further check same-stack version strings)
-       if (!StringUtils.equals(clusterRepoVersion.getStackName(), repoVersionEnt.getStackName())) {
-         continue;
-       }
+         // !!! the version is greater to the one to install
  
-       // if there is no backing VDF for the desired version, allow the operation (legacy behavior)
-       if (null == desiredVersionDefinition) {
-         continue;
-       }
+         // if there is no backing VDF for the desired version, allow the operation (legacy behavior)
+         if (null == versionDefinitionXml) {
+           continue;
+         }
  
-       // backing VDF does not define the package version for any of the hosts, cannot install (allows a VDF with package-version)
-       for (Host host : hosts) {
-         if (StringUtils.isBlank(desiredVersionDefinition.getPackageVersion(host.getOsFamily()))) {
+         if (StringUtils.isBlank(versionDefinitionXml.getPackageVersion(host.getOsFamily()))) {
            String msg = String.format("Ambari cannot install version %s.  Version %s is already installed.",
-             desiredRepoVersion, clusterRepoVersion.getVersion());
+             desiredRepoVersion, hostRepoVersion.getVersion());
            throw new IllegalArgumentException(msg);
          }
        }
      }
  
-     // if true, then we need to force all new host versions into the INSTALLED state
-     boolean forceInstalled = Boolean.parseBoolean((String)propertyMap.get(
-         CLUSTER_STACK_VERSION_FORCE));
- 
-     final RequestStatusResponse response;
 -    checkPatchVDFAvailableServices(cluster, repoVersionEntity, versionDefinitionXml);
  
-     try {
-       if (forceInstalled) {
-         createHostVersions(cluster, hosts, stackId, desiredRepoVersion, RepositoryVersionState.INSTALLED);
-         response = null;
-       } else {
-         createHostVersions(cluster, hosts, stackId, desiredRepoVersion,
-             RepositoryVersionState.INSTALLING);
+     // the cluster will create/update all of the host versions to the correct state
+     List<Host> hostsNeedingInstallCommands = cluster.transitionHostsToInstalling(
+         repoVersionEntity, versionDefinitionXml, forceInstalled);
  
-         RequestStageContainer installRequest = createOrchestration(cluster, stackId, hosts,
-             repoVersionEnt, propertyMap);
+     RequestStatusResponse response = null;
+     if (!forceInstalled) {
+       RequestStageContainer installRequest = createOrchestration(cluster, stackId,
+           hostsNeedingInstallCommands, repoVersionEntity, versionDefinitionXml, propertyMap);
  
-         response = installRequest.getRequestStatusResponse();
-       }
-     } catch (AmbariException e) {
-       throw new SystemException("Can not persist request", e);
+       response = installRequest.getRequestStatusResponse();
      }
  
      return getRequestStatus(response);
@@@ -572,8 -597,12 +606,15 @@@
        // determine services for the repo
        Set<String> serviceNames = new HashSet<>();
  
-       // !!! TODO for patch upgrades, we need to limit the serviceNames to those
-       // that are detailed for the repository
++
++      checkPatchVDFAvailableServices(cluster, repoVersionEnt, desiredVersionDefinition);
++
+       // !!! limit the serviceNames to those that are detailed for the repository.
+       // TODO packages don't have component granularity
+       if (RepositoryType.STANDARD != repoVersionEnt.getType()) {
+         ClusterVersionSummary clusterSummary = desiredVersionDefinition.getClusterSummary(cluster);
+         serviceNames.addAll(clusterSummary.getAvailableServiceNames());
+       }
  
        // Populate with commands for host
        for (int i = 0; i < maxTasks && hostIterator.hasNext(); i++) {
@@@ -605,21 -635,60 +647,58 @@@
      return req;
    }
  
+   /**
+    * Reject PATCH VDFs with Services that are not included in the Cluster
+    * @param cluster cluster instance
+    * @param repoVersionEnt repo version entity
+    * @param desiredVersionDefinition VDF
+    * @throws IllegalArgumentException thrown if VDF includes services that are not installed
+    * @throws AmbariException thrown if could not load stack for repo repoVersionEnt
+    */
+   protected void checkPatchVDFAvailableServices(Cluster cluster, RepositoryVersionEntity repoVersionEnt,
+                                               VersionDefinitionXml desiredVersionDefinition) throws SystemException, AmbariException {
+     if (repoVersionEnt.getType() == RepositoryType.PATCH) {
+ 
+       Collection<String> notPresentServices = new ArrayList<>();
+       Collection<String> presentServices = new ArrayList<>();
+ 
+       presentServices.addAll(cluster.getServices().keySet());
+       final StackInfo stack;
+       stack = metaInfo.get().getStack(repoVersionEnt.getStackName(), repoVersionEnt.getStackVersion());
+ 
+       for (AvailableService availableService : desiredVersionDefinition.getAvailableServices(stack)) {
+         String name = availableService.getName();
+         if (!presentServices.contains(name)) {
+           notPresentServices.add(name);
+         }
+       }
+       if (!notPresentServices.isEmpty()) {
+         throw new IllegalArgumentException(String.format("%s VDF includes services that are not installed: %s",
+             RepositoryType.PATCH, StringUtils.join(notPresentServices, ",")));
+       }
+     }
+   }
+ 
 -  @Transactional
 -  ActionExecutionContext getHostVersionInstallCommand(RepositoryVersionEntity repoVersion,
 +  private ActionExecutionContext getHostVersionInstallCommand(RepositoryVersionEntity repoVersion,
        Cluster cluster, AmbariManagementController managementController, AmbariMetaInfo ami,
-       final StackId stackId, Set<String> repoServices, Map<String, List<RepositoryEntity>> perOsRepos, Stage stage1, Host host)
+       final StackId stackId, Set<String> repoServices, Stage stage1, Host host)
            throws SystemException {
+ 
 -
      // Determine repositories for host
      String osFamily = host.getOsFamily();
-     final List<RepositoryEntity> repoInfo = perOsRepos.get(osFamily);
-     if (repoInfo == null) {
-       throw new SystemException(String.format("Repositories for os type %s are " +
-                       "not defined. Repo version=%s, stackId=%s",
-         osFamily, repoVersion.getVersion(), stackId));
+ 
+     OperatingSystemEntity osEntity = null;
+     for (OperatingSystemEntity os : repoVersion.getOperatingSystems()) {
+       if (os.getOsType().equals(osFamily)) {
+         osEntity = os;
+         break;
+       }
      }
  
-     if (repoInfo.isEmpty()){
-       LOG.error(String.format("Repository list is empty. Ambari may not be managing the repositories for %s", osFamily));
+     if (null == osEntity || CollectionUtils.isEmpty(osEntity.getRepositories())) {
+       throw new SystemException(String.format("Repositories for os type %s are " +
 -          "not defined for version %s of Stack %s.",
++          "not defined. Repo version=%s, stackId=%s",
+             osFamily, repoVersion.getVersion(), stackId));
      }
  
      // determine packages for all services that are installed on host

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
index 5a56919,2e86b2d..447d7e8
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
@@@ -65,7 -63,7 +64,8 @@@ import org.apache.ambari.server.topolog
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.lang.Validate;
  
 +import com.google.inject.Inject;
+ import com.google.common.collect.Sets;
  import com.google.inject.assistedinject.Assisted;
  import com.google.inject.assistedinject.AssistedInject;
  import com.google.inject.persist.Transactional;
@@@ -97,11 -100,49 +100,48 @@@ public class ComponentResourceProvider 
    //Parameters from the predicate
    private static final String QUERY_PARAMETERS_RUN_SMOKE_TEST_ID = "params/run_smoke_test";
  
-   private static Set<String> pkPropertyIds =
-       new HashSet<>(Arrays.asList(new String[]{
+   private static Set<String> pkPropertyIds = Sets.newHashSet(
            COMPONENT_CLUSTER_NAME_PROPERTY_ID,
            COMPONENT_SERVICE_NAME_PROPERTY_ID,
-           COMPONENT_COMPONENT_NAME_PROPERTY_ID}));
+           COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+ 
+   /**
+    * The property ids for an servce resource.
+    */
+   private static final Set<String> PROPERTY_IDS = new HashSet<>();
+ 
+   /**
+    * The key property ids for an service resource.
+    */
+   private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = new HashMap<>();
+ 
+   static {
+     // properties
+     PROPERTY_IDS.add(COMPONENT_CLUSTER_NAME_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_SERVICE_NAME_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_DISPLAY_NAME_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_STATE_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_CATEGORY_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_TOTAL_COUNT_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_STARTED_COUNT_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_INSTALLED_COUNT_PROPERTY_ID);
 -    PROPERTY_IDS.add(COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID);
+ 
+     PROPERTY_IDS.add(COMPONENT_INIT_COUNT_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_UNKNOWN_COUNT_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID);
+     PROPERTY_IDS.add(COMPONENT_RECOVERY_ENABLED_ID);
+     PROPERTY_IDS.add(COMPONENT_DESIRED_STACK);
+     PROPERTY_IDS.add(COMPONENT_DESIRED_VERSION);
+     PROPERTY_IDS.add(COMPONENT_REPOSITORY_STATE);
+ 
+     PROPERTY_IDS.add(QUERY_PARAMETERS_RUN_SMOKE_TEST_ID);
+ 
+     // keys
+     KEY_PROPERTY_IDS.put(Resource.Type.Component, COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+     KEY_PROPERTY_IDS.put(Resource.Type.Service, COMPONENT_SERVICE_NAME_PROPERTY_ID);
+     KEY_PROPERTY_IDS.put(Resource.Type.Cluster, COMPONENT_CLUSTER_NAME_PROPERTY_ID);
+   }
  
    private MaintenanceStateHelper maintenanceStateHelper;
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
----------------------------------------------------------------------


[40/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

Posted by ao...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-ANY/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-ANY/scripts/params.py
index ea08470,4d92dbe..efd00bf
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-ANY/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-ANY/scripts/params.py
@@@ -48,11 -50,13 +50,13 @@@ architecture = get_architecture(
  dfs_type = default("/commandParams/dfs_type", "")
  
  artifact_dir = format("{tmp_dir}/AMBARI-artifacts/")
 -jdk_name = default("/hostLevelParams/jdk_name", None)
 -java_home = config['hostLevelParams']['java_home']
 -java_version = expect("/hostLevelParams/java_version", int)
 -jdk_location = config['hostLevelParams']['jdk_location']
 +jdk_name = default("/ambariLevelParams/jdk_name", None)
 +java_home = config['ambariLevelParams']['java_home']
 +java_version = expect("/ambariLevelParams/java_version", int)
 +jdk_location = config['ambariLevelParams']['jdk_location']
  
+ hadoop_custom_extensions_enabled = default("/configurations/core-site/hadoop.custom-extensions.enabled", False)
+ 
  sudo = AMBARI_SUDO_BINARY
  
  ambari_server_hostname = config['clusterHostInfo']['ambari_server_host'][0]

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
index a2b119d,50c5a40..811cc11
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
@@@ -109,5 -109,7 +109,7 @@@ smoke_user_dirs = format("/tmp/hadoop-{
  if has_hbase_masters:
    hbase_user_dirs = format("/home/{hbase_user},/tmp/{hbase_user},/usr/bin/{hbase_user},/var/log/{hbase_user},{hbase_tmp_dir}")
  #repo params
 -repo_info = config['hostLevelParams']['repo_info']
 +repo_info = config['hostLevelParams']['repoInfo']
  service_repo_info = default("/hostLevelParams/service_repo_info",None)
+ 
+ repo_file = default("/repositoryFile", None)

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
index 28f5df4,9f2b344..d0456ce
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
@@@ -19,17 -19,18 +19,16 @@@ limitations under the License
  
  from ambari_commons.os_check import OSCheck
  from resource_management.libraries.resources.repository import Repository
+ from resource_management.libraries.functions.repository_util import create_repo_files, CommandRepository, UBUNTU_REPO_COMPONENTS_POSTFIX
  from resource_management.core.logger import Logger
- import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set.
+ import ambari_simplejson as json
  
- # components_lits = repoName + postfix
- _UBUNTU_REPO_COMPONENTS_POSTFIX = ["main"]
  
 -def _alter_repo(action, repo_string, repo_template):
 +def _alter_repo(action, repo_dicts, repo_template):
    """
    @param action: "delete" or "create"
 -  @param repo_string: e.g. "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
 +  @param repo_dicts: e.g. "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
    """
 -  repo_dicts = json.loads(repo_string)
 -
    if not isinstance(repo_dicts, list):
      repo_dicts = [repo_dicts]
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-START/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-START/scripts/params.py
index 1f13e03,c8880ae..466837c
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-START/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-START/scripts/params.py
@@@ -35,8 -39,13 +39,13 @@@ config = Script.get_config(
  tmp_dir = Script.get_tmp_dir()
  artifact_dir = tmp_dir + "/AMBARI-artifacts"
  
+ version_for_stack_feature_checks = get_stack_feature_version(config)
+ stack_supports_hadoop_custom_extensions = check_stack_feature(StackFeature.HADOOP_CUSTOM_EXTENSIONS, version_for_stack_feature_checks)
+ 
+ sudo = AMBARI_SUDO_BINARY
+ 
  # Global flag enabling or disabling the sysprep feature
 -host_sys_prepped = default("/hostLevelParams/host_sys_prepped", False)
 +host_sys_prepped = default("/ambariLevelParams/host_sys_prepped", False)
  
  # Whether to skip copying fast-hdfs-resource.jar to /var/lib/ambari-agent/lib/
  # This is required if tarballs are going to be copied to HDFS, so set to False
@@@ -45,8 -54,9 +54,9 @@@ sysprep_skip_copy_fast_jar_hdfs = host_
  # Whether to skip setting up the unlimited key JCE policy
  sysprep_skip_setup_jce = host_sys_prepped and default("/configurations/cluster-env/sysprep_skip_setup_jce", False)
  
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
+ major_stack_version = get_major_version(stack_version_formatted)
  
  dfs_type = default("/commandParams/dfs_type", "")
  hadoop_conf_dir = "/etc/hadoop/conf"
@@@ -106,12 -116,19 +116,19 @@@ oozie_servers = default("/clusterHostIn
  hcat_server_hosts = default("/clusterHostInfo/webhcat_server_host", [])
  hive_server_host =  default("/clusterHostInfo/hive_server_host", [])
  hbase_master_hosts = default("/clusterHostInfo/hbase_master_hosts", [])
 -hs_host = default("/clusterHostInfo/hs_host", [])
 +hs_host = default("/clusterHostInfo/historyserver_hosts", [])
  jtnode_host = default("/clusterHostInfo/jtnode_host", [])
 -namenode_host = default("/clusterHostInfo/namenode_host", [])
 +namenode_host = default("/clusterHostInfo/namenode_hosts", [])
  zk_hosts = default("/clusterHostInfo/zookeeper_hosts", [])
  ganglia_server_hosts = default("/clusterHostInfo/ganglia_server_host", [])
- ams_collector_hosts = ",".join(default("/clusterHostInfo/metrics_collector_hosts", []))
+ cluster_name = config["clusterName"]
+ set_instanceId = "false"
+ if 'cluster-env' in config['configurations'] and \
+     'metrics_collector_external_hosts' in config['configurations']['cluster-env']:
+   ams_collector_hosts = config['configurations']['cluster-env']['metrics_collector_external_hosts']
+   set_instanceId = "true"
+ else:
+   ams_collector_hosts = ",".join(default("/clusterHostInfo/metrics_collector_hosts", []))
  
  has_namenode = not len(namenode_host) == 0
  has_resourcemanager = not len(rm_host) == 0

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-START/scripts/shared_initialization.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/config-upgrade.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/after-INSTALL/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/3.0/hooks/after-INSTALL/scripts/params.py
index d2979bb,ddc6100..e553e18
--- a/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/after-INSTALL/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/after-INSTALL/scripts/params.py
@@@ -40,11 -41,21 +41,21 @@@ host_sys_prepped = default("/ambariLeve
  
  sudo = AMBARI_SUDO_BINARY
  
 -stack_version_unformatted = config['hostLevelParams']['stack_version']
 +stack_version_unformatted = config['clusterLevelParams']['stack_version']
  stack_version_formatted = format_stack_version(stack_version_unformatted)
  
- # current host stack version
- current_version = default("/hostLevelParams/current_version", None)
+ # service name
+ service_name = config['serviceName']
+ 
+ # logsearch configuration
+ logsearch_logfeeder_conf = "/etc/ambari-logsearch-logfeeder/conf"
+ 
+ agent_cache_dir = config['hostLevelParams']['agentCacheDir']
+ service_package_folder = config['commandParams']['service_package_folder']
+ logsearch_service_name = service_name.lower().replace("_", "-")
+ logsearch_config_file_name = 'input.config-' + logsearch_service_name + ".json"
+ logsearch_config_file_path = agent_cache_dir + "/" + service_package_folder + "/templates/" + logsearch_config_file_name + ".j2"
+ logsearch_config_file_exists = os.path.isfile(logsearch_config_file_path)
  
  # default hadoop params
  mapreduce_libs_path = format("{stack_root}/current/hadoop-mapreduce-client/*")

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/after-INSTALL/scripts/shared_initialization.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-ANY/scripts/params.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-INSTALL/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-INSTALL/scripts/params.py
index f9a17d6,50c5a40..6d375db
--- a/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-INSTALL/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-INSTALL/scripts/params.py
@@@ -109,5 -109,7 +109,7 @@@ smoke_user_dirs = format("/tmp/hadoop-{
  if has_hbase_masters:
    hbase_user_dirs = format("/home/{hbase_user},/tmp/{hbase_user},/usr/bin/{hbase_user},/var/log/{hbase_user},{hbase_tmp_dir}")
  #repo params
 -repo_info = config['hostLevelParams']['repo_info']
 +repo_info = config['hostLevelParams']['repoInfo']
  service_repo_info = default("/hostLevelParams/service_repo_info",None)
+ 
+ repo_file = default("/repositoryFile", None)

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-START/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-START/scripts/params.py
index e2735d9,d70030d..136939e
--- a/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-START/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/3.0/hooks/before-START/scripts/params.py
@@@ -100,12 -100,20 +100,20 @@@ oozie_servers = default("/clusterHostIn
  hcat_server_hosts = default("/clusterHostInfo/webhcat_server_host", [])
  hive_server_host =  default("/clusterHostInfo/hive_server_host", [])
  hbase_master_hosts = default("/clusterHostInfo/hbase_master_hosts", [])
 -hs_host = default("/clusterHostInfo/hs_host", [])
 +hs_host = default("/clusterHostInfo/historyserver_hosts", [])
  jtnode_host = default("/clusterHostInfo/jtnode_host", [])
 -namenode_host = default("/clusterHostInfo/namenode_host", [])
 +namenode_host = default("/clusterHostInfo/namenode_hosts", [])
  zk_hosts = default("/clusterHostInfo/zookeeper_hosts", [])
  ganglia_server_hosts = default("/clusterHostInfo/ganglia_server_host", [])
- ams_collector_hosts = ",".join(default("/clusterHostInfo/metrics_collector_hosts", []))
+ 
+ cluster_name = config["clusterName"]
+ set_instanceId = "false"
+ if 'cluster-env' in config['configurations'] and \
+         'metrics_collector_external_hosts' in config['configurations']['cluster-env']:
+   ams_collector_hosts = config['configurations']['cluster-env']['metrics_collector_external_hosts']
+   set_instanceId = "true"
+ else:
+   ams_collector_hosts = ",".join(default("/clusterHostInfo/metrics_collector_hosts", []))
  
  has_namenode = not len(namenode_host) == 0
  has_resourcemanager = not len(rm_host) == 0

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/params.py
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/params.py
index 3a1fbe1,e0e78b9..35a39cd
--- a/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/params.py
@@@ -33,12 -33,15 +33,15 @@@ user_group = config['configurations']['
  user_to_gid_dict = collections.defaultdict(lambda:user_group)
  user_to_groups_dict = collections.defaultdict(lambda:[user_group])
  
 -jdk_name = default("/hostLevelParams/jdk_name", None)
 -java_home = config['hostLevelParams']['java_home']
 +jdk_name = default("/ambariLevelParams/jdk_name", None)
 +java_home = config['ambariLevelParams']['java_home']
  artifact_dir = format("{tmp_dir}/AMBARI-artifacts/")
 -jdk_location = config['hostLevelParams']['jdk_location']
 -java_version = expect("/hostLevelParams/java_version", int)
 +jdk_location = config['ambariLevelParams']['jdk_location']
 +java_version = expect("/ambariLevelParams/java_version", int)
  
+ ambari_java_home = default("/commandParams/ambari_java_home", None)
+ ambari_jdk_name = default("/commandParams/ambari_jdk_name", None)
+ 
  service_name = config["serviceName"]
  component_name = config["role"]
  sudo = AMBARI_SUDO_BINARY

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/templates/input.config-hdfs.json.j2
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/templates/input.config-hdfs.json.j2
index af89b90,af89b90..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/templates/input.config-hdfs.json.j2
+++ /dev/null
@@@ -1,216 -1,216 +1,0 @@@
--{#
-- # Licensed to the Apache Software Foundation (ASF) under one
-- # or more contributor license agreements.  See the NOTICE file
-- # distributed with this work for additional information
-- # regarding copyright ownership.  The ASF licenses this file
-- # to you under the Apache License, Version 2.0 (the
-- # "License"); you may not use this file except in compliance
-- # with the License.  You may obtain a copy of the License at
-- #
-- #   http://www.apache.org/licenses/LICENSE-2.0
-- #
-- # Unless required by applicable law or agreed to in writing, software
-- # distributed under the License is distributed on an "AS IS" BASIS,
-- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- # See the License for the specific language governing permissions and
-- # limitations under the License.
-- #}
--{
--  "input":[
--    {
--      "type":"hdfs_datanode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-datanode-*.log"
--    },
--    {
--      "type":"hdfs_namenode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-namenode-*.log"
--    },
--    {
--      "type":"hdfs_journalnode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-journalnode-*.log"
--    },
--    {
--      "type":"hdfs_secondarynamenode",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-secondarynamenode-*.log"
--    },
--    {
--      "type":"hdfs_zkfc",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-zkfc-*.log"
--    },
--    {
--      "type":"hdfs_nfs3",
--      "rowtype":"service",
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hadoop-{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}-nfs3-*.log"
--    },
--    {
--      "type":"hdfs_audit",
--      "rowtype":"audit",
--      "is_enabled":"true",
--      "add_fields":{
--        "logType":"FAKEHDFSAudit",
--        "enforcer":"hadoop-acl",
--        "repoType":"1",
--        "repo":"hdfs"
--      },
--      "path":"{{default('/configurations/hadoop-env/hdfs_log_dir_prefix', '/var/log/hadoop')}}/{{default('configurations/hadoop-env/hdfs_user', 'hdfs')}}/hdfs-audit.log"
--    }
--  ],
--  "filter":[
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_datanode",
--            "hdfs_journalnode",
--            "hdfs_secondarynamenode",
--            "hdfs_namenode",
--            "hdfs_zkfc",
--            "hdfs_nfs3"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:logtime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}%{SPACE}\\(%{JAVAFILE:file}:%{JAVAMETHOD:method}\\(%{INT:line_number}\\)\\)%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "logtime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    },
--    {
--      "filter":"grok",
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_audit"
--          ]
--        }
--      },
--      "log4j_format":"%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n",
--      "multiline_pattern":"^(%{TIMESTAMP_ISO8601:evtTime})",
--      "message_pattern":"(?m)^%{TIMESTAMP_ISO8601:evtTime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}:%{SPACE}%{GREEDYDATA:log_message}",
--      "post_map_values":{
--        "evtTime":{
--          "map_date":{
--            "target_date_pattern":"yyyy-MM-dd HH:mm:ss,SSS"
--          }
--        }
--      }
--    },
--    {
--      "filter":"keyvalue",
--      "sort_order":1,
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_audit"
--          ]
--        }
--      },
--      "source_field":"log_message",
--      "value_split":"=",
--      "field_split":"\t",
--      "post_map_values":{
--        "src":{
--          "map_fieldname":{
--            "new_fieldname":"resource"
--          }
--        },
--        "ip":{
--          "map_fieldname":{
--            "new_fieldname":"cliIP"
--          }
--        },
--        "allowed":[
--          {
--            "map_fieldvalue":{
--              "pre_value":"true",
--              "post_value":"1"
--            }
--          },
--          {
--            "map_fieldvalue":{
--              "pre_value":"false",
--              "post_value":"0"
--            }
--          },
--          {
--            "map_fieldname":{
--              "new_fieldname":"result"
--            }
--          }
--        ],
--        "cmd":{
--          "map_fieldname":{
--            "new_fieldname":"action"
--          }
--        },
--        "proto":{
--          "map_fieldname":{
--            "new_fieldname":"cliType"
--          }
--        },
--        "callerContext":{
--          "map_fieldname":{
--            "new_fieldname":"req_caller_id"
--          }
--        }
--      }
--    },
--    {
--      "filter":"grok",
--      "sort_order":2,
--      "source_field":"ugi",
--      "remove_source_field":"false",
--      "conditions":{
--        "fields":{
--          "type":[
--            "hdfs_audit"
--          ]
--        }
--      },
--      "message_pattern":"%{USERNAME:p_user}.+auth:%{USERNAME:p_authType}.+via %{USERNAME:k_user}.+auth:%{USERNAME:k_authType}|%{USERNAME:user}.+auth:%{USERNAME:authType}|%{USERNAME:x_user}",
--      "post_map_values":{
--        "user":{
--          "map_fieldname":{
--            "new_fieldname":"reqUser"
--          }
--        },
--        "x_user":{
--          "map_fieldname":{
--            "new_fieldname":"reqUser"
--          }
--        },
--        "p_user":{
--          "map_fieldname":{
--            "new_fieldname":"reqUser"
--          }
--        },
--        "k_user":{
--          "map_fieldname":{
--            "new_fieldname":"proxyUsers"
--          }
--        },
--        "p_authType":{
--          "map_fieldname":{
--            "new_fieldname":"authType"
--          }
--        },
--        "k_authType":{
--          "map_fieldname":{
--            "new_fieldname":"proxyAuthType"
--          }
--        }
--      }
--    }
--  ]
--}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/properties/krb5_conf.j2
----------------------------------------------------------------------
diff --cc ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/properties/krb5_conf.j2
index 612751b,612751b..0000000
deleted file mode 100644,100644
--- a/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/properties/krb5_conf.j2
+++ /dev/null
@@@ -1,60 -1,60 +1,0 @@@
--{#
--# Licensed to the Apache Software Foundation (ASF) under one
--# or more contributor license agreements.  See the NOTICE file
--# distributed with this work for additional information
--# regarding copyright ownership.  The ASF licenses this file
--# to you under the Apache License, Version 2.0 (the
--# "License"); you may not use this file except in compliance
--# with the License.  You may obtain a copy of the License at
--#
--#   http://www.apache.org/licenses/LICENSE-2.0
--#
--# Unless required by applicable law or agreed to in writing, software
--# distributed under the License is distributed on an "AS IS" BASIS,
--# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--# See the License for the specific language governing permissions and
--# limitations under the License.
--#}
--[libdefaults]
--  renew_lifetime = 7d
--  forwardable = true
--  default_realm = {{realm}}
--  ticket_lifetime = 24h
--  dns_lookup_realm = false
--  dns_lookup_kdc = false
--  default_ccache_name = /tmp/krb5cc_%{uid}
--  #default_tgs_enctypes = {{encryption_types}}
--  #default_tkt_enctypes = {{encryption_types}}
--{% if domains %}
--[domain_realm]
--{%- for domain in domains.split(',') %}
--  {{domain|trim()}} = {{realm}}
--{%- endfor %}
--{% endif %}
--[logging]
--  default = FILE:/var/log/krb5kdc.log
--  admin_server = FILE:/var/log/kadmind.log
--  kdc = FILE:/var/log/krb5kdc.log
--
--[realms]
--  {{realm}} = {
--{%- if master_kdc %}
--    master_kdc = {{master_kdc|trim()}}
--{%- endif -%}
--{%- if kdc_hosts > 0 -%}
--{%- set kdc_host_list = kdc_hosts.split(',')  -%}
--{%- if kdc_host_list and kdc_host_list|length > 0 %}
--    admin_server = {{admin_server_host|default(kdc_host_list[0]|trim(), True)}}
--{%- if kdc_host_list -%}
--{%- if master_kdc and (master_kdc not in kdc_host_list) %}
--    kdc = {{master_kdc|trim()}}
--{%- endif -%}
--{% for kdc_host in kdc_host_list %}
--    kdc = {{kdc_host|trim()}}
--{%- endfor -%}
--{% endif %}
--{%- endif %}
--{%- endif %}
--  }
--
--{# Append additional realm declarations below #}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionDBAccessorImpl.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionDBAccessorImpl.java
index c1056dd,94799cc..c449aae
--- a/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionDBAccessorImpl.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionDBAccessorImpl.java
@@@ -191,9 -191,9 +191,9 @@@ public class TestActionDBAccessorImpl 
    @Test
    public void testGetStagesInProgress() throws AmbariException {
      List<Stage> stages = new ArrayList<>();
 -    stages.add(createStubStage(hostName, requestId, stageId, false));
 -    stages.add(createStubStage(hostName, requestId, stageId + 1, false));
 +    stages.add(createStubStage(hostName, requestId, stageId));
 +    stages.add(createStubStage(hostName, requestId, stageId + 1));
-     Request request = new Request(stages, clusters);
+     Request request = new Request(stages, "", clusters);
      db.persistActions(request);
      assertEquals(2, stages.size());
    }
@@@ -705,11 -730,11 +707,11 @@@
    }
  
    private void populateActionDB(ActionDBAccessor db, String hostname,
 -      long requestId, long stageId, boolean retryAllowed) throws AmbariException {
 -    Stage s = createStubStage(hostname, requestId, stageId, retryAllowed);
 +      long requestId, long stageId) throws AmbariException {
 +    Stage s = createStubStage(hostname, requestId, stageId);
      List<Stage> stages = new ArrayList<>();
      stages.add(s);
-     Request request = new Request(stages, clusters);
+     Request request = new Request(stages, "", clusters);
      db.persistActions(request);
    }
  
@@@ -730,10 -755,10 +732,10 @@@
    private void populateActionDBWithCompletedRequest(ActionDBAccessor db, String hostname,
        long requestId, long stageId) throws AmbariException {
  
 -    Stage s = createStubStage(hostname, requestId, stageId, false);
 +    Stage s = createStubStage(hostname, requestId, stageId);
      List<Stage> stages = new ArrayList<>();
      stages.add(s);
-     Request request = new Request(stages, clusters);
+     Request request = new Request(stages, "", clusters);
  
      s.setHostRoleStatus(hostname, Role.HBASE_REGIONSERVER.name(), HostRoleStatus.COMPLETED);
      s.setHostRoleStatus(hostname, Role.HBASE_MASTER.name(), HostRoleStatus.COMPLETED);
@@@ -754,9 -779,9 +756,9 @@@
      db.persistActions(request);
    }
  
 -  private Stage createStubStage(String hostname, long requestId, long stageId, boolean retryAllowed) {
 +  private Stage createStubStage(String hostname, long requestId, long stageId) {
      Stage s = stageFactory.createNew(requestId, "/a/b", "cluster1", 1L, "action db accessor test",
-       "clusterHostInfo", "commandParamsStage", "hostParamsStage");
+       "commandParamsStage", "hostParamsStage");
      s.setStageId(stageId);
      s.addHostRoleExecutionCommand(hostname, Role.HBASE_MASTER,
          RoleCommand.START,

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java
index 3b485b0,38b77da..8bfa6fd
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java
@@@ -77,10 -78,10 +78,10 @@@ import org.apache.ambari.server.topolog
  import org.codehaus.jettison.json.JSONException;
  import org.codehaus.jettison.json.JSONObject;
  import org.easymock.EasyMock;
 -import org.eclipse.jetty.server.SessionManager;
 +import org.eclipse.jetty.server.session.SessionHandler;
  import org.junit.Test;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
  
  import com.google.gson.Gson;
  import com.google.gson.GsonBuilder;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
index b2546e0,b3c4e26..f55db08
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
@@@ -471,10 -476,10 +459,10 @@@ public class HeartbeatProcessorTest 
      hb.setResponseId(0);
      hb.setHostname(DummyHostname1);
      hb.setNodeStatus(new HostStatus(HostStatus.Status.HEALTHY, DummyHostStatus));
-     hb.setReports(new ArrayList<CommandReport>());
+     hb.setReports(new ArrayList<>());
      ArrayList<ComponentStatus> componentStatuses = new ArrayList<>();
      ComponentStatus componentStatus1 = new ComponentStatus();
 -    componentStatus1.setClusterName(DummyCluster);
 +    //componentStatus1.setClusterName(DummyCluster);
      componentStatus1.setServiceName(HDFS);
      componentStatus1.setMessage(DummyHostStatus);
      componentStatus1.setStatus(State.STARTED.name());
@@@ -840,10 -845,10 +823,10 @@@
      hb.setResponseId(1);
      hb.setHostname(DummyHostname1);
      hb.setNodeStatus(new HostStatus(HostStatus.Status.HEALTHY, DummyHostStatus));
-     hb.setReports(new ArrayList<CommandReport>());
+     hb.setReports(new ArrayList<>());
  
      componentStatus1 = new ComponentStatus();
 -    componentStatus1.setClusterName(DummyCluster);
 +    //componentStatus1.setClusterName(DummyCluster);
      componentStatus1.setServiceName(HDFS);
      componentStatus1.setMessage(DummyHostStatus);
      componentStatus1.setStatus(State.STARTED.name());

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/agent/TestActionQueue.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
index 5581c5b,20ff949..4b4da49
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
@@@ -1386,10 -1362,10 +1361,10 @@@ public class TestHeartbeatHandler 
  
  
    private ComponentStatus createComponentStatus(String clusterName, String serviceName, String message,
-                                                 State state, SecurityState securityState,
+                                                 State state,
                                                  String componentName, String stackVersion) {
      ComponentStatus componentStatus1 = new ComponentStatus();
 -    componentStatus1.setClusterName(clusterName);
 +    //componentStatus1.setClusterName(clusterName);
      componentStatus1.setServiceName(serviceName);
      componentStatus1.setMessage(message);
      componentStatus1.setStatus(state.name());

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
index 7b7d817,8fcb1b2..5193245
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
@@@ -121,12 -158,16 +158,16 @@@ public class HostsMasterMaintenanceChec
      Mockito.when(upgradePack.getName()).thenReturn(upgradePackName);
      upgradePacks.put(upgradePack.getName(), upgradePack);
      Mockito.when(ambariMetaInfo.getUpgradePacks(Mockito.anyString(), Mockito.anyString())).thenReturn(upgradePacks);
-     Mockito.when(upgradePack.getTasks()).thenReturn(new HashMap<String, Map<String,ProcessingComponent>>());
-     Mockito.when(cluster.getServices()).thenReturn(new HashMap<String, Service>());
-     Mockito.when(clusters.getHostsForCluster(Mockito.anyString())).thenReturn(new HashMap<String, Host>());
+     Mockito.when(upgradePack.getTasks()).thenReturn(new HashMap<>());
+     Mockito.when(cluster.getServices()).thenReturn(new HashMap<>());
+     Mockito.when(clusters.getHostsForCluster(Mockito.anyString())).thenReturn(new HashMap<>());
  
      check = new PrerequisiteCheck(null, null);
-     hostsMasterMaintenanceCheck.perform(check, new PrereqCheckRequest("cluster"));
+     checkRequest = new PrereqCheckRequest("cluster");
+     checkRequest.setSourceStackId(new StackId("HDP-1.0"));
+     checkRequest.setTargetRepositoryVersion(m_repositoryVersion);
+ 
+     hostsMasterMaintenanceCheck.perform(check, checkRequest);
      Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
    }
 -}
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java
index 996f349,7485257..55eeb4e
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java
@@@ -96,8 -94,13 +95,7 @@@ public class ServiceCheckValidityCheckT
          return clusters;
        }
      };
 -    serviceCheckValidityCheck.actionMetadataProvider = new Provider<ActionMetadata>() {
 -      @Override
 -      public ActionMetadata get() {
 -        return actionMetadata;
 -      }
 -    };
  
- 
      Cluster cluster = mock(Cluster.class);
      when(clusters.getCluster(CLUSTER_NAME)).thenReturn(cluster);
      when(cluster.getClusterId()).thenReturn(CLUSTER_ID);
@@@ -118,6 -122,35 +117,42 @@@
    }
  
    @Test
+   public void testWithNullCommandDetailAtCommand() throws AmbariException {
+     ServiceComponent serviceComponent = mock(ServiceComponent.class);
+     when(serviceComponent.isVersionAdvertised()).thenReturn(true);
+ 
+     when(service.getMaintenanceState()).thenReturn(MaintenanceState.OFF);
+     when(service.getServiceComponents()).thenReturn(ImmutableMap.of(SERVICE_COMPONENT_NAME, serviceComponent));
+ 
+     ServiceConfigEntity serviceConfigEntity = new ServiceConfigEntity();
+     serviceConfigEntity.setServiceName(SERVICE_NAME);
+     serviceConfigEntity.setCreateTimestamp(CONFIG_CREATE_TIMESTAMP);
+ 
 -    LastServiceCheckDTO lastServiceCheckDTO1 = new LastServiceCheckDTO(Role.ZOOKEEPER_QUORUM_SERVICE_CHECK.name(), SERVICE_CHECK_START_TIME);
 -    LastServiceCheckDTO lastServiceCheckDTO2 = new LastServiceCheckDTO(Role.HDFS_SERVICE_CHECK.name(), SERVICE_CHECK_START_TIME);
++    HostRoleCommandEntity hostRoleCommandEntity1 = new HostRoleCommandEntity();
++    hostRoleCommandEntity1.setRoleCommand(RoleCommand.SERVICE_CHECK);
++    hostRoleCommandEntity1.setCommandDetail(null);
++    hostRoleCommandEntity1.setStartTime(SERVICE_CHECK_START_TIME);
++    hostRoleCommandEntity1.setRole(Role.ZOOKEEPER_SERVER);
++
++    HostRoleCommandEntity hostRoleCommandEntity2 = new HostRoleCommandEntity();
++    hostRoleCommandEntity2.setRoleCommand(RoleCommand.SERVICE_CHECK);
++    hostRoleCommandEntity2.setCommandDetail(COMMAND_DETAIL);
++    hostRoleCommandEntity2.setStartTime(SERVICE_CHECK_START_TIME);
++    hostRoleCommandEntity2.setRole(Role.HDFS_SERVICE_CHECK);
+ 
+     when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_NAME))).thenReturn(serviceConfigEntity);
 -    when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(asList(lastServiceCheckDTO1, lastServiceCheckDTO2));
++    when(hostRoleCommandDAO.findAll(any(Request.class), any(Predicate.class))).thenReturn(asList(hostRoleCommandEntity1, hostRoleCommandEntity2));
+ 
+     PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
+     try {
+       serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
+     } catch (NullPointerException ex){
+       Assert.fail("serviceCheckValidityCheck failed due to null at start_time were not handled");
+     }
+     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+   }
+ 
+   @Test
    public void testFailWhenServiceWithOutdatedServiceCheckExists() throws AmbariException {
      ServiceComponent serviceComponent = mock(ServiceComponent.class);
      when(serviceComponent.isVersionAdvertised()).thenReturn(true);
@@@ -157,7 -186,7 +192,7 @@@
      serviceConfigEntity.setCreateTimestamp(CONFIG_CREATE_TIMESTAMP);
  
      when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_NAME))).thenReturn(serviceConfigEntity);
-     when(hostRoleCommandDAO.findAll(any(Request.class), any(Predicate.class))).thenReturn(Collections.<HostRoleCommandEntity>emptyList());
 -    when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(Collections.<LastServiceCheckDTO>emptyList());
++    when(hostRoleCommandDAO.findAll(any(Request.class), any(Predicate.class))).thenReturn(Collections.emptyList());
  
      PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
      serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
@@@ -176,23 -205,49 +211,23 @@@
      serviceConfigEntity.setServiceName(SERVICE_NAME);
      serviceConfigEntity.setCreateTimestamp(CONFIG_CREATE_TIMESTAMP);
  
 -    LastServiceCheckDTO lastServiceCheckDTO1 = new LastServiceCheckDTO(Role.HDFS_SERVICE_CHECK.name(), SERVICE_CHECK_START_TIME);
 -    LastServiceCheckDTO lastServiceCheckDTO2 = new LastServiceCheckDTO(Role.HDFS_SERVICE_CHECK.name(), CONFIG_CREATE_TIMESTAMP - 1L);
 +    HostRoleCommandEntity hostRoleCommandEntity1 = new HostRoleCommandEntity();
 +    hostRoleCommandEntity1.setRoleCommand(RoleCommand.SERVICE_CHECK);
 +    hostRoleCommandEntity1.setCommandDetail(COMMAND_DETAIL);
 +    hostRoleCommandEntity1.setStartTime(SERVICE_CHECK_START_TIME);
 +    hostRoleCommandEntity1.setRole(Role.HDFS_SERVICE_CHECK);
 +
 +    HostRoleCommandEntity hostRoleCommandEntity2 = new HostRoleCommandEntity();
 +    hostRoleCommandEntity2.setRoleCommand(RoleCommand.SERVICE_CHECK);
 +    hostRoleCommandEntity2.setCommandDetail(COMMAND_DETAIL);
 +    hostRoleCommandEntity2.setStartTime(CONFIG_CREATE_TIMESTAMP - 1L);
 +    hostRoleCommandEntity2.setRole(Role.HDFS_SERVICE_CHECK);
  
      when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_NAME))).thenReturn(serviceConfigEntity);
-     when(hostRoleCommandDAO.findAll(any(Request.class), any(Predicate.class))).thenReturn(Arrays.asList(hostRoleCommandEntity1, hostRoleCommandEntity2));
 -    when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(asList(lastServiceCheckDTO1, lastServiceCheckDTO2));
++    when(hostRoleCommandDAO.findAll(any(Request.class), any(Predicate.class))).thenReturn(asList(hostRoleCommandEntity1, hostRoleCommandEntity2));
  
      PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
      serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
      Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
    }
 -
 -  /**
 -   * Tests that old, oudated service checks for the FOO2 service doesn't cause
 -   * problems when checking values for the FOO service.
 -   * <p/>
 -   * The specific test case here is that the FOO2 service was added a long time
 -   * ago and then removed. We don't want old service checks for FOO2 to match
 -   * when querying for FOO.
 -   *
 -   * @throws AmbariException
 -   */
 -  @Test
 -  public void testPassWhenSimilarlyNamedServiceIsOutdated() throws AmbariException {
 -    ServiceComponent serviceComponent = mock(ServiceComponent.class);
 -    when(serviceComponent.isVersionAdvertised()).thenReturn(true);
 -
 -    when(service.getMaintenanceState()).thenReturn(MaintenanceState.OFF);
 -    when(service.getServiceComponents()).thenReturn(ImmutableMap.of(SERVICE_COMPONENT_NAME, serviceComponent));
 -
 -    ServiceConfigEntity serviceConfigEntity = new ServiceConfigEntity();
 -    serviceConfigEntity.setServiceName(SERVICE_NAME);
 -    serviceConfigEntity.setCreateTimestamp(CONFIG_CREATE_TIMESTAMP);
 -
 -    String hdfsRole = Role.HDFS_SERVICE_CHECK.name();
 -    String hdfs2Role = hdfsRole.replace("HDFS", "HDFS2");
 -
 -    LastServiceCheckDTO lastServiceCheckDTO1 = new LastServiceCheckDTO(hdfsRole, SERVICE_CHECK_START_TIME);
 -    LastServiceCheckDTO lastServiceCheckDTO2 = new LastServiceCheckDTO(hdfs2Role, CONFIG_CREATE_TIMESTAMP - 1L);
 -
 -    when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_NAME))).thenReturn(serviceConfigEntity);
 -    when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(asList(lastServiceCheckDTO1, lastServiceCheckDTO2));
 -
 -    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
 -    serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
 -    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());  }
--}
++}

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/configuration/RecoveryConfigHelperTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/configuration/RecoveryConfigHelperTest.java
index a35957a,7b8bd8b..1b37435
--- a/ambari-server/src/test/java/org/apache/ambari/server/configuration/RecoveryConfigHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/configuration/RecoveryConfigHelperTest.java
@@@ -36,10 -36,11 +36,13 @@@ import org.apache.ambari.server.H2Datab
  import org.apache.ambari.server.agent.HeartbeatTestHelper;
  import org.apache.ambari.server.agent.RecoveryConfig;
  import org.apache.ambari.server.agent.RecoveryConfigHelper;
 +import org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
 +import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
  import org.apache.ambari.server.orm.GuiceJpaInitializer;
  import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+ import org.apache.ambari.server.orm.OrmTestHelper;
+ import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
  import org.apache.ambari.server.state.Cluster;
  import org.apache.ambari.server.state.Config;
  import org.apache.ambari.server.state.MaintenanceState;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 554e089,b370829..9309abe
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@@ -7310,7 -6977,7 +6977,7 @@@ public class AmbariManagementController
      Assert.assertEquals(1, responsesWithParams.size());
      StackVersionResponse resp = responsesWithParams.iterator().next();
      assertNotNull(resp.getUpgradePacks());
-     assertEquals(13, resp.getUpgradePacks().size());
 -    assertTrue(resp.getUpgradePacks().size() > 0);
++    assertEquals(15, resp.getUpgradePacks().size());
      assertTrue(resp.getUpgradePacks().contains("upgrade_test"));
    }
  
@@@ -10159,6 -9327,80 +9327,79 @@@
    }
  
    @Test
+   public void testRestartIndicatorsAndSlaveFilesUpdateAtComponentsDelete() throws Exception {
+     String cluster1 = getUniqueName();
+     createCluster(cluster1);
+     Cluster cluster = clusters.getCluster(cluster1);
+     StackId stackId = new StackId("HDP-2.0.7");
+     cluster.setDesiredStackVersion(stackId);
+     cluster.setCurrentStackVersion(stackId);
+ 
+     String hdfsService = "HDFS";
+     String zookeeperService = "ZOOKEEPER";
+     createService(cluster1, hdfsService, null);
+     createService(cluster1, zookeeperService, null);
+ 
+     String namenode = "NAMENODE";
+     String datanode = "DATANODE";
+     String zookeeperServer = "ZOOKEEPER_SERVER";
+     String zookeeperClient = "ZOOKEEPER_CLIENT";
+ 
+     createServiceComponent(cluster1, hdfsService, namenode,
+         State.INIT);
+     createServiceComponent(cluster1, hdfsService, datanode,
+         State.INIT);
+     createServiceComponent(cluster1, zookeeperService, zookeeperServer,
+         State.INIT);
+     createServiceComponent(cluster1, zookeeperService, zookeeperClient,
+         State.INIT);
+ 
+     String host1 = getUniqueName();
+     String host2 = getUniqueName();
+ 
+     addHostToCluster(host1, cluster1);
+     createServiceComponentHost(cluster1, hdfsService, namenode, host1, null);
+     createServiceComponentHost(cluster1, hdfsService, datanode, host1, null);
+     createServiceComponentHost(cluster1, zookeeperService, zookeeperServer, host1,
+         null);
+     createServiceComponentHost(cluster1, zookeeperService, zookeeperClient, host1,
+         null);
+ 
+     ServiceComponentHost nameNodeSch = null;
+     for (ServiceComponentHost sch : cluster.getServiceComponentHosts(host1)) {
+       if (sch.getServiceComponentName().equals(namenode)) {
+         nameNodeSch = sch;
+       }
+     }
+ 
+     assertFalse(nameNodeSch.isRestartRequired());
+ 
+     addHostToCluster(host2, cluster1);
+ 
+     createServiceComponentHost(cluster1, hdfsService, datanode, host2, null);
+     assertFalse(nameNodeSch.isRestartRequired());  //No restart required if adding host
+ 
+     deleteServiceComponentHost(cluster1, hdfsService, datanode, host2, null);
+     deleteHost(host2);
+ 
+     assertFalse(nameNodeSch.isRestartRequired());   //NameNode doesn't need to be restarted!
+ 
+     List<Long> requestIDs = actionDB.getRequestsByStatus(null, 1, false);
+     Request request = actionDB.getRequest(requestIDs.get(0));
+     assertEquals("Update Include/Exclude Files for [HDFS]", request.getRequestContext());
 -    assertEquals(false, request.isExclusive());
+     Type type = new TypeToken<Map<String, String>>(){}.getType();
+     Map<String, String> requestParams = StageUtils.getGson().fromJson(request.getInputs(), type);
+     assertEquals(2, requestParams.size());
+     assertEquals("true", requestParams.get("is_add_or_delete_slave_request"));
+     assertEquals("true", requestParams.get("update_files_only"));
+     assertEquals(1, request.getResourceFilters().size());
+     RequestResourceFilter resourceFilter = request.getResourceFilters().get(0);
+     assertEquals(resourceFilter.getServiceName(), hdfsService);
+     assertEquals(resourceFilter.getComponentName(), namenode);
+     assertEquals(resourceFilter.getHostNames(), new ArrayList<String>());
+   }
+ 
+   @Test
    public void testMaintenanceState() throws Exception {
      String cluster1 = getUniqueName();
      createCluster(cluster1);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariServerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariSessionManagerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessorTest.java
----------------------------------------------------------------------
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessorTest.java
index 5c1836a,68d6349..734dd7e
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessorTest.java
@@@ -4939,12 -5014,11 +5013,12 @@@ public class BlueprintConfigurationProc
      atlasProperties.put("atlas.audit.hbase.zookeeper.quorum", "localhost");
  
  
-     Configuration clusterConfig = new Configuration(properties, Collections.<String, Map<String, Map<String, String>>>emptyMap());
+     Configuration clusterConfig = new Configuration(properties, Collections.emptyMap());
  
 -    Collection<String> hg1Components = new HashSet<>();
 -    hg1Components.add("KAFKA_BROKER");
 -    hg1Components.add("HBASE_MASTER");
 +    Collection<String> hgComponents = new HashSet<>();
 +    hgComponents.add("KAFKA_BROKER");
 +    hgComponents.add("ZOOKEEPER_SERVER");
 +    hgComponents.add("HBASE_MASTER");
      List<String> hosts = new ArrayList<>();
      hosts.add(host1);
      hosts.add(host2);


[20/50] [abbrv] ambari git commit: AMBARI-22014. Patch upgrade is going into incorrect state during package installation with invalid VDF (ncole)

Posted by ao...@apache.org.
AMBARI-22014. Patch upgrade is going into incorrect state during package installation with invalid VDF (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4c49b4bd
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4c49b4bd
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4c49b4bd

Branch: refs/heads/branch-3.0-perf
Commit: 4c49b4bd006cdd3929f5e341552b200af608bc32
Parents: b653ee0
Author: Nate Cole <nc...@hortonworks.com>
Authored: Mon Sep 25 15:23:42 2017 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Mon Sep 25 16:14:35 2017 -0400

----------------------------------------------------------------------
 .../server/controller/ControllerModule.java     |   2 +
 .../controller/ResourceProviderFactory.java     |   6 +-
 .../AbstractControllerResourceProvider.java     |   2 +-
 .../ClusterStackVersionResourceProvider.java    |   9 +-
 .../internal/DefaultProviderModule.java         |   2 -
 ...ClusterStackVersionResourceProviderTest.java | 223 ++++++-------------
 6 files changed, 87 insertions(+), 157 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/4c49b4bd/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
index e151e63..968e9b6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
@@ -62,6 +62,7 @@ import org.apache.ambari.server.cleanup.ClasspathScannerUtils;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.configuration.Configuration.ConnectionPoolType;
 import org.apache.ambari.server.configuration.Configuration.DatabaseType;
+import org.apache.ambari.server.controller.internal.ClusterStackVersionResourceProvider;
 import org.apache.ambari.server.controller.internal.ComponentResourceProvider;
 import org.apache.ambari.server.controller.internal.CredentialResourceProvider;
 import org.apache.ambari.server.controller.internal.HostComponentResourceProvider;
@@ -467,6 +468,7 @@ public class ControllerModule extends AbstractModule {
         .implement(ResourceProvider.class, Names.named("credential"), CredentialResourceProvider.class)
         .implement(ResourceProvider.class, Names.named("kerberosDescriptor"), KerberosDescriptorResourceProvider.class)
         .implement(ResourceProvider.class, Names.named("upgrade"), UpgradeResourceProvider.class)
+        .implement(ResourceProvider.class, Names.named("clusterStackVersion"), ClusterStackVersionResourceProvider.class)
         .build(ResourceProviderFactory.class));
 
     install(new FactoryModuleBuilder().implement(

http://git-wip-us.apache.org/repos/asf/ambari/blob/4c49b4bd/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
index 3912138..9cd1d74 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
@@ -22,6 +22,7 @@ package org.apache.ambari.server.controller;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ambari.server.controller.internal.ClusterStackVersionResourceProvider;
 import org.apache.ambari.server.controller.internal.UpgradeResourceProvider;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
@@ -68,4 +69,7 @@ public interface ResourceProviderFactory {
   @Named("upgrade")
   UpgradeResourceProvider getUpgradeResourceProvider(AmbariManagementController managementController);
 
-}
+  @Named("clusterStackVersion")
+  ClusterStackVersionResourceProvider getClusterStackVersionResourceProvider(AmbariManagementController managementController);
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/4c49b4bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
index b35b2a8..b4b13eb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
@@ -183,7 +183,7 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori
       case StackVersion:
         return new StackVersionResourceProvider(propertyIds, keyPropertyIds, managementController);
       case ClusterStackVersion:
-        return new ClusterStackVersionResourceProvider(managementController);
+        return resourceProviderFactory.getClusterStackVersionResourceProvider(managementController);
       case HostStackVersion:
         return new HostStackVersionResourceProvider(managementController);
       case StackService:

http://git-wip-us.apache.org/repos/asf/ambari/blob/4c49b4bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
index f8a679a..ba5a4e7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
@@ -213,6 +213,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
   /**
    * Constructor.
    */
+  @Inject
   public ClusterStackVersionResourceProvider(
           AmbariManagementController managementController) {
     super(propertyIds, keyPropertyIds, managementController);
@@ -454,7 +455,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
     }
   }
 
-  @Transactional
+  @Transactional(rollbackOn = {RuntimeException.class, SystemException.class, AmbariException.class})
   RequestStatus createOrUpdateHostVersions(Cluster cluster,
       RepositoryVersionEntity repoVersionEntity, VersionDefinitionXml versionDefinitionXml,
       StackId stackId, boolean forceInstalled, Map<String, Object> propertyMap)
@@ -666,11 +667,13 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
     }
   }
 
-  private ActionExecutionContext getHostVersionInstallCommand(RepositoryVersionEntity repoVersion,
+  @Transactional
+  ActionExecutionContext getHostVersionInstallCommand(RepositoryVersionEntity repoVersion,
       Cluster cluster, AmbariManagementController managementController, AmbariMetaInfo ami,
       final StackId stackId, Set<String> repoServices, Stage stage1, Host host)
           throws SystemException {
 
+
     // Determine repositories for host
     String osFamily = host.getOsFamily();
 
@@ -684,7 +687,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
 
     if (null == osEntity || CollectionUtils.isEmpty(osEntity.getRepositories())) {
       throw new SystemException(String.format("Repositories for os type %s are " +
-          "not defined. Repo version=%s, stackId=%s",
+          "not defined for version %s of Stack %s.",
             osFamily, repoVersion.getVersion(), stackId));
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/4c49b4bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
index 074f8e1..5e5bff5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
@@ -106,8 +106,6 @@ public class DefaultProviderModule extends AbstractProviderModule {
         return new UpgradeItemResourceProvider(managementController);
       case UpgradeSummary:
         return new UpgradeSummaryResourceProvider(managementController);
-      case ClusterStackVersion:
-        return new ClusterStackVersionResourceProvider(managementController);
       case PreUpgradeCheck:
         return new PreUpgradeCheckResourceProvider(managementController);
       case HostStackVersion:

http://git-wip-us.apache.org/repos/asf/ambari/blob/4c49b4bd/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
index c766f1e..a1415703 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
@@ -31,7 +31,6 @@ import static org.easymock.EasyMock.verify;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.lang.reflect.Field;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -68,6 +67,7 @@ import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
@@ -117,6 +117,7 @@ import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
@@ -124,7 +125,6 @@ import com.google.gson.JsonParser;
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.google.inject.Provider;
 import com.google.inject.util.Modules;
 
 import junit.framework.AssertionFailedError;
@@ -146,6 +146,10 @@ public class ClusterStackVersionResourceProviderTest {
   private HostVersionDAO hostVersionDAO;
   private HostComponentStateDAO hostComponentStateDAO;
 
+  private Clusters clusters;
+  private ActionManager actionManager;
+  private AmbariManagementController managementController;
+
   public static final String OS_JSON = "[\n" +
           "   {\n" +
           "      \"repositories\":[\n" +
@@ -179,6 +183,10 @@ public class ClusterStackVersionResourceProviderTest {
     configuration = new Configuration(properties);
     stageFactory = createNiceMock(StageFactory.class);
 
+    clusters = createNiceMock(Clusters.class);
+    actionManager = createNiceMock(ActionManager.class);
+    managementController = createMock(AmbariManagementController.class);
+
     // Initialize injector
     injector = Guice.createInjector(Modules.override(inMemoryModule).with(new MockModule()));
     injector.getInstance(GuiceJpaInitializer.class);
@@ -208,10 +216,6 @@ public class ClusterStackVersionResourceProviderTest {
   }
 
   private void testCreateResources(Authentication authentication) throws Exception {
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
     Map<String, String> hostLevelParams = new HashMap<>();
     StackId stackId = new StackId("HDP", "2.0.1");
@@ -258,28 +262,15 @@ public class ClusterStackVersionResourceProviderTest {
     expect(schAMS.getServiceName()).andReturn("AMBARI_METRICS").anyTimes();
     expect(schAMS.getServiceComponentName()).andReturn("METRICS_COLLECTOR").anyTimes();
     // First host contains versionable components
-    final List<ServiceComponentHost> schsH1 = new ArrayList<ServiceComponentHost>(){{
-      add(schDatanode);
-      add(schNamenode);
-      add(schAMS);
-    }};
+    final List<ServiceComponentHost> schsH1 = Lists.newArrayList(schDatanode, schNamenode, schAMS);
     // Second host does not contain versionable components
-    final List<ServiceComponentHost> schsH2 = new ArrayList<ServiceComponentHost>(){{
-      add(schAMS);
-    }};
-
+    final List<ServiceComponentHost> schsH2 = Lists.newArrayList(schAMS);
 
     ServiceOsSpecific.Package hdfsPackage = new ServiceOsSpecific.Package();
     hdfsPackage.setName("hdfs");
     List<ServiceOsSpecific.Package> packages = Collections.singletonList(hdfsPackage);
 
-    ActionManager actionManager = createNiceMock(ActionManager.class);
-
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
-    ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
-    ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class);
-
-    AbstractControllerResourceProvider.init(resourceProviderFactory);
 
     Map<String, Map<String, String>> hostConfigTags = new HashMap<>();
     expect(configHelper.getEffectiveDesiredTags(anyObject(ClusterImpl.class), anyObject(String.class))).andReturn(hostConfigTags);
@@ -290,12 +281,10 @@ public class ClusterStackVersionResourceProviderTest {
     expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
     expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
-            EasyMock.anyObject(), anyObject(String.class))).
-            andReturn(packages).times((hostCount - 1) * 2); // 1 host has no versionable components, other hosts have 2 services
-//            // that's why we don't send commands to it
-
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
-            eq(managementController))).andReturn(csvResourceProvider).anyTimes();
+            EasyMock.<Map<String, String>>anyObject(), anyObject(String.class))).
+            andReturn(packages).anyTimes();
+    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
+      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
     expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
@@ -357,18 +346,14 @@ public class ClusterStackVersionResourceProviderTest {
     StageUtils.setTopologyManager(injector.getInstance(TopologyManager.class));
     StageUtils.setConfiguration(injector.getInstance(Configuration.class));
 
+    ResourceProvider provider = createProvider(managementController);
+    injector.injectMembers(provider);
+
     // replay
-    replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider,
+    replay(managementController, response, clusters,
             cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager,
             executionCommand, executionCommandWrapper,stage, stageFactory);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController);
-
-    injector.injectMembers(provider);
 
     // add the property map to a set for the request.  add more maps for multiple creates
     Set<Map<String, Object>> propertySet = new LinkedHashSet<>();
@@ -618,10 +603,6 @@ public class ClusterStackVersionResourceProviderTest {
    }
 
    private void testCreateResourcesWithRepoDefinition(Authentication authentication) throws Exception {
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
     StackId stackId = new StackId("HDP", "2.0.1");
 
@@ -706,7 +687,7 @@ public class ClusterStackVersionResourceProviderTest {
 
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
     ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
-    ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class);
+    ResourceProvider csvResourceProvider = createNiceMock(ResourceProvider.class);
 
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
@@ -725,6 +706,10 @@ public class ClusterStackVersionResourceProviderTest {
     expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
             eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
+    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
+      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
+
+
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
     expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
         hostsForCluster).anyTimes();
@@ -796,12 +781,7 @@ public class ClusterStackVersionResourceProviderTest {
             cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schHBM, actionManager,
             executionCommandWrapper,stage, stageFactory);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController);
-
+    ResourceProvider provider = createProvider(managementController);
     injector.injectMembers(provider);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -859,10 +839,6 @@ public class ClusterStackVersionResourceProviderTest {
 
     String os_json = json.toString();
 
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
     StackId stackId = new StackId("HDP", "2.0.1");
 
@@ -946,10 +922,7 @@ public class ClusterStackVersionResourceProviderTest {
     ActionManager actionManager = createNiceMock(ActionManager.class);
 
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
-    ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
-    ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class);
-
-    AbstractControllerResourceProvider.init(resourceProviderFactory);
+    ResourceProvider csvResourceProvider = createNiceMock(ResourceProvider.class);
 
     Map<String, Map<String, String>> hostConfigTags = new HashMap<>();
     expect(configHelper.getEffectiveDesiredTags(anyObject(ClusterImpl.class), anyObject(String.class))).andReturn(hostConfigTags);
@@ -963,8 +936,8 @@ public class ClusterStackVersionResourceProviderTest {
             EasyMock.anyObject(), anyObject(String.class))).
             andReturn(packages).anyTimes(); // only one host has the versionable component
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
-            eq(managementController))).andReturn(csvResourceProvider).anyTimes();
+    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
+    .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
     expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
@@ -992,11 +965,9 @@ public class ClusterStackVersionResourceProviderTest {
     expect(cluster.transitionHostsToInstalling(anyObject(RepositoryVersionEntity.class),
         anyObject(VersionDefinitionXml.class), eq(false))).andReturn(hostsNeedingInstallCommands).atLeastOnce();
 
-//    ExecutionCommand executionCommand = createNiceMock(ExecutionCommand.class);
     ExecutionCommand executionCommand = new ExecutionCommand();
     ExecutionCommandWrapper executionCommandWrapper = createNiceMock(ExecutionCommandWrapper.class);
 
-//    expect(executionCommand.getHostLevelParams()).andReturn(new HashMap<String, String>()).atLeastOnce();
     expect(executionCommandWrapper.getExecutionCommand()).andReturn(executionCommand).anyTimes();
 
     Stage stage = createNiceMock(Stage.class);
@@ -1031,16 +1002,11 @@ public class ClusterStackVersionResourceProviderTest {
     StageUtils.setConfiguration(injector.getInstance(Configuration.class));
 
     // replay
-    replay(managementController, response, clusters, hdfsService, hbaseService, resourceProviderFactory, csvResourceProvider,
+    replay(managementController, response, clusters, hdfsService, hbaseService, csvResourceProvider,
             cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schHBM, actionManager,
             executionCommandWrapper,stage, stageFactory);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController);
-
+    ResourceProvider provider = createProvider(managementController);
     injector.injectMembers(provider);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -1096,10 +1062,6 @@ public class ClusterStackVersionResourceProviderTest {
    }
 
    private void testCreateResourcesMixed(Authentication authentication) throws Exception {
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
     Map<String, String> hostLevelParams = new HashMap<>();
     StackId stackId = new StackId("HDP", "2.0.1");
@@ -1164,16 +1126,9 @@ public class ClusterStackVersionResourceProviderTest {
     expect(schAMS.getServiceName()).andReturn("AMBARI_METRICS").anyTimes();
     expect(schAMS.getServiceComponentName()).andReturn("METRICS_COLLECTOR").anyTimes();
     // First host contains versionable components
-    final List<ServiceComponentHost> schsH1 = new ArrayList<ServiceComponentHost>(){{
-      add(schDatanode);
-      add(schNamenode);
-      add(schAMS);
-    }};
+    final List<ServiceComponentHost> schsH1 = Lists.newArrayList(schDatanode, schNamenode, schAMS);
     // Second host does not contain versionable components
-    final List<ServiceComponentHost> schsH2 = new ArrayList<ServiceComponentHost>(){{
-      add(schAMS);
-    }};
-
+    final List<ServiceComponentHost> schsH2 = Lists.newArrayList(schAMS);
 
     ServiceOsSpecific.Package hdfsPackage = new ServiceOsSpecific.Package();
     hdfsPackage.setName("hdfs");
@@ -1182,10 +1137,6 @@ public class ClusterStackVersionResourceProviderTest {
     ActionManager actionManager = createNiceMock(ActionManager.class);
 
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
-    ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
-    ResourceProvider csvResourceProvider = createNiceMock(ClusterStackVersionResourceProvider.class);
-
-    AbstractControllerResourceProvider.init(resourceProviderFactory);
 
     Map<String, Map<String, String>> hostConfigTags = new HashMap<>();
     expect(configHelper.getEffectiveDesiredTags(anyObject(ClusterImpl.class), anyObject(String.class))).andReturn(hostConfigTags);
@@ -1196,12 +1147,11 @@ public class ClusterStackVersionResourceProviderTest {
     expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
     expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
-            EasyMock.anyObject(), anyObject(String.class))).
-            andReturn(packages).times((hostCount - 1) * 2); // 1 host has no versionable components, other hosts have 2 services
-//            // that's why we don't send commands to it
+            EasyMock.<Map<String, String>>anyObject(), anyObject(String.class))).
+            andReturn(packages).anyTimes();
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
-            eq(managementController))).andReturn(csvResourceProvider).anyTimes();
+    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
+      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
     expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
@@ -1267,16 +1217,11 @@ public class ClusterStackVersionResourceProviderTest {
 
 
     // replay
-    replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider,
+    replay(managementController, response, clusters,
             cluster, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager,
             executionCommand, executionCommandWrapper,stage, stageFactory);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController);
-
+    ResourceProvider provider = createProvider(managementController);
     injector.injectMembers(provider);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -1329,10 +1274,6 @@ public class ClusterStackVersionResourceProviderTest {
    */
   @Test
   public void testCreateResourcesInInstalledState() throws Exception {
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
     StackId stackId = new StackId("HDP", "2.2.0");
     String repoVersion = "2.2.0.1-885";
@@ -1408,8 +1349,7 @@ public class ClusterStackVersionResourceProviderTest {
 
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
     ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
-    ResourceProvider csvResourceProvider = createNiceMock(
-        ClusterStackVersionResourceProvider.class);
+    ResourceProvider csvResourceProvider = createNiceMock(ResourceProvider.class);
 
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
@@ -1454,10 +1394,7 @@ public class ClusterStackVersionResourceProviderTest {
         csvResourceProvider, cluster, repositoryVersionDAOMock, configHelper, schDatanode,
         stageFactory, hostVersionDAO);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type,
-        PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
-        managementController);
-
+    ResourceProvider provider = createProvider(managementController);
     injector.injectMembers(provider);
 
     // add the property map to a set for the request. add more maps for multiple
@@ -1501,10 +1438,6 @@ public class ClusterStackVersionResourceProviderTest {
 
   @Test
   public void testCreateResourcesPPC() throws Exception {
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
     Map<String, String> hostLevelParams = new HashMap<>();
     StackId stackId = new StackId("HDP", "2.0.1");
@@ -1567,16 +1500,9 @@ public class ClusterStackVersionResourceProviderTest {
     expect(schAMS.getServiceName()).andReturn("AMBARI_METRICS").anyTimes();
     expect(schAMS.getServiceComponentName()).andReturn("METRICS_COLLECTOR").anyTimes();
     // First host contains versionable components
-    final List<ServiceComponentHost> schsH1 = new ArrayList<ServiceComponentHost>(){{
-      add(schDatanode);
-      add(schNamenode);
-      add(schAMS);
-    }};
+    final List<ServiceComponentHost> schsH1 = Lists.newArrayList(schDatanode, schNamenode, schAMS);
     // Second host does not contain versionable components
-    final List<ServiceComponentHost> schsH2 = new ArrayList<ServiceComponentHost>(){{
-      add(schAMS);
-    }};
-
+    final List<ServiceComponentHost> schsH2 = Lists.newArrayList(schAMS);
 
     ServiceOsSpecific.Package hdfsPackage = new ServiceOsSpecific.Package();
     hdfsPackage.setName("hdfs");
@@ -1600,8 +1526,11 @@ public class ClusterStackVersionResourceProviderTest {
     expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
             (Map<String, String>) anyObject(List.class), anyObject(String.class))).
-            andReturn(packages).anyTimes(); // 1 host has no versionable components, other hosts have 2 services
-  //            // that's why we don't send commands to it
+            andReturn(packages).anyTimes();
+
+    expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
+      .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
+
 
     expect(resourceProviderFactory.getHostResourceProvider(anyObject(Set.class), anyObject(Map.class),
             eq(managementController))).andReturn(csvResourceProvider).anyTimes();
@@ -1672,12 +1601,7 @@ public class ClusterStackVersionResourceProviderTest {
             cluster, repoVersion, repositoryVersionDAOMock, configHelper, schDatanode, schNamenode, schAMS, actionManager,
             executionCommand, executionCommandWrapper,stage, stageFactory);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController);
-
+    ResourceProvider provider = createProvider(managementController);
     injector.injectMembers(provider);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -1711,10 +1635,6 @@ public class ClusterStackVersionResourceProviderTest {
 
   @Test
   public void testGetSorted() throws Exception {
-
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    final Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
     StackId stackId = new StackId("HDP", "2.2.0");
 
@@ -1766,19 +1686,17 @@ public class ClusterStackVersionResourceProviderTest {
         csvResourceProvider, cluster, repositoryVersionDAOMock, configHelper,
         stageFactory, hostVersionDAO);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type,
-        PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
-        /*managementController*/null);
+    ResourceProvider provider = createProvider(managementController);
     injector.injectMembers(provider);
 
-    Field field = ClusterStackVersionResourceProvider.class.getDeclaredField("clusters");
-    field.setAccessible(true);
-    field.set(null, new Provider<Clusters>() {
-      @Override
-      public Clusters get() {
-        return clusters;
-      }
-    });
+//    Field field = ClusterStackVersionResourceProvider.class.getDeclaredField("clusters");
+//    field.setAccessible(true);
+//    field.set(null, new Provider<Clusters>() {
+//      @Override
+//      public Clusters get() {
+//        return clusters;
+//      }
+//    });
 
     // set the security auth
     SecurityContextHolder.getContext().setAuthentication(
@@ -1913,10 +1831,6 @@ public class ClusterStackVersionResourceProviderTest {
    }
 
    private void testCreateResourcesExistingUpgrade(Authentication authentication) throws Exception {
-    Resource.Type type = Resource.Type.ClusterStackVersion;
-
-    AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
 
     expect(managementController.getClusters()).andReturn(clusters).anyTimes();
@@ -1934,12 +1848,7 @@ public class ClusterStackVersionResourceProviderTest {
     // replay
     replay(managementController, clusters, cluster);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController);
-
+    ResourceProvider provider = createProvider(managementController);
     injector.injectMembers(provider);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -1971,6 +1880,17 @@ public class ClusterStackVersionResourceProviderTest {
     verify(cluster);
 
   }
+
+   private ClusterStackVersionResourceProvider createProvider(AmbariManagementController amc) {
+     ResourceProviderFactory factory = injector.getInstance(ResourceProviderFactory.class);
+     AbstractControllerResourceProvider.init(factory);
+
+     Resource.Type type = Type.ClusterStackVersion;
+     return (ClusterStackVersionResourceProvider) AbstractControllerResourceProvider.getResourceProvider(type,
+         PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
+         amc);
+   }
+
   private class MockModule extends AbstractModule {
     @Override
     protected void configure() {
@@ -1980,6 +1900,9 @@ public class ClusterStackVersionResourceProviderTest {
       bind(StageFactory.class).toInstance(stageFactory);
       bind(HostVersionDAO.class).toInstance(hostVersionDAO);
       bind(HostComponentStateDAO.class).toInstance(hostComponentStateDAO);
+      bind(Clusters.class).toInstance(clusters);
+      bind(ActionManager.class).toInstance(actionManager);
+      bind(AmbariManagementController.class).toInstance(managementController);
     }
   }
 


[11/50] [abbrv] ambari git commit: AMBARI-21996 Provide maintenance mode off count for components (dsen)

Posted by ao...@apache.org.
AMBARI-21996 Provide maintenance mode off count for components (dsen)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/986a65db
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/986a65db
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/986a65db

Branch: refs/heads/branch-3.0-perf
Commit: 986a65dbf4fbf36dac7073418ef368c2c207b123
Parents: 311c7bb
Author: Dmytro Sen <ds...@apache.org>
Authored: Mon Sep 25 16:32:46 2017 +0300
Committer: Dmytro Sen <ds...@apache.org>
Committed: Mon Sep 25 16:32:46 2017 +0300

----------------------------------------------------------------------
 .../internal/ComponentResourceProvider.java     |  4 ++++
 .../server/state/ServiceComponentImpl.java      | 25 ++++++++++++++++++++
 .../internal/ComponentResourceProviderTest.java |  6 +++++
 .../server/state/ServiceComponentTest.java      | 21 +++++++++++++---
 4 files changed, 53 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/986a65db/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
index ebbf169..2e86b2d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
@@ -85,6 +85,8 @@ public class ComponentResourceProvider extends AbstractControllerResourceProvide
   protected static final String COMPONENT_TOTAL_COUNT_PROPERTY_ID     = "ServiceComponentInfo/total_count";
   protected static final String COMPONENT_STARTED_COUNT_PROPERTY_ID   = "ServiceComponentInfo/started_count";
   protected static final String COMPONENT_INSTALLED_COUNT_PROPERTY_ID = "ServiceComponentInfo/installed_count";
+  protected static final String COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID
+                                                                      = "ServiceComponentInfo/installed_and_maintenance_off_count";
   protected static final String COMPONENT_INIT_COUNT_PROPERTY_ID      = "ServiceComponentInfo/init_count";
   protected static final String COMPONENT_UNKNOWN_COUNT_PROPERTY_ID   = "ServiceComponentInfo/unknown_count";
   protected static final String COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID = "ServiceComponentInfo/install_failed_count";
@@ -124,6 +126,7 @@ public class ComponentResourceProvider extends AbstractControllerResourceProvide
     PROPERTY_IDS.add(COMPONENT_TOTAL_COUNT_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_STARTED_COUNT_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_INSTALLED_COUNT_PROPERTY_ID);
+    PROPERTY_IDS.add(COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID);
 
     PROPERTY_IDS.add(COMPONENT_INIT_COUNT_PROPERTY_ID);
     PROPERTY_IDS.add(COMPONENT_UNKNOWN_COUNT_PROPERTY_ID);
@@ -220,6 +223,7 @@ public class ComponentResourceProvider extends AbstractControllerResourceProvide
       setResourceProperty(resource, COMPONENT_TOTAL_COUNT_PROPERTY_ID, response.getServiceComponentStateCount().get("totalCount"), requestedIds);
       setResourceProperty(resource, COMPONENT_STARTED_COUNT_PROPERTY_ID, response.getServiceComponentStateCount().get("startedCount"), requestedIds);
       setResourceProperty(resource, COMPONENT_INSTALLED_COUNT_PROPERTY_ID, response.getServiceComponentStateCount().get("installedCount"), requestedIds);
+      setResourceProperty(resource, COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID, response.getServiceComponentStateCount().get("installedAndMaintenanceOffCount"), requestedIds);
       setResourceProperty(resource, COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID, response.getServiceComponentStateCount().get("installFailedCount"), requestedIds);
       setResourceProperty(resource, COMPONENT_INIT_COUNT_PROPERTY_ID, response.getServiceComponentStateCount().get("initCount"), requestedIds);
       setResourceProperty(resource, COMPONENT_UNKNOWN_COUNT_PROPERTY_ID, response.getServiceComponentStateCount().get("unknownCount"), requestedIds);

http://git-wip-us.apache.org/repos/asf/ambari/blob/986a65db/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
index 5f85e38..22c97ed 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
@@ -31,6 +31,7 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ObjectNotFoundException;
 import org.apache.ambari.server.ServiceComponentHostNotFoundException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.controller.MaintenanceStateHelper;
 import org.apache.ambari.server.controller.ServiceComponentResponse;
 import org.apache.ambari.server.events.ServiceComponentRecoveryChangedEvent;
 import org.apache.ambari.server.events.listeners.upgrade.StackVersionListener;
@@ -97,6 +98,9 @@ public class ServiceComponentImpl implements ServiceComponent {
   @Inject
   private HostComponentStateDAO hostComponentDAO;
 
+  @Inject
+  private MaintenanceStateHelper maintenanceStateHelper;
+
   @AssistedInject
   public ServiceComponentImpl(@Assisted Service service, @Assisted String componentName,
       AmbariMetaInfo ambariMetaInfo,
@@ -724,10 +728,31 @@ public class ServiceComponentImpl implements ServiceComponent {
     return count;
   }
 
+  /**
+   * Count the ServiceComponentHosts that have given state and are effectively not in maintenanceMode
+   * @param state
+   * @return
+   */
+  private int getMaintenanceOffSCHCountByState(State state) {
+    int count = 0;
+    for (ServiceComponentHost sch : hostComponents.values()) {
+      try {
+        MaintenanceState effectiveMaintenanceState = maintenanceStateHelper.getEffectiveState(sch, sch.getHost());
+        if (sch.getState() == state && effectiveMaintenanceState == MaintenanceState.OFF) {
+          count++;
+        }
+      } catch (AmbariException e) {
+        e.printStackTrace();
+      }
+    }
+    return count;
+  }
+
   private Map <String, Integer> getServiceComponentStateCount() {
     Map <String, Integer> serviceComponentStateCountMap = new HashMap<>();
     serviceComponentStateCountMap.put("startedCount", getSCHCountByState(State.STARTED));
     serviceComponentStateCountMap.put("installedCount", getSCHCountByState(State.INSTALLED));
+    serviceComponentStateCountMap.put("installedAndMaintenanceOffCount", getMaintenanceOffSCHCountByState(State.INSTALLED));
     serviceComponentStateCountMap.put("installFailedCount", getSCHCountByState(State.INSTALL_FAILED));
     serviceComponentStateCountMap.put("initCount", getSCHCountByState(State.INIT));
     serviceComponentStateCountMap.put("unknownCount", getSCHCountByState(State.UNKNOWN));

http://git-wip-us.apache.org/repos/asf/ambari/blob/986a65db/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
index 80cd1da..110e359 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
@@ -217,6 +217,7 @@ public class ComponentResourceProviderTest {
     Map <String, Integer> serviceComponentStateCountMap = new HashMap<>();
     serviceComponentStateCountMap.put("startedCount", 1);
     serviceComponentStateCountMap.put("installedCount", 0);
+    serviceComponentStateCountMap.put("installedAndMaintenanceOffCount", 0);
     serviceComponentStateCountMap.put("installFailedCount", 0);
     serviceComponentStateCountMap.put("initCount", 0);
     serviceComponentStateCountMap.put("unknownCount", 1);
@@ -280,6 +281,7 @@ public class ComponentResourceProviderTest {
     propertyIds.add(ComponentResourceProvider.COMPONENT_TOTAL_COUNT_PROPERTY_ID);
     propertyIds.add(ComponentResourceProvider.COMPONENT_STARTED_COUNT_PROPERTY_ID);
     propertyIds.add(ComponentResourceProvider.COMPONENT_INSTALLED_COUNT_PROPERTY_ID);
+    propertyIds.add(ComponentResourceProvider.COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID);
     propertyIds.add(ComponentResourceProvider.COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID);
     propertyIds.add(ComponentResourceProvider.COMPONENT_INIT_COUNT_PROPERTY_ID);
     propertyIds.add(ComponentResourceProvider.COMPONENT_UNKNOWN_COUNT_PROPERTY_ID);
@@ -311,6 +313,8 @@ public class ComponentResourceProviderTest {
       Assert.assertEquals(0, resource.getPropertyValue(
         ComponentResourceProvider.COMPONENT_INSTALLED_COUNT_PROPERTY_ID));
       Assert.assertEquals(0, resource.getPropertyValue(
+        ComponentResourceProvider.COMPONENT_INSTALLED_AND_MAINTENANCE_OFF_COUNT_PROPERTY_ID));
+      Assert.assertEquals(0, resource.getPropertyValue(
           ComponentResourceProvider.COMPONENT_INSTALL_FAILED_COUNT_PROPERTY_ID));
       Assert.assertEquals(0, resource.getPropertyValue(
           ComponentResourceProvider.COMPONENT_INIT_COUNT_PROPERTY_ID));
@@ -379,6 +383,7 @@ public class ComponentResourceProviderTest {
     Map <String, Integer> serviceComponentStateCountMap = new HashMap<>();
     serviceComponentStateCountMap.put("startedCount", 0);
     serviceComponentStateCountMap.put("installedCount", 1);
+    serviceComponentStateCountMap.put("installedAndMaintenanceOffCount", 0);
     serviceComponentStateCountMap.put("installFailedCount", 0);
     serviceComponentStateCountMap.put("initCount", 0);
     serviceComponentStateCountMap.put("unknownCount", 0);
@@ -691,6 +696,7 @@ public class ComponentResourceProviderTest {
     Map <String, Integer> serviceComponentStateCountMap = new HashMap<>();
     serviceComponentStateCountMap.put("startedCount", 0);
     serviceComponentStateCountMap.put("installedCount", 1);
+    serviceComponentStateCountMap.put("installedAndMaintenanceOffCount", 0);
     serviceComponentStateCountMap.put("installFailedCount", 0);
     serviceComponentStateCountMap.put("initCount", 0);
     serviceComponentStateCountMap.put("unknownCount", 0);

http://git-wip-us.apache.org/repos/asf/ambari/blob/986a65db/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
index 6320f35..c753f49 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
@@ -273,15 +273,28 @@ public class ServiceComponentTest {
     service.addServiceComponent(component);
 
     addHostToCluster("h1", service.getCluster().getClusterName());
+    addHostToCluster("h2", service.getCluster().getClusterName());
+    addHostToCluster("h3", service.getCluster().getClusterName());
     ServiceComponentHost sch =
       serviceComponentHostFactory.createNew(component, "h1");
+    ServiceComponentHost sch2 =
+      serviceComponentHostFactory.createNew(component, "h2");
+    ServiceComponentHost sch3 =
+      serviceComponentHostFactory.createNew(component, "h3");
     sch.setState(State.INSTALLED);
+    sch2.setState(State.INSTALLED);
+    sch3.setState(State.INSTALLED);
 
     Map<String, ServiceComponentHost> compHosts =
       new HashMap<>();
     compHosts.put("h1", sch);
+    compHosts.put("h2", sch2);
+    compHosts.put("h3", sch3);
     component.addServiceComponentHosts(compHosts);
-    Assert.assertEquals(1, component.getServiceComponentHosts().size());
+    Assert.assertEquals(3, component.getServiceComponentHosts().size());
+
+    component.getServiceComponentHost("h2").setMaintenanceState(MaintenanceState.ON);
+    sch3.setMaintenanceState(MaintenanceState.ON);
 
     ServiceComponent sc = service.getServiceComponent(componentName);
     Assert.assertNotNull(sc);
@@ -298,9 +311,11 @@ public class ServiceComponentTest {
     int totalCount = r.getServiceComponentStateCount().get("totalCount");
     int startedCount = r.getServiceComponentStateCount().get("startedCount");
     int installedCount = r.getServiceComponentStateCount().get("installedCount");
-    Assert.assertEquals(1, totalCount);
+    int installedAndMaintenanceOffCount = r.getServiceComponentStateCount().get("installedAndMaintenanceOffCount");
+    Assert.assertEquals(3, totalCount);
     Assert.assertEquals(0, startedCount);
-    Assert.assertEquals(1, installedCount);
+    Assert.assertEquals(3, installedCount);
+    Assert.assertEquals(1, installedAndMaintenanceOffCount);
 
     // TODO check configs
     // r.getConfigVersions()