You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2018/07/07 08:56:57 UTC
[ambari] branch branch-feature-AMBARI-14714 updated (c210fe5 ->
b1f8afd)
This is an automated email from the ASF dual-hosted git repository.
jluniya pushed a change to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git.
from c210fe5 Fix imports (jluniya)
add 8a30716 AMBARI-24237. UI Install: Custom Yarn Capacity Scheduler property set is missing after deploy. (jaimin) (#1665)
add 0cf3f67 AMBARI-24230. [Logsearch] Update hdfs configuration from Configuration Editor fails with 400 Error (#1660)
add ad8e812 AMBARI-24236 Ambari UI "NEXT" button is disabled for add service step of Spectrum Scale
add 30b776f AMBARI-24234. Alerts Are Running For Components Which Are Not Install… (#1663)
add aef0c47 AMBARI-24147 Make STOMP updates immutable. (#1669)
add 5b99aea AMBARI-24241 Host details page: remove duplicate title
add 32759cb AMBARI-24240 Admin View: Dashboard link leads to login page
add 41469ac AMBARI-24242 data-qa attribute present not for all properties
add eca6abf AMBARI-24238. Cover federation step 1 controller with tests
add 3f8d63e Merge pull request #1673 from hiveww/AMBARI-24238-trunk
add 5c78b42 [AMBARI-22832] Add flexible environment handling and environment depended API Url config. (#1680)
add 3b0ce61 AMBARI-24247. Kafka failed to stop (aonishuk)
add a100a99 [AMBARI-24229] Prevent Configuration Changes During Keytab Regeneration in an Upgrade
add 59f326c AMBARI-24251. Ambari Schema Upgrade is failing after creating views (dlysnichenko)
add 2e77158 Merge pull request #1682 from dlysnichenko/AMBARI-24251_trunk
add 7b7c1aa AMBARI-24252 Can't register HDP 3.0.0.0 version and "Use Local Repository"
add 5e83101 AMBARI-24249 - Ambari Upgrade Loads All Alerts When Renaming SOLR (#1686)
add e558469 [AMBARI-24250] Create Checkpoint page stuck while Enabling HA on Namenode
add 54cc2c3 AMBARI-24257. Tasks fail from time to time due error in file download (aonishuk)
add 7964cc4 AMBARI-24254 - Refactor renaming service ambari infra to ambari infra solr when upgrading to ambari 2.7.0 (#1693)
add b211832 AMBARI-24259. Let custom TrustStore settings saved in ambari.properties when configuring LDAP just like we did it in 2.6 (#1701)
new b1f8afd Merge remote-tracking branch 'origin/trunk' into branch-feature-AMBARI-14714
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../stackVersions/StackVersionsCreateCtrl.js | 2 +-
.../resources/ui/admin-web/app/views/sideNav.html | 2 +-
.../src/main/python/ambari_agent/FileCache.py | 5 +-
.../main/python/resource_management/core/sudo.py | 14 +-
.../model/inputconfig/impl/InputConfigGson.java | 2 +-
.../impl/MapFieldCopyDescriptorImpl.java | 2 +-
.../impl/MapFieldNameDescriptorImpl.java | 8 +-
.../impl/MapFieldValueDescriptorImpl.java | 8 +-
.../inputconfig/impl/PostMapValuesAdapter.java | 8 +-
.../ambari/logsearch/domain/StoryDataRegistry.java | 24 ++
.../apache/ambari/logsearch/domain/WebClient.java | 79 ++++
.../ambari/logsearch/steps/LogSearchApiSteps.java | 46 +--
.../logsearch/steps/LogSearchConfigApiSteps.java | 67 ++++
.../logsearch/story/LogSearchBackendStories.java | 15 +-
.../backend/log_search_cofig_api_tests.story | 9 +
.../src/main/resources/alias_config.json | 6 +-
.../src/main/resources/filters.config.json | 54 +--
.../resources/samples/config/config_audit.json | 52 +--
.../model/common/LSServerMapFieldCopy.java | 2 +-
.../model/common/LSServerMapFieldName.java | 2 +-
.../model/common/LSServerMapFieldValue.java | 2 +-
.../LSServerPostMapValuesListDeserializer.java | 20 +-
ambari-logsearch/ambari-logsearch-web/.gitignore | 21 ++
.../src/mockdata/mock-data-get.ts | 28 +-
.../shipper-conf/input.config-ambari.json | 176 ++++-----
.../logfeeder/shipper-conf/input.config-hdfs.json | 52 +--
.../logfeeder/shipper-conf/input.config-hst.json | 2 +-
...sException.java => AmbariRuntimeException.java} | 11 +-
.../server/agent/stomp/AgentConfigsHolder.java | 7 +-
.../server/agent/stomp/AgentHostDataHolder.java | 74 ++--
.../server/agent/stomp/AlertDefinitionsHolder.java | 40 ++-
.../server/agent/stomp/HostLevelParamsHolder.java | 76 ++--
.../server/agent/stomp/dto/AlertCluster.java | 45 ++-
.../server/agent/stomp/dto/ClusterConfigs.java | 7 -
.../agent/stomp/dto/HostLevelParamsCluster.java | 8 -
.../server/agent/stomp/dto/HostRepositories.java | 8 -
.../api/resources/ClusterResourceDefinition.java | 1 +
.../ambari/server/controller/KerberosHelper.java | 18 +-
.../server/controller/KerberosHelperImpl.java | 111 ++++--
.../controller/UpdateConfigurationPolicy.java | 116 ++++++
.../controller/internal/HostResourceProvider.java | 5 +-
.../internal/UpgradeResourceProvider.java | 139 ++++++--
.../ambari/server/events/AgentActionEvent.java | 6 +-
.../server/events/AgentConfigsUpdateEvent.java | 11 +-
.../server/events/ExecutionCommandEvent.java | 19 +-
.../server/events/HostLevelParamsUpdateEvent.java | 17 +-
.../alerts/AlertDefinitionsUIUpdateListener.java | 8 +-
.../events/publishers/AgentCommandsPublisher.java | 58 ++-
.../AbstractPrepareKerberosServerAction.java | 168 ++++++++-
.../kerberos/CreateKeytabFilesServerAction.java | 4 +-
.../kerberos/KerberosServerAction.java | 31 +-
.../PrepareDisableKerberosServerAction.java | 2 +-
.../PrepareEnableKerberosServerAction.java | 2 +-
.../PrepareKerberosIdentitiesServerAction.java | 27 +-
.../stageutils/KerberosKeytabController.java | 19 +-
.../org/apache/ambari/server/state/Cluster.java | 3 +
.../org/apache/ambari/server/state/Clusters.java | 4 +-
.../apache/ambari/server/state/ConfigHelper.java | 3 +-
.../ambari/server/state/alert/AlertDefinition.java | 38 ++
.../server/state/alert/AlertDefinitionHash.java | 11 +-
.../ambari/server/state/cluster/ClusterImpl.java | 12 +-
.../ambari/server/state/cluster/ClustersImpl.java | 4 +-
.../ambari/server/upgrade/UpgradeCatalog270.java | 166 ++++++---
.../src/main/python/ambari_server/setupSecurity.py | 53 +--
.../package/templates/input.config-hive.json.j2 | 2 +-
.../0.5.0/properties/input.config-ambari.json.j2 | 362 +++++++++----------
.../package/templates/input.config-spark.json.j2 | 2 +-
.../package/templates/input.config-spark2.json.j2 | 2 +-
.../ambari/server/agent/HeartbeatTestHelper.java | 5 +-
.../ambari/server/agent/TestHeartbeatHandler.java | 18 +-
.../server/agent/stomp/AgentDataHolderTest.java | 10 +-
.../agent/stomp/AlertDefinitionsHolderTest.java | 121 +++++++
.../agent/stomp/HostLevelParamsHolderTest.java | 118 ++++++
.../AmbariCustomCommandExecutionHelperTest.java | 6 +-
.../AbstractPrepareKerberosServerActionTest.java | 397 +++++++++++++++++++--
.../server/upgrade/UpgradeCatalog270Test.java | 12 +
ambari-web/app/assets/test/tests.js | 1 +
.../app/mixins/wizard/assign_master_components.js | 6 +-
ambari-web/app/models/host.js | 2 +
ambari-web/app/routes/main.js | 12 +-
ambari-web/app/styles/hosts.less | 9 +
ambari-web/app/styles/top-nav.less | 8 +-
.../widgets/service_config_password_field.hbs | 16 +-
ambari-web/app/templates/main/host/details.hbs | 13 +-
ambari-web/app/utils/config.js | 6 +-
ambari-web/app/views/common/controls_view.js | 2 +-
ambari-web/app/views/main/host/details.js | 4 +-
.../main/admin/federation/step1_controller_test.js | 142 ++++++++
ambari-web/test/utils/config_test.js | 18 +
ambari-web/test/views/main/host/details_test.js | 16 +-
90 files changed, 2455 insertions(+), 895 deletions(-)
create mode 100644 ambari-logsearch/ambari-logsearch-it/src/test/java/org/apache/ambari/logsearch/domain/WebClient.java
create mode 100644 ambari-logsearch/ambari-logsearch-it/src/test/java/org/apache/ambari/logsearch/steps/LogSearchConfigApiSteps.java
create mode 100644 ambari-logsearch/ambari-logsearch-it/src/test/resources/stories/backend/log_search_cofig_api_tests.story
copy ambari-server/src/main/java/org/apache/ambari/server/{StackAccessException.java => AmbariRuntimeException.java} (81%)
create mode 100644 ambari-server/src/main/java/org/apache/ambari/server/controller/UpdateConfigurationPolicy.java
create mode 100644 ambari-server/src/test/java/org/apache/ambari/server/agent/stomp/AlertDefinitionsHolderTest.java
create mode 100644 ambari-server/src/test/java/org/apache/ambari/server/agent/stomp/HostLevelParamsHolderTest.java
create mode 100644 ambari-web/test/controllers/main/admin/federation/step1_controller_test.js
[ambari] 01/01: Merge remote-tracking branch 'origin/trunk' into
branch-feature-AMBARI-14714
Posted by jl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jluniya pushed a commit to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git
commit b1f8afdf5e646a03b1ae0fc0d52644f001871525
Merge: c210fe5 b211832
Author: Jayush Luniya <jl...@HW11039.local>
AuthorDate: Sat Jul 7 01:56:34 2018 -0700
Merge remote-tracking branch 'origin/trunk' into branch-feature-AMBARI-14714
.../stackVersions/StackVersionsCreateCtrl.js | 2 +-
.../resources/ui/admin-web/app/views/sideNav.html | 2 +-
.../src/main/python/ambari_agent/FileCache.py | 5 +-
.../main/python/resource_management/core/sudo.py | 14 +-
.../model/inputconfig/impl/InputConfigGson.java | 2 +-
.../impl/MapFieldCopyDescriptorImpl.java | 2 +-
.../impl/MapFieldNameDescriptorImpl.java | 8 +-
.../impl/MapFieldValueDescriptorImpl.java | 8 +-
.../inputconfig/impl/PostMapValuesAdapter.java | 8 +-
.../ambari/logsearch/domain/StoryDataRegistry.java | 24 ++
.../apache/ambari/logsearch/domain/WebClient.java | 79 ++++
.../ambari/logsearch/steps/LogSearchApiSteps.java | 46 +--
.../logsearch/steps/LogSearchConfigApiSteps.java | 67 ++++
.../logsearch/story/LogSearchBackendStories.java | 15 +-
.../backend/log_search_cofig_api_tests.story | 9 +
.../src/main/resources/alias_config.json | 6 +-
.../src/main/resources/filters.config.json | 54 +--
.../resources/samples/config/config_audit.json | 52 +--
.../model/common/LSServerMapFieldCopy.java | 2 +-
.../model/common/LSServerMapFieldName.java | 2 +-
.../model/common/LSServerMapFieldValue.java | 2 +-
.../LSServerPostMapValuesListDeserializer.java | 20 +-
ambari-logsearch/ambari-logsearch-web/.gitignore | 21 ++
.../src/mockdata/mock-data-get.ts | 28 +-
.../shipper-conf/input.config-ambari.json | 176 ++++-----
.../logfeeder/shipper-conf/input.config-hdfs.json | 52 +--
.../logfeeder/shipper-conf/input.config-hst.json | 2 +-
...ctionEvent.java => AmbariRuntimeException.java} | 39 +-
.../server/agent/stomp/AgentConfigsHolder.java | 7 +-
.../server/agent/stomp/AgentHostDataHolder.java | 74 ++--
.../server/agent/stomp/AlertDefinitionsHolder.java | 40 ++-
.../server/agent/stomp/HostLevelParamsHolder.java | 76 ++--
.../server/agent/stomp/dto/AlertCluster.java | 45 ++-
.../server/agent/stomp/dto/ClusterConfigs.java | 7 -
.../agent/stomp/dto/HostLevelParamsCluster.java | 8 -
.../server/agent/stomp/dto/HostRepositories.java | 8 -
.../api/resources/ClusterResourceDefinition.java | 1 +
.../ambari/server/controller/KerberosHelper.java | 18 +-
.../server/controller/KerberosHelperImpl.java | 111 ++++--
.../controller/UpdateConfigurationPolicy.java | 116 ++++++
.../controller/internal/HostResourceProvider.java | 5 +-
.../internal/UpgradeResourceProvider.java | 139 ++++++--
.../ambari/server/events/AgentActionEvent.java | 6 +-
.../server/events/AgentConfigsUpdateEvent.java | 11 +-
.../server/events/ExecutionCommandEvent.java | 19 +-
.../server/events/HostLevelParamsUpdateEvent.java | 17 +-
.../alerts/AlertDefinitionsUIUpdateListener.java | 8 +-
.../events/publishers/AgentCommandsPublisher.java | 58 ++-
.../AbstractPrepareKerberosServerAction.java | 168 ++++++++-
.../kerberos/CreateKeytabFilesServerAction.java | 4 +-
.../kerberos/KerberosServerAction.java | 31 +-
.../PrepareDisableKerberosServerAction.java | 2 +-
.../PrepareEnableKerberosServerAction.java | 2 +-
.../PrepareKerberosIdentitiesServerAction.java | 27 +-
.../stageutils/KerberosKeytabController.java | 19 +-
.../org/apache/ambari/server/state/Cluster.java | 3 +
.../org/apache/ambari/server/state/Clusters.java | 4 +-
.../apache/ambari/server/state/ConfigHelper.java | 3 +-
.../ambari/server/state/alert/AlertDefinition.java | 38 ++
.../server/state/alert/AlertDefinitionHash.java | 11 +-
.../ambari/server/state/cluster/ClusterImpl.java | 12 +-
.../ambari/server/state/cluster/ClustersImpl.java | 4 +-
.../ambari/server/upgrade/UpgradeCatalog270.java | 166 ++++++---
.../src/main/python/ambari_server/setupSecurity.py | 53 +--
.../package/templates/input.config-hive.json.j2 | 2 +-
.../0.5.0/properties/input.config-ambari.json.j2 | 362 +++++++++----------
.../package/templates/input.config-spark.json.j2 | 2 +-
.../package/templates/input.config-spark2.json.j2 | 2 +-
.../ambari/server/agent/HeartbeatTestHelper.java | 5 +-
.../ambari/server/agent/TestHeartbeatHandler.java | 18 +-
.../server/agent/stomp/AgentDataHolderTest.java | 10 +-
.../agent/stomp/AlertDefinitionsHolderTest.java | 121 +++++++
.../agent/stomp/HostLevelParamsHolderTest.java | 118 ++++++
.../AmbariCustomCommandExecutionHelperTest.java | 6 +-
.../AbstractPrepareKerberosServerActionTest.java | 397 +++++++++++++++++++--
.../server/upgrade/UpgradeCatalog270Test.java | 12 +
ambari-web/app/assets/test/tests.js | 1 +
.../app/mixins/wizard/assign_master_components.js | 6 +-
ambari-web/app/models/host.js | 2 +
ambari-web/app/routes/main.js | 12 +-
ambari-web/app/styles/hosts.less | 9 +
ambari-web/app/styles/top-nav.less | 8 +-
.../widgets/service_config_password_field.hbs | 16 +-
ambari-web/app/templates/main/host/details.hbs | 13 +-
ambari-web/app/utils/config.js | 6 +-
ambari-web/app/views/common/controls_view.js | 2 +-
ambari-web/app/views/main/host/details.js | 4 +-
.../main/admin/federation/step1_controller_test.js | 142 ++++++++
ambari-web/test/utils/config_test.js | 18 +
ambari-web/test/views/main/host/details_test.js | 16 +-
90 files changed, 2455 insertions(+), 923 deletions(-)
diff --cc ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HostLevelParamsHolder.java
index 783ad4f,b309bbb..69fa512
--- 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
@@@ -21,9 -23,13 +23,12 @@@ import java.util.SortedMap
import java.util.TreeMap;
import org.apache.ambari.server.AmbariException;
+ import org.apache.ambari.server.agent.CommandRepository;
+ import org.apache.ambari.server.agent.RecoveryConfig;
import org.apache.ambari.server.agent.RecoveryConfigHelper;
import org.apache.ambari.server.agent.stomp.dto.HostLevelParamsCluster;
+ import org.apache.ambari.server.agent.stomp.dto.HostRepositories;
import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.events.ClusterComponentsRepoChangedEvent;
import org.apache.ambari.server.events.HostLevelParamsUpdateEvent;
import org.apache.ambari.server.events.MaintenanceModeEvent;
import org.apache.ambari.server.events.ServiceComponentRecoveryChangedEvent;
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
index 16b4636,287e1a5..2e2f988
--- 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
@@@ -78,8 -81,12 +82,10 @@@ import org.apache.ambari.server.securit
import org.apache.ambari.server.security.authorization.AuthorizationHelper;
import org.apache.ambari.server.security.authorization.ResourceType;
import org.apache.ambari.server.security.authorization.RoleAuthorization;
+ import org.apache.ambari.server.serveraction.kerberos.KerberosOperationException;
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.Service;
-import org.apache.ambari.server.state.ServiceComponent;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.UpgradeContext;
import org.apache.ambari.server.state.UpgradeContextFactory;
@@@ -692,7 -726,9 +734,9 @@@ public class UpgradeResourceProvider ex
Cluster cluster = upgradeContext.getCluster();
Direction direction = upgradeContext.getDirection();
+ ConfigHelper configHelper = getManagementController().getConfigHelper();
+
- List<UpgradeGroupHolder> groups = s_upgradeHelper.createSequence(pack, upgradeContext);
+ List<UpgradeGroupHolder> groups = s_upgradeHelper.createSequence(upgradeContext, upgradePlan);
if (groups.isEmpty()) {
throw new AmbariException("There are no groupings available");
@@@ -755,38 -813,94 +799,85 @@@
List<UpgradeItemEntity> itemEntities = new ArrayList<>();
for (StageWrapper wrapper : group.items) {
- if (wrapper.getType() == StageWrapper.Type.SERVER_SIDE_ACTION) {
- // !!! each stage is guaranteed to be of one type. but because there
- // is a bug that prevents one stage with multiple tasks assigned for
- // the same host, break them out into individual stages.
- for (TaskWrapper taskWrapper : wrapper.getTasks()) {
- Task task = taskWrapper.getTask();
--
- if (upgradeContext.isManualVerificationAutoSkipped()
- && task.getType() == Task.Type.MANUAL) {
- continue;
+ switch(wrapper.getType()) {
+ case SERVER_SIDE_ACTION:{
+ // !!! each stage is guaranteed to be of one type. but because there
+ // is a bug that prevents one stage with multiple tasks assigned for
+ // the same host, break them out into individual stages.
+ for (TaskWrapper taskWrapper : wrapper.getTasks()) {
- for (Task task : taskWrapper.getTasks()) {
- if (upgradeContext.isManualVerificationAutoSkipped()
- && task.getType() == Task.Type.MANUAL) {
- continue;
- }
-
- UpgradeItemEntity itemEntity = new UpgradeItemEntity();
++ Task task = taskWrapper.getTask();
++ if (upgradeContext.isManualVerificationAutoSkipped()
++ && task.getType() == Task.Type.MANUAL) {
++ continue;
++ }
+
- itemEntity.setText(wrapper.getText());
- itemEntity.setTasks(wrapper.getTasksJson());
- itemEntity.setHosts(wrapper.getHostsJson());
++ UpgradeItemEntity itemEntity = new UpgradeItemEntity();
++ itemEntity.setText(wrapper.getText());
++ itemEntity.setTasks(wrapper.getTasksJson());
++ itemEntity.setHosts(wrapper.getHostsJson());
+
- injectVariables(configHelper, cluster, itemEntity);
- if (makeServerSideStage(group, upgradeContext, effectiveStack, req,
- itemEntity, (ServerSideActionTask) task, configUpgradePack)) {
- itemEntities.add(itemEntity);
- }
++ injectVariables(configHelper, cluster, itemEntity);
++ if (makeServerSideStage(group, upgradeContext, null, req,
++ itemEntity, (ServerSideActionTask) task, configUpgradePack)) {
++ itemEntities.add(itemEntity);
+ }
+ }
+ break;
+ }
+ case REGENERATE_KEYTABS: {
+ try {
+ // remmeber how many stages we had before adding keytab stuff
+ int stageCount = req.getStages().size();
+
+ // build a map of request properties which say to
+ // - only regenerate missing tabs
+ // - allow all tasks which fail to be retried (so the upgrade doesn't abort)
+ Map<String, String> requestProperties = new HashMap<>();
+ requestProperties.put(SupportedCustomOperation.REGENERATE_KEYTABS.name().toLowerCase(), "missing");
+ requestProperties.put(KerberosHelper.ALLOW_RETRY, Boolean.TRUE.toString().toLowerCase());
+ requestProperties.put(KerberosHelper.DIRECTIVE_CONFIG_UPDATE_POLICY, UpdateConfigurationPolicy.NEW_AND_IDENTITIES.name());
+
+ // add stages to the upgrade which will regenerate missing keytabs only
+ req = s_kerberosHelper.get().executeCustomOperations(cluster, requestProperties, req, null);
+
+ // for every stage which was added for kerberos stuff create an
+ // associated upgrade item for it
+ List<Stage> stages = req.getStages();
+ int newStageCount = stages.size();
+ for (int i = stageCount; i < newStageCount; i++) {
+ Stage stage = stages.get(i);
+ stage.setSkippable(group.skippable);
+ stage.setAutoSkipFailureSupported(group.supportsAutoSkipOnFailure);
+
+ UpgradeItemEntity itemEntity = new UpgradeItemEntity();
+ itemEntity.setStageId(stage.getStageId());
+ itemEntity.setText(stage.getRequestContext());
+ itemEntity.setTasks(wrapper.getTasksJson());
+ itemEntity.setHosts(wrapper.getHostsJson());
+ itemEntities.add(itemEntity);
+ injectVariables(configHelper, cluster, itemEntity);
+ }
+ } catch (KerberosOperationException kerberosOperationException) {
+ throw new AmbariException("Unable to build keytab regeneration stage",
+ kerberosOperationException);
}
+ break;
+ }
+ default: {
UpgradeItemEntity itemEntity = new UpgradeItemEntity();
-
itemEntity.setText(wrapper.getText());
itemEntity.setTasks(wrapper.getTasksJson());
itemEntity.setHosts(wrapper.getHostsJson());
+ itemEntities.add(itemEntity);
- if (makeServerSideStage(group, upgradeContext, null, req,
- itemEntity, (ServerSideActionTask) task, configUpgradePack)) {
- itemEntities.add(itemEntity);
- }
+ injectVariables(configHelper, cluster, itemEntity);
+
+ // upgrade items match a stage
- createStage(group, upgradeContext, effectiveStack, req, itemEntity, wrapper);
++ createStage(group, upgradeContext, null, req, itemEntity, wrapper);
+
+ break;
}
- } else {
- UpgradeItemEntity itemEntity = new UpgradeItemEntity();
- itemEntity.setText(wrapper.getText());
- itemEntity.setTasks(wrapper.getTasksJson());
- itemEntity.setHosts(wrapper.getHostsJson());
- itemEntities.add(itemEntity);
-
- // upgrade items match a stage
- createStage(group, upgradeContext, null, req, itemEntity, wrapper);
}
}
diff --cc ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java
index c4fb497,c64131d..c549752
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java
@@@ -33,6 -34,6 +34,8 @@@ import java.util.List
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
++import java.util.function.Function;
++import java.util.stream.Collectors;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.agent.AgentCommand;
@@@ -248,4 -257,32 +259,33 @@@ public class AgentCommandsPublisher
ec.setKerberosCommandParams(kcp);
}
}
+
+ private Map<String, Collection<String>> adjustServiceComponentFilter(String clusterName, Map<String, ? extends Collection<String>> serviceComponentFilter) throws AmbariException {
+ Map<String, Collection<String>> adjustedFilter = new HashMap<>();
+ Cluster cluster = clusters.getCluster(clusterName);
+
- Map<String, Service> installedServices = (cluster == null) ? null : cluster.getServices();
++ Map<String, Service> installedServices = (cluster == null) ? null : cluster.getServices().stream().collect(
++ Collectors.toMap(Service::getName, Function.identity()));
+
+ if(!MapUtils.isEmpty(installedServices)) {
+ if (serviceComponentFilter != null) {
+ // prune off services that are not installed, or considered installed - like AMBARI
+ for(Map.Entry<String, ? extends Collection<String>> entry: serviceComponentFilter.entrySet()) {
+ String serviceName = entry.getKey();
+
+ if(installedServices.containsKey(serviceName)) {
+ adjustedFilter.put(serviceName, entry.getValue());
+ }
+ }
+ } else {
+ // return only the set of installed services
+ for(String serviceName: installedServices.keySet()) {
+ // Add an entry to indicate the service and all of it's components should be considered
+ adjustedFilter.put(serviceName, Collections.singletonList("*"));
+ }
+ }
+ }
+
+ return adjustedFilter;
+ }
}
diff --cc ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 0844aa0,821bdbc..048ab3a
--- 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
@@@ -2796,18 -2246,7 +2796,8 @@@ public class ClusterImpl implements Clu
@Override
public Collection<Host> getHosts() {
- Map<String, Host> hosts;
-
- try {
- //todo: why the hell does this method throw AmbariException???
- //todo: this is ridiculous that I need to get hosts for this cluster from Clusters!!!
- //todo: should I getHosts using the same logic as the other getHosts call? At least that doesn't throw AmbariException.
- hosts = clusters.getHostsForCluster(clusterName);
- } catch (AmbariException e) {
- //todo: in what conditions is AmbariException thrown?
- throw new RuntimeException("Unable to get hosts for cluster: " + clusterName, e);
- }
- return clusters.getHostsForCluster(clusterName).values();
++ Map<String, Host> hosts = clusters.getHostsForCluster(clusterName);
+ return hosts == null ? Collections.emptyList() : hosts.values();
}
private ClusterHealthReport getClusterHealthReport(
diff --cc ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog270.java
index d77a1dc,43bbc87..c1689bb
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog270.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog270.java
@@@ -1079,41 -1075,107 +1070,108 @@@ public class UpgradeCatalog270 extends
if (MapUtils.isEmpty(clusterMap))
return;
- ServiceConfigDAO serviceConfigDAO = injector.getInstance(ServiceConfigDAO.class);
- for (ServiceConfigEntity serviceConfigEntity : serviceConfigDAO.findAll()) {
- if (AMBARI_INFRA_OLD_NAME.equals(serviceConfigEntity.getServiceName())) {
- serviceConfigEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- serviceConfigDAO.merge(serviceConfigEntity);
- }
- }
+ EntityManager entityManager = getEntityManagerProvider().get();
+ ClusterServiceDAO clusterServiceDAO = injector.getInstance(ClusterServiceDAO.class);
+ HostComponentStateDAO hostComponentStateDAO = injector.getInstance(HostComponentStateDAO.class);
+ HostComponentDesiredStateDAO hostComponentDesiredStateDAO = injector.getInstance(HostComponentDesiredStateDAO.class);
+ ServiceDesiredStateDAO serviceDesiredStateDAO = injector.getInstance(ServiceDesiredStateDAO.class);
+ ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance(ServiceComponentDesiredStateDAO.class);
- AlertDefinitionDAO alertDefinitionDAO = injector.getInstance(AlertDefinitionDAO.class);
for (final Cluster cluster : clusterMap.values()) {
- for (AlertDefinitionEntity alertDefinitionEntity : alertDefinitionDAO.findByService(cluster.getClusterId(), AMBARI_INFRA_OLD_NAME)) {
- alertDefinitionEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- alertDefinitionDAO.merge(alertDefinitionEntity);
- ClusterServiceEntityPK clusterServiceEntityPK = new ClusterServiceEntityPK();
- clusterServiceEntityPK.setClusterId(cluster.getClusterId());
- clusterServiceEntityPK.setServiceName(AMBARI_INFRA_OLD_NAME);
- ClusterServiceEntity clusterServiceEntity = clusterServiceDAO.findByPK(clusterServiceEntityPK);
- if (clusterServiceEntity == null)
- continue;
-
- List<ServiceComponentDesiredStateEntity> serviceComponentDesiredStateEntities =
- new ArrayList<>(clusterServiceEntity.getServiceComponentDesiredStateEntities());
- ServiceDesiredStateEntity serviceDesiredStateEntity = clusterServiceEntity.getServiceDesiredStateEntity();
- List<HostComponentStateEntity> hostComponentStateEntities = hostComponentStateDAO.findByService(AMBARI_INFRA_OLD_NAME);
- List<HostComponentDesiredStateEntity> hostComponentDesiredStateEntities = new ArrayList<>();
- for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity : clusterServiceEntity.getServiceComponentDesiredStateEntities()) {
- hostComponentDesiredStateEntities.addAll(
- hostComponentDesiredStateDAO.findByIndex(cluster.getClusterId(), AMBARI_INFRA_OLD_NAME, serviceComponentDesiredStateEntity.getComponentName()));
- }
-
- for (HostComponentStateEntity hostComponentStateEntity : hostComponentStateEntities) {
- hostComponentStateDAO.remove(hostComponentStateEntity);
- entityManager.detach(hostComponentStateEntity);
- hostComponentStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- }
-
- for (HostComponentDesiredStateEntity hostComponentDesiredStateEntity : hostComponentDesiredStateEntities) {
- hostComponentDesiredStateDAO.remove(hostComponentDesiredStateEntity);
- entityManager.detach(hostComponentDesiredStateEntity);
- hostComponentDesiredStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- }
-
- clusterServiceEntity.getServiceComponentDesiredStateEntities().clear();
- for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity : serviceComponentDesiredStateEntities) {
- serviceComponentDesiredStateDAO.remove(serviceComponentDesiredStateEntity);
- entityManager.detach(serviceComponentDesiredStateEntity);
- serviceComponentDesiredStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- }
-
- if (serviceDesiredStateEntity != null) {
- clusterServiceEntity.setServiceDesiredStateEntity(null);
- serviceDesiredStateDAO.remove(serviceDesiredStateEntity);
- entityManager.detach(serviceDesiredStateEntity);
- serviceDesiredStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
-- }
-
- clusterServiceDAO.remove(clusterServiceEntity);
- entityManager.detach(clusterServiceEntity);
-
- clusterServiceEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- clusterServiceEntity.setServiceDesiredStateEntity(serviceDesiredStateEntity);
- clusterServiceDAO.create(clusterServiceEntity);
-
- for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity : serviceComponentDesiredStateEntities)
- serviceComponentDesiredStateDAO.create(serviceComponentDesiredStateEntity);
- for (HostComponentStateEntity hostComponentStateEntity : hostComponentStateEntities)
- hostComponentStateDAO.create(hostComponentStateEntity);
- for (HostComponentDesiredStateEntity hostComponentDesiredStateEntity : hostComponentDesiredStateEntities)
- hostComponentDesiredStateDAO.create(hostComponentDesiredStateEntity);
++ // TODO: [AMP] Revisit logic
++// ClusterServiceEntity clusterServiceEntity = clusterServiceDAO.findByPK(cluster.getClusterId());
++// if (clusterServiceEntity == null)
++// continue;
++//
++// List<ServiceComponentDesiredStateEntity> serviceComponentDesiredStateEntities =
++// new ArrayList<>(clusterServiceEntity.getServiceComponentDesiredStateEntities());
++// ServiceDesiredStateEntity serviceDesiredStateEntity = clusterServiceEntity.getServiceDesiredStateEntity();
++//
++// List<HostComponentStateEntity> hostComponentStateEntities = hostComponentStateDAO.findByService(AMBARI_INFRA_OLD_NAME);
++// List<HostComponentDesiredStateEntity> hostComponentDesiredStateEntities = new ArrayList<>();
++//
++//
++// for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity : clusterServiceEntity.getServiceComponentDesiredStateEntities()) {
++// hostComponentDesiredStateEntities.addAll(
++// hostComponentDesiredStateDAO.findByIndex(cluster.getClusterId(), AMBARI_INFRA_OLD_NAME, serviceComponentDesiredStateEntity.getComponentName()));
++// }
++//
++// for (HostComponentStateEntity hostComponentStateEntity : hostComponentStateEntities) {
++// hostComponentStateDAO.remove(hostComponentStateEntity);
++// entityManager.detach(hostComponentStateEntity);
++// hostComponentStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
++// }
++//
++// for (HostComponentDesiredStateEntity hostComponentDesiredStateEntity : hostComponentDesiredStateEntities) {
++// hostComponentDesiredStateDAO.remove(hostComponentDesiredStateEntity);
++// entityManager.detach(hostComponentDesiredStateEntity);
++// hostComponentDesiredStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
++// }
++//
++// clusterServiceEntity.getServiceComponentDesiredStateEntities().clear();
++// for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity : serviceComponentDesiredStateEntities) {
++// serviceComponentDesiredStateDAO.remove(serviceComponentDesiredStateEntity);
++// entityManager.detach(serviceComponentDesiredStateEntity);
++// serviceComponentDesiredStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
++// }
++//
++// if (serviceDesiredStateEntity != null) {
++// clusterServiceEntity.setServiceDesiredStateEntity(null);
++// serviceDesiredStateDAO.remove(serviceDesiredStateEntity);
++// entityManager.detach(serviceDesiredStateEntity);
++// serviceDesiredStateEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
++// }
++//
++// clusterServiceDAO.remove(clusterServiceEntity);
++// entityManager.detach(clusterServiceEntity);
++//
++// clusterServiceEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
++// clusterServiceEntity.setServiceDesiredStateEntity(serviceDesiredStateEntity);
++// clusterServiceDAO.create(clusterServiceEntity);
++//
++// for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity : serviceComponentDesiredStateEntities)
++// serviceComponentDesiredStateDAO.create(serviceComponentDesiredStateEntity);
++// for (HostComponentStateEntity hostComponentStateEntity : hostComponentStateEntities)
++// hostComponentStateDAO.create(hostComponentStateEntity);
++// for (HostComponentDesiredStateEntity hostComponentDesiredStateEntity : hostComponentDesiredStateEntities)
++// hostComponentDesiredStateDAO.create(hostComponentDesiredStateEntity);
}
- AlertDispatchDAO alertDispatchDAO = injector.getInstance(AlertDispatchDAO.class);
- for (AlertGroupEntity alertGroupEntity : alertDispatchDAO.findAllGroups()) {
- if (AMBARI_INFRA_OLD_NAME.equals(alertGroupEntity.getServiceName())) {
- alertGroupEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- alertGroupEntity.setGroupName(AMBARI_INFRA_NEW_NAME);
- alertDispatchDAO.merge(alertGroupEntity);
+ executeInTransaction(() -> {
+ TypedQuery<ServiceConfigEntity> serviceConfigUpdate = entityManager.createQuery(
+ "UPDATE ServiceConfigEntity SET serviceName = :newServiceName WHERE serviceName = :oldServiceName", ServiceConfigEntity.class);
+ serviceConfigUpdate.setParameter("newServiceName", AMBARI_INFRA_NEW_NAME);
+ serviceConfigUpdate.setParameter("oldServiceName", AMBARI_INFRA_OLD_NAME);
+ serviceConfigUpdate.executeUpdate();
+ });
+
+ executeInTransaction(() -> {
+ for (final Cluster cluster : clusterMap.values()) {
+ TypedQuery<AlertDefinitionEntity> alertDefinitionUpdate = entityManager.createQuery(
+ "UPDATE AlertDefinitionEntity SET serviceName = :newServiceName WHERE serviceName = :oldServiceName AND clusterId = :clusterId", AlertDefinitionEntity.class);
+ alertDefinitionUpdate.setParameter("clusterId", cluster.getClusterId());
+ alertDefinitionUpdate.setParameter("newServiceName", AMBARI_INFRA_NEW_NAME);
+ alertDefinitionUpdate.setParameter("oldServiceName", AMBARI_INFRA_OLD_NAME);
+ alertDefinitionUpdate.executeUpdate();
}
- }
-
- AlertsDAO alertsDAO = injector.getInstance(AlertsDAO.class);
- for (AlertHistoryEntity alertHistoryEntity : alertsDAO.findAll()) {
- if (AMBARI_INFRA_OLD_NAME.equals(alertHistoryEntity.getServiceName())) {
- alertHistoryEntity.setServiceName(AMBARI_INFRA_NEW_NAME);
- alertsDAO.merge(alertHistoryEntity);
- }
- }
+ });
+
+ executeInTransaction(() -> {
+ TypedQuery<AlertGroupEntity> alertGroupUpdate = entityManager.createQuery("UPDATE AlertGroupEntity SET serviceName = :newServiceName, groupName = :newServiceName WHERE serviceName = :oldServiceName", AlertGroupEntity.class);
+ alertGroupUpdate.setParameter("newServiceName", AMBARI_INFRA_NEW_NAME);
+ alertGroupUpdate.setParameter("oldServiceName", AMBARI_INFRA_OLD_NAME);
+ alertGroupUpdate.executeUpdate();
+ });
+
+ executeInTransaction(() -> {
+ TypedQuery<AlertHistoryEntity> alertHistoryUpdate = entityManager.createQuery("UPDATE AlertHistoryEntity SET serviceName = :newServiceName WHERE serviceName = :oldServiceName", AlertHistoryEntity.class);
+ alertHistoryUpdate.setParameter("newServiceName", AMBARI_INFRA_NEW_NAME);
+ alertHistoryUpdate.setParameter("oldServiceName", AMBARI_INFRA_OLD_NAME);
+ alertHistoryUpdate.executeUpdate();
+ });
// Force the clusters object to reload to ensure the renamed service is accounted for
- getEntityManagerProvider().get().getEntityManagerFactory().getCache().evictAll();
+ entityManager.getEntityManagerFactory().getCache().evictAll();
clusters.invalidateAllClusters();
}
diff --cc ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
index 424e652,75d5a7a..cfb786c
--- 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
@@@ -1414,6 -1412,12 +1414,12 @@@ public class TestHeartbeatHandler
List<Map<String, String>> kcp;
Map<String, String> properties;
+ Cluster cluster = heartbeatTestHelper.getDummyCluster();
+ Service hdfs = addService(cluster, HDFS);
- hdfs.addServiceComponent(DATANODE);
- hdfs.addServiceComponent(NAMENODE);
- hdfs.addServiceComponent(SECONDARY_NAMENODE);
++ hdfs.addServiceComponent(DATANODE, DATANODE);
++ hdfs.addServiceComponent(NAMENODE, NAMENODE);
++ hdfs.addServiceComponent(SECONDARY_NAMENODE, SECONDARY_NAMENODE);
+
kcp = testInjectKeytabSetKeytab("c6403.ambari.apache.org");
Assert.assertNotNull(kcp);
Assert.assertEquals(1, kcp.size());
@@@ -1450,6 -1454,12 +1456,12 @@@
@Test
public void testInjectKeytabNotApplicableHost() throws Exception {
+ Cluster cluster = heartbeatTestHelper.getDummyCluster();
+ Service hdfs = addService(cluster, HDFS);
- hdfs.addServiceComponent(DATANODE);
- hdfs.addServiceComponent(NAMENODE);
- hdfs.addServiceComponent(SECONDARY_NAMENODE);
++ hdfs.addServiceComponent(DATANODE, DATANODE);
++ hdfs.addServiceComponent(NAMENODE, NAMENODE);
++ hdfs.addServiceComponent(SECONDARY_NAMENODE, SECONDARY_NAMENODE);
+
List<Map<String, String>> kcp;
kcp = testInjectKeytabSetKeytab("c6401.ambari.apache.org");
Assert.assertNotNull(kcp);
diff --cc ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java
index ba76b80,528e589..65abb4e
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java
@@@ -153,15 -141,15 +153,15 @@@ public class AmbariCustomCommandExecuti
ambariManagementController = injector.getInstance(AmbariManagementController.class);
clusters = injector.getInstance(Clusters.class);
- EasyMock.expect(configHelper.getPropertyValuesWithPropertyType(EasyMock.anyObject(StackId.class),
+ expect(configHelper.getPropertiesWithPropertyType(EasyMock.anyObject(StackId.class),
EasyMock.anyObject(PropertyInfo.PropertyType.class),
EasyMock.anyObject(Cluster.class),
- EasyMock.anyObject(Map.class))).andReturn(Collections.EMPTY_SET);
+ EasyMock.anyObject(Map.class))).andReturn(Collections.emptyMap());
- expect(configHelper.getHostActualConfigs(EasyMock.anyLong())).andReturn(
- new AgentConfigsUpdateEvent(new TreeMap<>())).anyTimes();
+ EasyMock.expect(configHelper.getHostActualConfigs(EasyMock.anyLong())).andReturn(
+ new AgentConfigsUpdateEvent(null, new TreeMap<>())).anyTimes();
- EasyMock.replay(configHelper);
+ replay(configHelper);
StageUtils.setTopologyManager(injector.getInstance(TopologyManager.class));
StageUtils.setConfiguration(injector.getInstance(Configuration.class));
diff --cc ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java
index 586b023,47ccef5..4be2680
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerActionTest.java
@@@ -130,10 -269,11 +269,11 @@@ public class AbstractPrepareKerberosSer
put(zookeeperService, null);
}};
- expect(kerberosDescriptor.getProperties()).andReturn(descriptorProperties).atLeastOnce();
- expect(kerberosIdentityDataFileWriterFactory.createKerberosIdentityDataFileWriter((File)anyObject())).andReturn(kerberosIdentityDataFileWriter);
+ KerberosIdentityDataFileWriterFactory kerberosIdentityDataFileWriterFactory = injector.getInstance(KerberosIdentityDataFileWriterFactory.class);
+ expect(kerberosIdentityDataFileWriterFactory.createKerberosIdentityDataFileWriter(anyObject(File.class))).andReturn(kerberosIdentityDataFileWriter);
+
// it's important to pass a copy of clusterServices
- expect(cluster.getServices()).andReturn(new HashMap<>(clusterServices)).atLeastOnce();
+ expect(cluster.getServicesByName()).andReturn(new HashMap<>(clusterServices)).atLeastOnce();
expect(serviceComponentHostHDFS.getHostName()).andReturn(hostName).atLeastOnce();
expect(serviceComponentHostHDFS.getServiceName()).andReturn(hdfsService).atLeastOnce();
diff --cc ambari-web/app/assets/test/tests.js
index 078f14c,0be62bf..3311b5b
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@@ -66,8 -66,10 +66,9 @@@ var files =
'test/controllers/main/admin/kerberos/step7_controller_test',
'test/controllers/main/admin/kerberos/step8_controller_test',
'test/controllers/main/admin/service_auto_start_test',
- 'test/controllers/main/admin/stack_and_upgrade_controller_test',
'test/controllers/main/admin/stack_upgrade_history_controller_test',
'test/controllers/main/admin/serviceAccounts_controller_test',
+ 'test/controllers/main/admin/federation/step1_controller_test',
'test/controllers/main/admin/highAvailability_controller_test',
'test/controllers/main/admin/highAvailability/progress_controller_test',
'test/controllers/main/admin/highAvailability/progress_popup_controller_test',
diff --cc ambari-web/app/mixins/wizard/assign_master_components.js
index ecdb9c3,25bf86c..518959c
--- a/ambari-web/app/mixins/wizard/assign_master_components.js
+++ b/ambari-web/app/mixins/wizard/assign_master_components.js
@@@ -1199,17 -1180,16 +1199,17 @@@ App.AssignMasterComponents = Em.Mixin.c
}
this.set('validationInProgress', true);
-
- // load recommendations with partial request
+
this.getRecommendedHosts({
hosts: hostNames,
+ mpack_instances: mpackInstances,
components: this.getCurrentComponentHostMap()
- }).then(function() {
+ }).done(function() {
self.validateSelectedHostComponents({
hosts: hostNames,
+ mpack_instances: mpackInstances,
blueprint: self.get('recommendations')
- }).then(function() {
+ }).always(function() {
if (callback) {
callback();
}