/** * 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.state.stack.upgrade; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.serveraction.upgrades.AutoSkipFailedSummaryAction; import org.apache.ambari.server.stack.HostsType; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.UpgradeContext; import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent; import org.easymock.EasyMock; import org.easymock.EasyMockSupport; import org.junit.Assert; import org.junit.Test; /** * Tests the {@link StageWrapperBuilder}. */ public class StageWrapperBuilderTest extends EasyMockSupport { private static final StackId HDP_21 = new StackId("HDP-2.1.1"); /** * Tests that the various build methods of a builder are invoked in the * correct order. * * @throws Exception */ @Test public void testBuildOrder() throws Exception { Cluster cluster = createNiceMock(Cluster.class); EasyMock.expect(cluster.getCurrentStackVersion()).andReturn(HDP_21).atLeastOnce(); EasyMock.expect(cluster.getDesiredStackVersion()).andReturn(HDP_21).anyTimes(); RepositoryVersionEntity repoVersionEntity = createNiceMock(RepositoryVersionEntity.class); EasyMock.expect(repoVersionEntity.getStackId()).andReturn(HDP_21).anyTimes(); RepositoryVersionDAO repoVersionDAO = createNiceMock(RepositoryVersionDAO.class); EasyMock.expect(repoVersionDAO.findByStackNameAndVersion(EasyMock.anyString(), EasyMock.anyString())).andReturn(repoVersionEntity).anyTimes(); replayAll(); UpgradeContext upgradeContext = new UpgradeContext(cluster, UpgradeType.ROLLING, Direction.UPGRADE, HDP_21.toString(), new HashMap<String, Object>(), repoVersionDAO); MockStageWrapperBuilder builder = new MockStageWrapperBuilder(null); List<StageWrapper> stageWrappers = builder.build(upgradeContext); List<Integer> invocationOrder = builder.getInvocationOrder(); Assert.assertEquals(Integer.valueOf(0), invocationOrder.get(0)); Assert.assertEquals(Integer.valueOf(1), invocationOrder.get(1)); Assert.assertEquals(Integer.valueOf(2), invocationOrder.get(2)); // nothing happened, so this should be empty Assert.assertTrue(stageWrappers.isEmpty()); verifyAll(); } /** * Tests that a new task was inserted into the upgrade which will check for * skipped failures and display a summary. * * @throws Exception */ @Test public void testAutoSkipCheckInserted() throws Exception { Cluster cluster = createNiceMock(Cluster.class); EasyMock.expect(cluster.getCurrentStackVersion()).andReturn(HDP_21).atLeastOnce(); EasyMock.expect(cluster.getDesiredStackVersion()).andReturn(HDP_21).anyTimes(); RepositoryVersionEntity repoVersionEntity = createNiceMock(RepositoryVersionEntity.class); EasyMock.expect(repoVersionEntity.getStackId()).andReturn(HDP_21).anyTimes(); RepositoryVersionDAO repoVersionDAO = createNiceMock(RepositoryVersionDAO.class); EasyMock.expect(repoVersionDAO.findByStackNameAndVersion(EasyMock.anyString(), EasyMock.anyString())).andReturn(repoVersionEntity).anyTimes(); replayAll(); UpgradeContext upgradeContext = new UpgradeContext(cluster, UpgradeType.ROLLING, Direction.UPGRADE, HDP_21.toString(), new HashMap<String, Object>(), repoVersionDAO); upgradeContext.setAutoSkipComponentFailures(true); upgradeContext.setAutoSkipServiceCheckFailures(true); Grouping grouping = new Grouping(); grouping.skippable = true; MockStageWrapperBuilder builder = new MockStageWrapperBuilder(grouping); List<StageWrapper> mockStageWrappers = new ArrayList<>(); StageWrapper mockStageWrapper = EasyMock.createNiceMock(StageWrapper.class); mockStageWrappers.add(mockStageWrapper); builder.setMockStageWrappers(mockStageWrappers); List<StageWrapper> stageWrappers = builder.build(upgradeContext); Assert.assertEquals(2, stageWrappers.size()); StageWrapper skipSummaryWrapper = stageWrappers.get(1); Assert.assertEquals(StageWrapper.Type.SERVER_SIDE_ACTION, skipSummaryWrapper.getType()); ServerActionTask task = (ServerActionTask)(skipSummaryWrapper.getTasks().get(0).getTasks().get(0)); Assert.assertEquals(AutoSkipFailedSummaryAction.class.getName(), task.implClass); Assert.assertEquals(1, task.messages.size()); Assert.assertTrue(task.messages.get(0).contains("There are failures that were automatically skipped")); verifyAll(); } /** * A mock {@link StageWrapperBuilder}. */ private final class MockStageWrapperBuilder extends StageWrapperBuilder { private List<Integer> m_invocationOrder = new ArrayList<>(); private List<StageWrapper> m_stageWrappers = Collections.emptyList(); /** * Constructor. * * @param grouping */ protected MockStageWrapperBuilder(Grouping grouping) { super(grouping); } private void setMockStageWrappers(List<StageWrapper> stageWrappers) { m_stageWrappers = stageWrappers; } /** * Gets the invocation order. * * @return */ private List<Integer> getInvocationOrder() { return m_invocationOrder; } /** * {@inheritDoc} */ @Override public void add(UpgradeContext upgradeContext, HostsType hostsType, String service, boolean clientOnly, ProcessingComponent pc, Map<String, String> params) { } /** * {@inheritDoc} */ @Override public List<StageWrapper> build(UpgradeContext upgradeContext, List<StageWrapper> stageWrappers) { m_invocationOrder.add(1); return m_stageWrappers; } /** * {@inheritDoc} */ @Override protected List<StageWrapper> beforeBuild(UpgradeContext upgradeContext) { List<StageWrapper> stageWrappers = super.beforeBuild(upgradeContext); m_invocationOrder.add(0); return stageWrappers; } /** * {@inheritDoc} */ @Override protected List<StageWrapper> afterBuild(UpgradeContext upgradeContext, List<StageWrapper> stageWrappers) { stageWrappers = super.afterBuild(upgradeContext, stageWrappers); m_invocationOrder.add(2); return stageWrappers; } } }