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}}
{{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}} {{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}} {{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}} {{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}} {{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>×</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)">×</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()