| /** |
| * 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.internal; |
| |
| import static org.easymock.EasyMock.anyLong; |
| import static org.easymock.EasyMock.createNiceMock; |
| import static org.easymock.EasyMock.createStrictMock; |
| import static org.easymock.EasyMock.expect; |
| import static org.easymock.EasyMock.replay; |
| import static org.easymock.EasyMock.reset; |
| import static org.easymock.EasyMock.verify; |
| import static org.junit.Assert.fail; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.apache.ambari.server.actionmanager.ActionManager; |
| import org.apache.ambari.server.actionmanager.HostRoleStatus; |
| import org.apache.ambari.server.controller.AmbariManagementController; |
| import org.apache.ambari.server.controller.spi.Predicate; |
| import org.apache.ambari.server.controller.spi.QueryResponse; |
| import org.apache.ambari.server.controller.spi.Request; |
| import org.apache.ambari.server.controller.spi.Resource; |
| import org.apache.ambari.server.controller.utilities.PredicateBuilder; |
| import org.apache.ambari.server.controller.utilities.PropertyHelper; |
| import org.apache.ambari.server.metadata.ActionMetadata; |
| import org.apache.ambari.server.orm.InMemoryDefaultTestModule; |
| import org.apache.ambari.server.orm.dao.HostRoleCommandDAO; |
| import org.apache.ambari.server.orm.dao.HostRoleCommandStatusSummaryDTO; |
| import org.apache.ambari.server.orm.dao.StageDAO; |
| import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; |
| import org.apache.ambari.server.orm.entities.StageEntity; |
| import org.apache.ambari.server.state.Cluster; |
| import org.apache.ambari.server.state.Clusters; |
| import org.apache.ambari.server.topology.TopologyManager; |
| import org.easymock.EasyMock; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Ignore; |
| import org.junit.Test; |
| |
| import com.google.inject.Binder; |
| import com.google.inject.Guice; |
| import com.google.inject.Injector; |
| import com.google.inject.Module; |
| import com.google.inject.util.Modules; |
| |
| public class StageResourceProviderTest { |
| |
| private StageDAO dao = null; |
| private Clusters clusters = null; |
| private Cluster cluster = null; |
| private AmbariManagementController managementController = null; |
| private Injector injector; |
| private HostRoleCommandDAO hrcDao = null; |
| private TopologyManager topologyManager = null; |
| |
| @Before |
| public void before() { |
| dao = createStrictMock(StageDAO.class); |
| clusters = createStrictMock(Clusters.class); |
| cluster = createStrictMock(Cluster.class); |
| hrcDao = createStrictMock(HostRoleCommandDAO.class); |
| topologyManager = EasyMock.createNiceMock(TopologyManager.class); |
| |
| expect(topologyManager.getStages()).andReturn(new ArrayList<StageEntity>()).atLeastOnce(); |
| |
| expect(hrcDao.findAggregateCounts(EasyMock.anyObject(Long.class))).andReturn( |
| new HashMap<Long, HostRoleCommandStatusSummaryDTO>() { |
| { |
| put(0L, new HostRoleCommandStatusSummaryDTO(0, 1000L, 2500L, 0, 0, 1, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0)); |
| } |
| }).anyTimes(); |
| |
| replay(hrcDao, topologyManager); |
| |
| managementController = createNiceMock(AmbariManagementController.class); |
| |
| // create an injector which will inject the mocks |
| injector = Guice.createInjector(Modules.override( |
| new InMemoryDefaultTestModule()).with(new MockModule())); |
| |
| Assert.assertNotNull(injector); |
| } |
| |
| |
| @Test |
| public void testCreateResources() throws Exception { |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| |
| Request request = createNiceMock(Request.class); |
| try { |
| provider.createResources(request); |
| fail("Expected UnsupportedOperationException"); |
| } catch (UnsupportedOperationException e) { |
| // expected |
| } |
| } |
| |
| @Test |
| public void testUpdateResources() throws Exception { |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| |
| Request request = createNiceMock(Request.class); |
| Predicate predicate = createNiceMock(Predicate.class); |
| |
| expect(clusters.getClusterById(anyLong())).andReturn(cluster).anyTimes(); |
| expect(request.getProperties()).andReturn(Collections.<Map<String,Object>>emptySet()); |
| |
| replay(clusters, cluster, request, predicate); |
| |
| provider.updateResources(request, predicate); |
| |
| verify(clusters, cluster); |
| } |
| |
| @Test(expected = UnsupportedOperationException.class) |
| public void testDeleteResources() throws Exception { |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| Predicate predicate = createNiceMock(Predicate.class); |
| provider.deleteResources(new RequestImpl(null, null, null, null), predicate); |
| } |
| |
| @Test |
| public void testGetResources() throws Exception { |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| |
| Request request = createNiceMock(Request.class); |
| Predicate predicate = createNiceMock(Predicate.class); |
| |
| List<StageEntity> entities = getStageEntities(HostRoleStatus.COMPLETED); |
| |
| expect(dao.findAll(request, predicate)).andReturn(entities); |
| |
| expect(clusters.getClusterById(anyLong())).andReturn(cluster).anyTimes(); |
| expect(cluster.getClusterName()).andReturn("c1").anyTimes(); |
| |
| replay(dao, clusters, cluster, request, predicate); |
| |
| Set<Resource> resources = provider.getResources(request, predicate); |
| |
| Assert.assertEquals(1, resources.size()); |
| |
| Resource resource = resources.iterator().next(); |
| |
| Assert.assertEquals(100.0, resource.getPropertyValue(StageResourceProvider.STAGE_PROGRESS_PERCENT)); |
| Assert.assertEquals(HostRoleStatus.COMPLETED, resource.getPropertyValue(StageResourceProvider.STAGE_STATUS)); |
| Assert.assertEquals(HostRoleStatus.COMPLETED, resource.getPropertyValue(StageResourceProvider.STAGE_DISPLAY_STATUS)); |
| Assert.assertEquals(1000L, resource.getPropertyValue(StageResourceProvider.STAGE_START_TIME)); |
| Assert.assertEquals(2500L, resource.getPropertyValue(StageResourceProvider.STAGE_END_TIME)); |
| |
| verify(dao, clusters, cluster); |
| } |
| |
| @Test |
| public void testGetResourcesWithRequest() throws Exception { |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| |
| Request request = createNiceMock(Request.class); |
| Predicate predicate = new PredicateBuilder().property(StageResourceProvider.STAGE_REQUEST_ID).equals(1L).toPredicate(); |
| |
| List<StageEntity> entities = getStageEntities(HostRoleStatus.COMPLETED); |
| |
| expect(dao.findAll(request, predicate)).andReturn(entities); |
| |
| expect(clusters.getClusterById(anyLong())).andReturn(cluster).anyTimes(); |
| expect(cluster.getClusterName()).andReturn("c1").anyTimes(); |
| reset(topologyManager); |
| expect(topologyManager.getRequest(EasyMock.anyLong())).andReturn(null).atLeastOnce(); |
| |
| replay(topologyManager, dao, clusters, cluster, request); |
| |
| Set<Resource> resources = provider.getResources(request, predicate); |
| |
| Assert.assertEquals(1, resources.size()); |
| |
| Resource resource = resources.iterator().next(); |
| |
| Assert.assertEquals(100.0, resource.getPropertyValue(StageResourceProvider.STAGE_PROGRESS_PERCENT)); |
| Assert.assertEquals(HostRoleStatus.COMPLETED, resource.getPropertyValue(StageResourceProvider.STAGE_STATUS)); |
| Assert.assertEquals(HostRoleStatus.COMPLETED, resource.getPropertyValue(StageResourceProvider.STAGE_DISPLAY_STATUS)); |
| Assert.assertEquals(1000L, resource.getPropertyValue(StageResourceProvider.STAGE_START_TIME)); |
| Assert.assertEquals(2500L, resource.getPropertyValue(StageResourceProvider.STAGE_END_TIME)); |
| |
| verify(topologyManager, dao, clusters, cluster); |
| } |
| |
| /** |
| * Tests getting the display status of a stage which can differ from the final |
| * status. |
| * |
| * @throws Exception |
| */ |
| @Test |
| public void testGetDisplayStatus() throws Exception { |
| // clear the HRC call so that it has the correct summary fields to represent |
| // 1 skipped and 1 completed task |
| EasyMock.reset(hrcDao); |
| expect(hrcDao.findAggregateCounts(EasyMock.anyObject(Long.class))).andReturn( |
| new HashMap<Long, HostRoleCommandStatusSummaryDTO>() { |
| { |
| put(0L, new HostRoleCommandStatusSummaryDTO(0, 1000L, 2500L, 0, 0, 1, 0, 0, 0, 0, 0, 0, |
| 0, 0, 1)); |
| } |
| }).anyTimes(); |
| |
| replay(hrcDao); |
| |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| |
| Request request = createNiceMock(Request.class); |
| Predicate predicate = createNiceMock(Predicate.class); |
| |
| // make the stage skippable so it resolves to COMPLETED even though it has a |
| // skipped failure |
| List<StageEntity> entities = getStageEntities(HostRoleStatus.SKIPPED_FAILED); |
| entities.get(0).setSkippable(true); |
| |
| expect(dao.findAll(request, predicate)).andReturn(entities); |
| |
| expect(clusters.getClusterById(anyLong())).andReturn(cluster).anyTimes(); |
| expect(cluster.getClusterName()).andReturn("c1").anyTimes(); |
| |
| replay(dao, clusters, cluster, request, predicate); |
| |
| Set<Resource> resources = provider.getResources(request, predicate); |
| |
| Assert.assertEquals(1, resources.size()); |
| |
| Resource resource = resources.iterator().next(); |
| |
| // verify the two statuses |
| Assert.assertEquals(HostRoleStatus.COMPLETED, resource.getPropertyValue(StageResourceProvider.STAGE_STATUS)); |
| Assert.assertEquals(HostRoleStatus.SKIPPED_FAILED, resource.getPropertyValue(StageResourceProvider.STAGE_DISPLAY_STATUS)); |
| |
| verify(dao, clusters, cluster); |
| } |
| |
| |
| @Test |
| @Ignore |
| public void testQueryForResources() throws Exception { |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| |
| Request request = createNiceMock(Request.class); |
| Predicate predicate = createNiceMock(Predicate.class); |
| |
| List<StageEntity> entities = getStageEntities(HostRoleStatus.COMPLETED); |
| |
| expect(dao.findAll(request, predicate)).andReturn(entities); |
| |
| expect(clusters.getClusterById(anyLong())).andReturn(cluster).anyTimes(); |
| expect(cluster.getClusterName()).andReturn("c1").anyTimes(); |
| |
| replay(dao, clusters, cluster, request, predicate); |
| |
| QueryResponse response = provider.queryForResources(request, predicate); |
| |
| Set<Resource> resources = response.getResources(); |
| |
| Assert.assertEquals(1, resources.size()); |
| |
| Assert.assertFalse(response.isSortedResponse()); |
| Assert.assertFalse(response.isPagedResponse()); |
| Assert.assertEquals(1, response.getTotalResourceCount()); |
| |
| verify(dao, clusters, cluster); |
| } |
| |
| @Test |
| public void testUpdateStageStatus_aborted() throws Exception { |
| StageResourceProvider provider = new StageResourceProvider(managementController); |
| ActionManager actionManager = createNiceMock(ActionManager.class); |
| |
| Predicate predicate = new PredicateBuilder().property(StageResourceProvider.STAGE_STAGE_ID).equals(2L).and(). |
| property(StageResourceProvider.STAGE_REQUEST_ID).equals(1L).toPredicate(); |
| |
| Map<String, Object> requestProps = new HashMap<String, Object>(); |
| requestProps.put(StageResourceProvider.STAGE_STATUS, HostRoleStatus.ABORTED.name()); |
| Request request = PropertyHelper.getUpdateRequest(requestProps, null); |
| |
| List<StageEntity> entities = getStageEntities(HostRoleStatus.HOLDING); |
| |
| expect(dao.findAll(request, predicate)).andReturn(entities); |
| expect(managementController.getActionManager()).andReturn(actionManager).anyTimes(); |
| |
| dao.updateStageStatus(entities.get(0), HostRoleStatus.ABORTED, actionManager); |
| EasyMock.expectLastCall().atLeastOnce(); |
| |
| replay(dao, clusters, cluster, actionManager, managementController); |
| |
| provider.updateResources(request, predicate); |
| |
| verify(dao, clusters, cluster, actionManager, managementController); |
| } |
| |
| private List<StageEntity> getStageEntities(HostRoleStatus lastTaskStatus) { |
| StageEntity stage = new StageEntity(); |
| |
| HostRoleCommandEntity task1 = new HostRoleCommandEntity(); |
| task1.setStatus(HostRoleStatus.COMPLETED); |
| task1.setStartTime(1000L); |
| task1.setEndTime(2000L); |
| |
| HostRoleCommandEntity task2 = new HostRoleCommandEntity(); |
| task2.setStatus(lastTaskStatus); |
| task2.setStartTime(1500L); |
| task2.setEndTime(2500L); |
| |
| |
| Collection<HostRoleCommandEntity> tasks = new HashSet<HostRoleCommandEntity>(); |
| tasks.add(task1); |
| tasks.add(task2); |
| |
| stage.setHostRoleCommands(tasks); |
| stage.setRequestId(1L); |
| |
| List<StageEntity> entities = new LinkedList<StageEntity>(); |
| entities.add(stage); |
| return entities; |
| } |
| |
| private class MockModule implements Module { |
| @Override |
| public void configure(Binder binder) { |
| binder.bind(StageDAO.class).toInstance(dao); |
| binder.bind(Clusters.class).toInstance(clusters); |
| binder.bind(Cluster.class).toInstance(cluster); |
| binder.bind(HostRoleCommandDAO.class).toInstance(hrcDao); |
| binder.bind(AmbariManagementController.class).toInstance(managementController); |
| binder.bind(ActionMetadata.class); |
| binder.bind(TopologyManager.class).toInstance(topologyManager); |
| } |
| } |
| } |