AMBARI-22679. RU: Service action failed with NullPointer on Downgrade after RU (dgrinenko via dlysnichenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/55f095ab Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/55f095ab Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/55f095ab Branch: refs/heads/branch-feature-AMBARI-21674 Commit: 55f095abb3d910b8e41b4c8054143c1d6d64fdf2 Parents: 32092da Author: Lisnichenko Dmitro <[email protected]> Authored: Fri Dec 22 19:25:55 2017 +0200 Committer: Lisnichenko Dmitro <[email protected]> Committed: Fri Dec 22 19:27:12 2017 +0200 ---------------------------------------------------------------------- .../internal/UpgradeResourceProvider.java | 31 +++++++-------- .../ambari/server/state/UpgradeContext.java | 14 +++++++ .../state/stack/ConfigUpgradeValidityTest.java | 42 ++++++++++++++++++-- 3 files changed, 68 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/55f095ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java ---------------------------------------------------------------------- diff --git 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 index 1fbf130..7f38740 100644 --- 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 @@ -17,8 +17,6 @@ */ package org.apache.ambari.server.controller.internal; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER; import java.text.MessageFormat; import java.util.ArrayList; @@ -82,9 +80,7 @@ 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.ServiceInfo; import org.apache.ambari.server.state.StackId; -import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.UpgradeContext; import org.apache.ambari.server.state.UpgradeContextFactory; import org.apache.ambari.server.state.UpgradeHelper; @@ -766,16 +762,12 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider s_upgradeHelper.updateDesiredRepositoriesAndConfigs(upgradeContext); } - @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES, comment = "This is SO VERY wrong") - StackId configurationPackSourceStackId = upgradeContext.getSourceVersions().values().iterator().next().getStackId(); - // resolve or build a proper config upgrade pack - always start out with the config pack // for the current stack and merge into that // // HDP 2.2 to 2.3 should start with the config-upgrade.xml from HDP 2.2 // HDP 2.2 to 2.4 should start with HDP 2.2 and merge in HDP 2.3's config-upgrade.xml - ConfigUpgradePack configUpgradePack = ConfigurationPackBuilder.build(pack, - configurationPackSourceStackId); + ConfigUpgradePack configUpgradePack = ConfigurationPackBuilder.build(upgradeContext); // create the upgrade and request for (UpgradeGroupHolder group : groups) { @@ -1603,17 +1595,24 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider * Builds the configurations to use for the specified upgrade and source * stack. * - * @param upgradePack - * the upgrade pack (not {@code null}). - * @param sourceStackId - * the source stack (not {@code null}). + * @param cx + * the upgrade context(not {@code null}). * @return the {@link ConfigUpgradePack} which contains all of the necessary * configuration definitions for the upgrade. */ - public static ConfigUpgradePack build(UpgradePack upgradePack, StackId sourceStackId) { + public static ConfigUpgradePack build(UpgradeContext cx) { + final UpgradePack upgradePack = cx.getUpgradePack(); + final StackId stackId; + + if (cx.getDirection() == Direction.UPGRADE) { + stackId = cx.getStackIdFromVersions(cx.getSourceVersions()); + } else { + stackId = cx.getStackIdFromVersions(cx.getTargetVersions()); + } + List<UpgradePack.IntermediateStack> intermediateStacks = upgradePack.getIntermediateStacks(); ConfigUpgradePack configUpgradePack = s_metaProvider.get().getConfigUpgradePack( - sourceStackId.getStackName(), sourceStackId.getStackVersion()); + stackId.getStackName(), stackId.getStackVersion()); // merge in any intermediate stacks if (null != intermediateStacks) { @@ -1623,7 +1622,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider for (UpgradePack.IntermediateStack intermediateStack : intermediateStacks) { ConfigUpgradePack intermediateConfigUpgradePack = s_metaProvider.get().getConfigUpgradePack( - sourceStackId.getStackName(), intermediateStack.version); + stackId.getStackName(), intermediateStack.version); configPacksToMerge.add(intermediateConfigUpgradePack); } http://git-wip-us.apache.org/repos/asf/ambari/blob/55f095ab/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java index 2b91bac..befa31b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java @@ -529,6 +529,20 @@ public class UpgradeContext { } /** + * Getting stackId from the set of versions. Is is possible until we upgrading components on the same stack. + * + * Note: Function should be modified for cross-stack upgrade. + * + * @param version {@link Set} of services repository versions + * @return + * {@link StackId} based on provided versions + */ + @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES, comment="This is wrong") + public StackId getStackIdFromVersions(Map<String, RepositoryVersionEntity> version) { + return version.values().iterator().next().getStackId(); + } + + /** * Gets the upgrade pack for this upgrade. * * @return the upgrade pack http://git-wip-us.apache.org/repos/asf/ambari/blob/55f095ab/ambari-server/src/test/java/org/apache/ambari/server/state/stack/ConfigUpgradeValidityTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/ConfigUpgradeValidityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/ConfigUpgradeValidityTest.java index 2930590..3d8c5e7 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/ConfigUpgradeValidityTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/ConfigUpgradeValidityTest.java @@ -31,9 +31,17 @@ import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.internal.UpgradeResourceProvider.ConfigurationPackBuilder; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +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.orm.entities.UpgradeHistoryEntity; import org.apache.ambari.server.stack.ModuleFileUnmarshaller; +import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.StackInfo; +import org.apache.ambari.server.state.UpgradeContext; +import org.apache.ambari.server.state.UpgradeContextFactory; +import org.apache.ambari.server.state.cluster.ClusterImpl; import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent; import org.apache.ambari.server.state.stack.upgrade.ClusterGrouping; import org.apache.ambari.server.state.stack.upgrade.ClusterGrouping.ExecuteStage; @@ -46,6 +54,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.commons.lang.StringUtils; +import org.easymock.EasyMock; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -70,6 +79,7 @@ public class ConfigUpgradeValidityTest { private Injector injector; private AmbariMetaInfo ambariMetaInfo; + private UpgradeContextFactory upgradeContextFactory; private int validatedConfigCount = 0; @@ -86,6 +96,7 @@ public class ConfigUpgradeValidityTest { injector.getInstance(GuiceJpaInitializer.class); ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class); + upgradeContextFactory = injector.getInstance(UpgradeContextFactory.class); } @After @@ -104,6 +115,8 @@ public class ConfigUpgradeValidityTest { Collection<StackInfo> stacks = ambariMetaInfo.getStacks(); Assert.assertFalse(stacks.isEmpty()); + Cluster cluster = EasyMock.createNiceMock(Cluster.class); + for( StackInfo stack : stacks ){ if (!stack.isActive()) { LOG.info("Skipping configuration validity test for {}", new StackId(stack)); @@ -113,10 +126,33 @@ public class ConfigUpgradeValidityTest { Map<String, UpgradePack> upgradePacks = ambariMetaInfo.getUpgradePacks(stack.getName(), stack.getVersion()); for (String key : upgradePacks.keySet()) { UpgradePack upgradePack = upgradePacks.get(key); - StackId sourceStack = new StackId(stack); + final StackId sourceStack = new StackId(stack); + + final RepositoryVersionEntity rve = new RepositoryVersionEntity() {{ + setStack(new StackEntity(){{ + setStackName(sourceStack.getStackName()); + setStackVersion(sourceStack.getStackVersion()); + }}); + }}; + + final UpgradeEntity upgradeEntity = new UpgradeEntity(); + + UpgradeHistoryEntity upgradeHistoryEntity = new UpgradeHistoryEntity(){{ + setServiceName("TEST"); + setComponentName("TEST"); + setFromRepositoryVersion(rve); + setUpgrade(upgradeEntity); + }}; + + upgradeEntity.setDirection(Direction.UPGRADE); + upgradeEntity.addHistory(upgradeHistoryEntity); + upgradeEntity.setRepositoryVersion(rve); + + UpgradeContext cx = upgradeContextFactory.create(cluster, upgradeEntity); + + cx.setUpgradePack(upgradePack); - ConfigUpgradePack configUpgradePack = ConfigurationPackBuilder.build(upgradePack, - sourceStack); + ConfigUpgradePack configUpgradePack = ConfigurationPackBuilder.build(cx); // do configure tasks in the group section List<Grouping> groups = upgradePack.getGroups(Direction.UPGRADE);
