blob: d06aa1e4c66fccde4933e48f90f2bc965dec80d9 [file] [log] [blame]
/*
* 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.apache.ambari.server.controller.internal.HostComponentResourceProvider.HOST_COMPONENT_STALE_CONFIGS_PROPERTY_ID;
import org.apache.ambari.server.topology.Blueprint;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.newCapture;
import static org.powermock.api.easymock.PowerMock.createMock;
import static org.powermock.api.easymock.PowerMock.createNiceMock;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.easymock.PowerMock.reset;
import static org.powermock.api.easymock.PowerMock.verify;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.actionmanager.ActionManager;
import org.apache.ambari.server.actionmanager.HostRoleCommand;
import org.apache.ambari.server.actionmanager.HostRoleStatus;
import org.apache.ambari.server.actionmanager.Stage;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.api.services.BaseRequest;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.controller.AmbariServer;
import org.apache.ambari.server.controller.ExecuteActionRequest;
import org.apache.ambari.server.controller.RequestStatusResponse;
import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
import org.apache.ambari.server.controller.spi.Predicate;
import org.apache.ambari.server.controller.spi.Request;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.ResourceProvider;
import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PredicateHelper;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.customactions.ActionDefinition;
import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
import org.apache.ambari.server.orm.dao.HostRoleCommandStatusSummaryDTO;
import org.apache.ambari.server.orm.dao.RequestDAO;
import org.apache.ambari.server.orm.entities.RequestEntity;
import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.security.authorization.AuthorizationException;
import org.apache.ambari.server.security.authorization.AuthorizationHelperInitializer;
import org.apache.ambari.server.security.authorization.RoleAuthorization;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.topology.ClusterTopology;
import org.apache.ambari.server.topology.HostGroupInfo;
import org.apache.ambari.server.topology.LogicalRequest;
import org.apache.ambari.server.topology.TopologyManager;
import org.apache.ambari.server.topology.TopologyRequest;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
/**
* RequestResourceProvider tests.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClusterControllerHelper.class})
public class RequestResourceProviderTest {
private RequestDAO requestDAO;
private HostRoleCommandDAO hrcDAO;
private TopologyManager topologyManager;
@Before
public void before() throws Exception {
requestDAO = createNiceMock(RequestDAO.class);
hrcDAO = createNiceMock(HostRoleCommandDAO.class);
topologyManager = createNiceMock(TopologyManager.class);
reset(topologyManager);
//todo: add assertions for topology manager interactions
expect(topologyManager.getStageSummaries(EasyMock.<Long>anyObject())).andReturn(
Collections.<Long, HostRoleCommandStatusSummaryDTO>emptyMap()).anyTimes();
expect(topologyManager.getRequests(EasyMock.<Collection<Long>>anyObject())).andReturn(
Collections.<LogicalRequest>emptyList()).anyTimes();
replay(topologyManager);
// !!! don't mess with injectors for this test
Field field = RequestResourceProvider.class.getDeclaredField("s_requestDAO");
field.setAccessible(true);
field.set(null, requestDAO);
field = RequestResourceProvider.class.getDeclaredField("s_hostRoleCommandDAO");
field.setAccessible(true);
field.set(null, hrcDAO);
field = RequestResourceProvider.class.getDeclaredField("topologyManager");
field.setAccessible(true);
field.set(null, topologyManager);
AuthorizationHelperInitializer.viewInstanceDAOReturningNull();
}
@After
public void cleanAuthentication() {
SecurityContextHolder.getContext().setAuthentication(null);
}
@Test
public void testCreateResources() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
// replay
replay(managementController, response);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
// 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>>();
Map<String, Object> properties = new LinkedHashMap<String, Object>();
// add properties to the request map
properties.put(RequestResourceProvider.REQUEST_ID_PROPERTY_ID, "Request100");
propertySet.add(properties);
// create the request
Request request = PropertyHelper.getCreateRequest(propertySet, null);
try {
provider.createResources(request);
Assert.fail("Expected an UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// expected
}
// verify
verify(managementController, response);
}
@Test
public void testGetResourcesWithRequestInfo() throws Exception {
Resource.Type type = Resource.Type.Request;
expect(requestDAO.findByPks(Collections.<Long> emptyList(), true)).andReturn(Collections.<RequestEntity>emptyList()).anyTimes();
ActionManager actionManager = createNiceMock(ActionManager.class);
Cluster cluster = createNiceMock(Cluster.class);
expect(cluster.getClusterId()).andReturn(1L).anyTimes();
expect(cluster.getResourceId()).andReturn(4L).anyTimes();
Clusters clusters = createNiceMock(Clusters.class);
expect(clusters.getCluster("foo_cluster")).andReturn(cluster).anyTimes();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
replay(managementController, clusters, cluster);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type,
PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
managementController);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
Request request;
Predicate predicate = new PredicateBuilder()
.property(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID)
.equals("foo_cluster")
.and().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID)
.equals(null)
.and().property(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID)
.equals(null)
.toPredicate();
request = PropertyHelper.getReadRequest(new HashSet<String>(),
requestInfoProperties, null, null, null);
expect(requestDAO.findAllRequestIds(BaseRequest.DEFAULT_PAGE_SIZE, false, 1L)).andReturn(Collections.<Long> emptyList()).anyTimes();
replay(requestDAO);
provider.getResources(request, predicate);
verify(requestDAO);
requestInfoProperties.put(BaseRequest.PAGE_SIZE_PROPERTY_KEY, "20");
request = PropertyHelper.getReadRequest(new HashSet<String>(),
requestInfoProperties, null, null, null);
provider.getResources(request, predicate);
verify(requestDAO);
reset(requestDAO);
requestInfoProperties.put(BaseRequest.ASC_ORDER_PROPERTY_KEY, "true");
request = PropertyHelper.getReadRequest(new HashSet<String>(),
requestInfoProperties, null, null, null);
expect(requestDAO.findByPks(Collections.<Long> emptyList(), true)).andReturn(Collections.<RequestEntity>emptyList()).anyTimes();
expect(requestDAO.findAllRequestIds(BaseRequest.DEFAULT_PAGE_SIZE, true, 1L)).andReturn(Collections.<Long> emptyList()).anyTimes();
replay(requestDAO);
provider.getResources(request, predicate);
verify(requestDAO);
}
@Test
public void testGetResources() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager);
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Collections.singletonList(requestMock)).anyTimes();
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1));
}}).anyTimes();
// replay
replay(managementController, actionManager, requestDAO, hrcDAO, requestMock);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals(100L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
}
// verify
verify(managementController, actionManager, requestDAO, hrcDAO);
}
@Test
public void testGetResourcesWithRequestSchedule() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
expect(requestMock.getRequestScheduleId()).andReturn(11L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager);
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Collections.singletonList(requestMock)).anyTimes();
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1));
}}).anyTimes();
// replay
replay(managementController, actionManager, requestDAO, hrcDAO, requestMock);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_SOURCE_SCHEDULE);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals(100L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(11L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_SOURCE_SCHEDULE_ID));
}
// verify
verify(managementController, actionManager, requestDAO, hrcDAO);
}
@Test
public void testGetResourcesWithoutRequestSchedule() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
expect(requestMock.getRequestScheduleId()).andReturn(null).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager);
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Collections.singletonList(requestMock)).anyTimes();
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1));
}}).anyTimes();
// replay
replay(managementController, actionManager, requestMock, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_SOURCE_SCHEDULE);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals(100L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(null, resource.getPropertyValue(RequestResourceProvider.REQUEST_SOURCE_SCHEDULE));
}
// verify
verify(managementController, actionManager, requestMock, requestDAO, hrcDAO);
}
@Test
public void testGetResourcesWithCluster() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
expect(cluster.getClusterId()).andReturn(50L).anyTimes();
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getClusterId()).andReturn(50L).anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster("c1")).andReturn(cluster).anyTimes();
expect(clusters.getCluster("bad-cluster")).andThrow(new AmbariException("bad cluster!")).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Collections.singletonList(requestMock));
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1));
}}).anyTimes();
// replay
replay(managementController, actionManager, clusters, cluster, requestMock, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
Predicate predicate = new PredicateBuilder().
property(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID).equals("c1").and().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals(100L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
}
// try again with a bad cluster name
predicate = new PredicateBuilder().
property(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID).equals("bad-cluster").and().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
try {
provider.getResources(request, predicate);
} catch (NoSuchParentResourceException e) {
e.printStackTrace();
}
// verify
verify(managementController, actionManager, clusters, cluster, requestMock, requestDAO, hrcDAO);
}
@Test
public void testGetResourcesOrPredicate() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
RequestEntity requestMock1 = createNiceMock(RequestEntity.class);
expect(requestMock1.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock1.getRequestId()).andReturn(101L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).
andReturn(Arrays.asList(requestMock, requestMock1)).anyTimes();
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1));
}}).anyTimes();
// replay
replay(managementController, actionManager, requestMock, requestMock1, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
or().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("101").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(2, resources.size());
for (Resource resource : resources) {
long id = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
Assert.assertTrue(id == 100L || id == 101L);
}
// verify
verify(managementController, actionManager, requestMock, requestMock1, requestDAO, hrcDAO);
}
@Test
public void testGetResourcesCompleted() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
RequestEntity requestMock0 = createNiceMock(RequestEntity.class);
expect(requestMock0.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock0.getRequestId()).andReturn(100L).anyTimes();
RequestEntity requestMock1 = createNiceMock(RequestEntity.class);
expect(requestMock1.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock1.getRequestId()).andReturn(101L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Arrays.asList(requestMock0));
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Arrays.asList(requestMock1));
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().completed(2));
}}).anyTimes();
// replay
replay(managementController, actionManager, requestMock0, requestMock1, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").or().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("101").toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(2, resources.size());
for (Resource resource : resources) {
long id = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
Assert.assertTrue(id == 100L || id == 101L);
Assert.assertEquals("COMPLETED", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_TASK_CNT_ID));
Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID));
Assert.assertEquals(100.0, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
}
// verify
verify(managementController, actionManager, requestMock0, requestMock1, requestDAO, hrcDAO);
}
@Test
public void testGetResourcesInProgress() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
RequestEntity requestMock0 = createNiceMock(RequestEntity.class);
expect(requestMock0.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock0.getRequestId()).andReturn(100L).anyTimes();
RequestEntity requestMock1 = createNiceMock(RequestEntity.class);
expect(requestMock1.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock1.getRequestId()).andReturn(101L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Arrays.asList(requestMock0));
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Arrays.asList(requestMock1));
// IN_PROGRESS and PENDING
expect(hrcDAO.findAggregateCounts(100L)).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>() {{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1).pending(1));
}}).once();
// IN_PROGRESS and QUEUED
expect(hrcDAO.findAggregateCounts(101L)).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1).queued(1));
}}).once();
// replay
replay(managementController, actionManager, requestMock0, requestMock1, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_QUEUED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").or().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("101").toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(2, resources.size());
for (Resource resource : resources) {
long id = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
Assert.assertTrue(id == 100L || id == 101L);
Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_TASK_CNT_ID));
Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
if (id == 100L) {
Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_QUEUED_TASK_CNT_ID));
int progressPercent = ((Double) resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID)).intValue();
Assert.assertEquals(17, progressPercent);
} else {
Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_QUEUED_TASK_CNT_ID));
int progressPercent = ((Double) resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID)).intValue();
Assert.assertEquals(21, progressPercent);
}
Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID));
}
// verify
verify(managementController, actionManager, requestMock0, requestMock1, requestDAO, hrcDAO);
}
@Test
public void testGetResourcesFailed() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
RequestEntity requestMock0 = createNiceMock(RequestEntity.class);
expect(requestMock0.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock0.getRequestId()).andReturn(100L).anyTimes();
RequestEntity requestMock1 = createNiceMock(RequestEntity.class);
expect(requestMock1.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock1.getRequestId()).andReturn(101L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Arrays.asList(requestMock0));
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Arrays.asList(requestMock1));
// FAILED and COMPLETED
expect(hrcDAO.findAggregateCounts(100L)).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().failed(1).completed(1));
}}).once();
// ABORTED and TIMEDOUT
expect(hrcDAO.findAggregateCounts(101L)).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().aborted(1).timedout(1));
}}).once();
// replay
replay(managementController, actionManager, requestMock0, requestMock1, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_ABORTED_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_TIMED_OUT_TASK_CNT_ID);
propertyIds.add(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").or().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("101").toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(2, resources.size());
for (Resource resource : resources) {
long id = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
Assert.assertTrue(id == 100L || id == 101L);
Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_TASK_CNT_ID));
if (id == 100L) {
Assert.assertEquals("FAILED", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_ABORTED_TASK_CNT_ID));
Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_TIMED_OUT_TASK_CNT_ID));
} else {
Assert.assertEquals("TIMEDOUT", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_ABORTED_TASK_CNT_ID));
Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_TIMED_OUT_TASK_CNT_ID));
}
Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID));
Assert.assertEquals(100.0, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
}
// verify
verify(managementController, actionManager, requestMock0, requestMock1, requestDAO, hrcDAO);
}
@Test
public void testUpdateResources_CancelRequest() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
HostRoleCommand hostRoleCommand = createNiceMock(HostRoleCommand.class);
Stage stage = createNiceMock(Stage.class);
Clusters clusters = createNiceMock(Clusters.class);
List<HostRoleCommand> hostRoleCommands = new LinkedList<HostRoleCommand>();
hostRoleCommands.add(hostRoleCommand);
Collection<Stage> stages = new HashSet<Stage>();
stages.add(stage);
org.apache.ambari.server.actionmanager.Request requestMock =
createNiceMock(org.apache.ambari.server.actionmanager.Request.class);
expect(requestMock.getCommands()).andReturn(hostRoleCommands).anyTimes();
expect(requestMock.getStages()).andReturn(stages).anyTimes();
expect(stage.getOrderedHostRoleCommands()).andReturn(hostRoleCommands).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(actionManager.getRequests(capture(requestIdsCapture))).
andReturn(Collections.singletonList(requestMock)).anyTimes();
expect(hostRoleCommand.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS).anyTimes();
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
// replay
replay(managementController, actionManager, hostRoleCommand, clusters, requestMock, response, stage);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
// TEST CASE: Check update request validation (abort reason not specified)
// add the property map to a set for the request.
Map<String, Object> properties = new LinkedHashMap<String, Object>();
// create the request
Request request = PropertyHelper.getUpdateRequest(properties, null);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).
equals("100").toPredicate();
try {
provider.updateResources(request, predicate);
Assert.fail("Expected an java.lang.IllegalArgumentException: Abort reason can not be empty.");
} catch (IllegalArgumentException e) {
// expected
}
// Add abort reason to previous request
properties.put(RequestResourceProvider.REQUEST_ABORT_REASON_PROPERTY_ID, "Some reason");
// TEST CASE: Check update request validation (new state is not specified)
request = PropertyHelper.getUpdateRequest(properties, null);
try {
provider.updateResources(request, predicate);
Assert.fail("Expected an java.lang.IllegalArgumentException: null is wrong value.");
} catch (IllegalArgumentException e) {
// expected
}
// TEST CASE: Check update request validation (new state is wrong)
properties.put(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID, "COMPLETED");
request = PropertyHelper.getUpdateRequest(properties, null);
try {
provider.updateResources(request, predicate);
Assert.fail("Expected an java.lang.IllegalArgumentException: COMPLETED is wrong value. " +
"The only allowed value for updating request status is ABORTED");
} catch (IllegalArgumentException e) {
// expected
}
// TEST CASE: Check update request validation (request is in wrong state)
// Put valid request status
properties.put(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID, "ABORTED");
for (HostRoleStatus status : HostRoleStatus.values()) {
reset(hostRoleCommand);
expect(hostRoleCommand.getStatus()).andReturn(status).anyTimes();
replay(hostRoleCommand);
request = PropertyHelper.getUpdateRequest(properties, null);
if (status == HostRoleStatus.IN_PROGRESS ||
status == HostRoleStatus.PENDING ||
status == HostRoleStatus.HOLDING ||
status == HostRoleStatus.HOLDING_FAILED ||
status == HostRoleStatus.HOLDING_TIMEDOUT ||
status == HostRoleStatus.COMPLETED ||
status == HostRoleStatus.ABORTED ||
status == HostRoleStatus.FAILED ||
status == HostRoleStatus.TIMEDOUT ||
status == HostRoleStatus.QUEUED ||
status == HostRoleStatus.SKIPPED_FAILED) { // the only valid cases
provider.updateResources(request, predicate);
} else { // In other cases, should error out
try {
provider.updateResources(request, predicate);
Assert.fail("Expected an java.lang.IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
}
// verify
verify(managementController, response, stage);
}
@Test
public void testDeleteResources() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
// replay
replay(managementController);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).
equals("Request100").toPredicate();
try {
provider.deleteResources(new RequestImpl(null, null, null, null), predicate);
Assert.fail("Expected an UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// expected
}
// verify
verify(managementController);
}
@Test
public void testCreateResourcesForCommandsAsAdministrator() throws Exception {
testCreateResourcesForCommands(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testCreateResourcesForCommandsAsClusterAdministrator() throws Exception {
testCreateResourcesForCommands(TestAuthenticationFactory.createClusterAdministrator());
}
@Test
public void testCreateResourcesForCommandsAsServiceAdministrator() throws Exception {
testCreateResourcesForCommands(TestAuthenticationFactory.createServiceAdministrator());
}
@Test
public void testCreateResourcesForCommandsAsServiceOperator() throws Exception {
testCreateResourcesForCommands(TestAuthenticationFactory.createServiceOperator());
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesForCommandsAsClusterUser() throws Exception {
testCreateResourcesForCommands(TestAuthenticationFactory.createClusterUser());
}
private void testCreateResourcesForCommands(Authentication authentication) throws Exception {
Resource.Type type = Resource.Type.Request;
Capture<ExecuteActionRequest> actionRequest = newCapture();
Capture<HashMap<String, String>> propertyMap = newCapture();
Cluster cluster = createMock(Cluster.class);
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(cluster.getResourceId()).andReturn(4L).anyTimes();
Clusters clusters = createMock(Clusters.class);
expect(clusters.getCluster("c1")).andReturn(cluster).anyTimes();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.createAction(capture(actionRequest), capture(propertyMap)))
.andReturn(response).anyTimes();
expect(response.getMessage()).andReturn("Message").anyTimes();
// replay
replay(cluster, clusters, managementController, response);
SecurityContextHolder.getContext().setAuthentication(authentication);
// 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>>();
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID, "c1");
Set<Map<String, Object>> filterSet = new HashSet<Map<String, Object>>();
Map<String, Object> filterMap = new HashMap<String, Object>();
filterMap.put(RequestResourceProvider.SERVICE_ID, "HDFS");
filterSet.add(filterMap);
properties.put(RequestResourceProvider.REQUEST_RESOURCE_FILTER_ID, filterSet);
propertySet.add(properties);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
requestInfoProperties.put(RequestResourceProvider.COMMAND_ID, "HDFS_SERVICE_CHECK");
// create the request
Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
provider.createResources(request);
ExecuteActionRequest capturedRequest = actionRequest.getValue();
Assert.assertTrue(actionRequest.hasCaptured());
Assert.assertTrue(capturedRequest.isCommand());
Assert.assertEquals(null, capturedRequest.getActionName());
Assert.assertEquals("HDFS_SERVICE_CHECK", capturedRequest.getCommandName());
Assert.assertNotNull(capturedRequest.getResourceFilters());
Assert.assertEquals(1, capturedRequest.getResourceFilters().size());
RequestResourceFilter capturedResourceFilter = capturedRequest.getResourceFilters().get(0);
Assert.assertEquals("HDFS", capturedResourceFilter.getServiceName());
Assert.assertEquals(null, capturedResourceFilter.getComponentName());
Assert.assertNotNull(capturedResourceFilter.getHostNames());
Assert.assertEquals(0, capturedResourceFilter.getHostNames().size());
Assert.assertEquals(0, actionRequest.getValue().getParameters().size());
}
@Test
public void testCreateResourcesForCommandsWithParamsAsAdministrator() throws Exception {
testCreateResourcesForCommandsWithParams(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testCreateResourcesForCommandsWithParamsAsClusterAdministrator() throws Exception {
testCreateResourcesForCommandsWithParams(TestAuthenticationFactory.createClusterAdministrator());
}
@Test
public void testCreateResourcesForCommandsWithParamsAsServiceAdministrator() throws Exception {
testCreateResourcesForCommandsWithParams(TestAuthenticationFactory.createServiceAdministrator());
}
@Test
public void testCreateResourcesForCommandsWithParamsAsServiceOperator() throws Exception {
testCreateResourcesForCommandsWithParams(TestAuthenticationFactory.createServiceOperator());
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesForCommandsWithParamsAsClusterUser() throws Exception {
testCreateResourcesForCommandsWithParams(TestAuthenticationFactory.createClusterUser());
}
private void testCreateResourcesForCommandsWithParams(Authentication authentication) throws Exception {
Resource.Type type = Resource.Type.Request;
Capture<ExecuteActionRequest> actionRequest = newCapture();
Capture<HashMap<String, String>> propertyMap = newCapture();
Cluster cluster = createMock(Cluster.class);
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(cluster.getResourceId()).andReturn(4L).anyTimes();
Clusters clusters = createMock(Clusters.class);
expect(clusters.getCluster("c1")).andReturn(cluster).anyTimes();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.createAction(capture(actionRequest), capture(propertyMap)))
.andReturn(response).anyTimes();
expect(response.getMessage()).andReturn("Message").anyTimes();
// replay
replay(cluster, clusters, managementController, response);
SecurityContextHolder.getContext().setAuthentication(authentication);
// 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>>();
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID, "c1");
Set<Map<String, Object>> filterSet = new HashSet<Map<String, Object>>();
Map<String, Object> filterMap = new HashMap<String, Object>();
filterMap.put(RequestResourceProvider.SERVICE_ID, "HDFS");
filterMap.put(RequestResourceProvider.HOSTS_ID, "host1,host2,host3");
filterSet.add(filterMap);
properties.put(RequestResourceProvider.REQUEST_RESOURCE_FILTER_ID, filterSet);
propertySet.add(properties);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
requestInfoProperties.put("parameters/param1", "value1");
requestInfoProperties.put("parameters/param2", "value2");
String[] expectedHosts = new String[]{"host1", "host2", "host3"};
Map<String, String> expectedParams = new HashMap<String, String>() {{
put("param1", "value1");
put("param2", "value2");
}};
// create the request
Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
// Neither action nor commands are specified
try {
provider.createResources(request);
} catch (UnsupportedOperationException ex) {
Assert.assertTrue(ex.getMessage().contains("Either command or action must be specified"));
}
// Both action and command are specified
requestInfoProperties.put(RequestResourceProvider.COMMAND_ID, "HDFS_SERVICE_CHECK");
requestInfoProperties.put(RequestResourceProvider.ACTION_ID, "a1");
request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
try {
provider.createResources(request);
} catch (UnsupportedOperationException ex) {
Assert.assertTrue(ex.getMessage().contains("Both command and action cannot be specified"));
}
requestInfoProperties.remove(RequestResourceProvider.ACTION_ID);
request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
provider.createResources(request);
Assert.assertTrue(actionRequest.hasCaptured());
ExecuteActionRequest capturedRequest = actionRequest.getValue();
Assert.assertTrue(capturedRequest.isCommand());
Assert.assertEquals(null, capturedRequest.getActionName());
Assert.assertEquals("HDFS_SERVICE_CHECK", capturedRequest.getCommandName());
Assert.assertEquals(1, capturedRequest.getResourceFilters().size());
RequestResourceFilter capturedResourceFilter = capturedRequest.getResourceFilters().get(0);
Assert.assertEquals("HDFS", capturedResourceFilter.getServiceName());
Assert.assertEquals(null, capturedResourceFilter.getComponentName());
Assert.assertEquals(3, capturedResourceFilter.getHostNames().size());
Assert.assertArrayEquals(expectedHosts, capturedResourceFilter.getHostNames().toArray());
Assert.assertEquals(2, capturedRequest.getParameters().size());
for(String key : expectedParams.keySet()) {
Assert.assertEquals(expectedParams.get(key), capturedRequest.getParameters().get(key));
}
}
@Test
public void testCreateResourcesForCommandWithHostPredicate() throws Exception {
Resource.Type type = Resource.Type.Request;
Capture<ExecuteActionRequest> actionRequest = new Capture<ExecuteActionRequest>();
Capture<HashMap<String, String>> propertyMap = new Capture<HashMap<String, String>>();
Capture<Request> requestCapture = new Capture<>();
Capture<Predicate> predicateCapture = new Capture<>();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
Clusters clusters = createNiceMock(Clusters.class);
expect(managementController.createAction(capture(actionRequest),
capture(propertyMap))).andReturn(response).anyTimes();
expect(response.getMessage()).andReturn("Message").anyTimes();
expect(managementController.getClusters()).andReturn(clusters);
ClusterControllerImpl controller = createNiceMock(ClusterControllerImpl.class);
HostComponentProcessResourceProvider hostComponentProcessResourceProvider = createNiceMock(HostComponentProcessResourceProvider.class);
PowerMock.mockStatic(ClusterControllerHelper.class);
Resource resource = createNiceMock(Resource.class);
expect(ClusterControllerHelper.getClusterController()).andReturn(controller);
expect(controller.ensureResourceProvider(Resource.Type.HostComponent)).andReturn(hostComponentProcessResourceProvider);
expect(hostComponentProcessResourceProvider.getResources(
capture(requestCapture), capture(predicateCapture))).andReturn(Collections.singleton(resource));
// replay
replay(managementController, response, controller,
hostComponentProcessResourceProvider, resource, clusters);
PowerMock.replayAll();
SecurityContextHolder.getContext().setAuthentication(
TestAuthenticationFactory.createAdministrator());
// 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>>();
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID, "c1");
Set<Map<String, Object>> filterSet = new HashSet<Map<String, Object>>();
String predicateProperty = HOST_COMPONENT_STALE_CONFIGS_PROPERTY_ID + "=true";
Map<String, Object> filterMap = new HashMap<String, Object>();
filterMap.put(RequestResourceProvider.HOSTS_PREDICATE, predicateProperty);
filterSet.add(filterMap);
properties.put(RequestResourceProvider.REQUEST_RESOURCE_FILTER_ID, filterSet);
propertySet.add(properties);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
requestInfoProperties.put(RequestResourceProvider.COMMAND_ID, "RESTART");
requestInfoProperties.put(RequestResourceProvider.REQUEST_CONTEXT_ID, "Restart All with Stale Configs");
// create the request
Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
provider.createResources(request);
ExecuteActionRequest capturedRequest = actionRequest.getValue();
Assert.assertTrue(requestCapture.hasCaptured());
Assert.assertTrue(predicateCapture.hasCaptured());
Map<String, Object> predicateProperties = PredicateHelper.getProperties(predicateCapture.getValue());
String propertyIdToAssert = null;
Object propertyValueToAssert = null;
for (Map.Entry<String, Object> predicateEntry : predicateProperties.entrySet()) {
if (predicateEntry.getKey().equals(HOST_COMPONENT_STALE_CONFIGS_PROPERTY_ID)) {
propertyIdToAssert = predicateEntry.getKey();
propertyValueToAssert = predicateEntry.getValue();
}
}
Assert.assertNotNull(propertyIdToAssert);
Assert.assertEquals("true", (String) propertyValueToAssert);
}
@Test
public void testCreateResourcesForCommandsWithOpLvlAsAdministrator() throws Exception {
testCreateResourcesForCommandsWithOpLvl(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testCreateResourcesForCommandsWithOpLvlAsClusterAdministrator() throws Exception {
testCreateResourcesForCommandsWithOpLvl(TestAuthenticationFactory.createClusterAdministrator());
}
@Test
public void testCreateResourcesForCommandsWithOpLvlAsServiceAdministrator() throws Exception {
testCreateResourcesForCommandsWithOpLvl(TestAuthenticationFactory.createServiceAdministrator());
}
@Test
public void testCreateResourcesForCommandsWithOpLvlAsServiceOperator() throws Exception {
testCreateResourcesForCommandsWithOpLvl(TestAuthenticationFactory.createServiceOperator());
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesForCommandsWithOpLvlAsClusterUser() throws Exception {
testCreateResourcesForCommandsWithOpLvl(TestAuthenticationFactory.createClusterUser());
}
private void testCreateResourcesForCommandsWithOpLvl(Authentication authentication) throws Exception {
Resource.Type type = Resource.Type.Request;
Capture<ExecuteActionRequest> actionRequest = newCapture();
Capture<HashMap<String, String>> propertyMap = newCapture();
Cluster cluster = createMock(Cluster.class);
expect(cluster.getClusterId()).andReturn(2L).anyTimes();
expect(cluster.getResourceId()).andReturn(4L).anyTimes();
Clusters clusters = createMock(Clusters.class);
expect(clusters.getCluster("c1")).andReturn(cluster).anyTimes();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.createAction(capture(actionRequest), capture(propertyMap)))
.andReturn(response).anyTimes();
expect(response.getMessage()).andReturn("Message").anyTimes();
// replay
replay(cluster, clusters, managementController, response);
SecurityContextHolder.getContext().setAuthentication(authentication);
// 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>>();
Map<String, Object> properties = new LinkedHashMap<String, Object>();
String c1 = "c1";
String host_component = "HOST_COMPONENT";
String service_id = "HDFS";
String hostcomponent_id = "Namenode";
String host_name = "host1";
properties.put(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID, c1);
Set<Map<String, Object>> filterSet = new HashSet<Map<String, Object>>();
Map<String, Object> filterMap = new HashMap<String, Object>();
filterMap.put(RequestResourceProvider.SERVICE_ID, service_id);
filterMap.put(RequestResourceProvider.HOSTS_ID, host_name);
filterSet.add(filterMap);
properties.put(RequestResourceProvider.REQUEST_RESOURCE_FILTER_ID, filterSet);
propertySet.add(properties);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
requestInfoProperties.put(RequestResourceProvider.COMMAND_ID, "RESTART");
requestInfoProperties.put(RequestOperationLevel.OPERATION_LEVEL_ID,
host_component);
requestInfoProperties.put(RequestOperationLevel.OPERATION_CLUSTER_ID, c1);
requestInfoProperties.put(RequestOperationLevel.OPERATION_SERVICE_ID,
service_id);
requestInfoProperties.put(RequestOperationLevel.OPERATION_HOSTCOMPONENT_ID,
hostcomponent_id);
requestInfoProperties.put(RequestOperationLevel.OPERATION_HOST_NAME,
host_name);
Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
requestInfoProperties.put(RequestOperationLevel.OPERATION_CLUSTER_ID, c1);
// create request in a normal way (positive scenario)
provider.createResources(request);
Assert.assertTrue(actionRequest.hasCaptured());
ExecuteActionRequest capturedRequest = actionRequest.getValue();
RequestOperationLevel level = capturedRequest.getOperationLevel();
Assert.assertEquals(level.getLevel().toString(), "HostComponent");
Assert.assertEquals(level.getClusterName(), c1);
Assert.assertEquals(level.getServiceName(), service_id);
Assert.assertEquals(level.getHostComponentName(), hostcomponent_id);
Assert.assertEquals(level.getHostName(), host_name);
}
@Test
public void testCreateResourcesCheckHostForNonClusterAsAdministrator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createAdministrator(), "check_host",
EnumSet.of(RoleAuthorization.HOST_ADD_DELETE_HOSTS));
}
@Test
public void testCreateResourcesCheckHostForNonClusterAsClusterAdministrator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createClusterAdministrator(), "check_host",
EnumSet.of(RoleAuthorization.HOST_ADD_DELETE_HOSTS));
}
@Test
public void testCreateResourcesCheckHostForNonClusterAsClusterOperator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createClusterOperator(), "check_host",
EnumSet.of(RoleAuthorization.HOST_ADD_DELETE_HOSTS));
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesCheckHostForNonClusterAsServiceAdministrator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createServiceAdministrator(), "check_host",
EnumSet.of(RoleAuthorization.HOST_ADD_DELETE_HOSTS));
}
@Test
public void testCreateResourcesCheckJavaForNonClusterAsAdministrator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createAdministrator(), "check_java", null);
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesCheckJavaForNonClusterAsClusterAdministrator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createClusterAdministrator(), "check_java", null);
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesCheckJavaForNonClusterAsClusterOperator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createClusterOperator(), "check_java", null);
}
@Test(expected = AuthorizationException.class)
public void testCreateResourcesForNonClusterAsServiceAdministrator() throws Exception {
testCreateResourcesForNonCluster(TestAuthenticationFactory.createServiceAdministrator(), "check_java", null);
}
private void testCreateResourcesForNonCluster(Authentication authentication, String actionName, Set<RoleAuthorization> permissions) throws Exception {
Resource.Type type = Resource.Type.Request;
Capture<ExecuteActionRequest> actionRequest = newCapture();
Capture<HashMap<String, String>> propertyMap = newCapture();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
ActionDefinition actionDefinition = createMock(ActionDefinition.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
expect(managementController.createAction(capture(actionRequest), capture(propertyMap)))
.andReturn(response).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(metaInfo).anyTimes();
expect(metaInfo.getActionDefinition(actionName)).andReturn(actionDefinition).anyTimes();
expect(actionDefinition.getPermissions()).andReturn(permissions).anyTimes();
expect(response.getMessage()).andReturn("Message").anyTimes();
// replay
replay(managementController, metaInfo, actionDefinition, response);
// 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>>();
Map<String, Object> properties = new LinkedHashMap<String, Object>();
Set<Map<String, Object>> filterSet = new HashSet<Map<String, Object>>();
Map<String, Object> filterMap = new HashMap<String, Object>();
filterMap.put(RequestResourceProvider.HOSTS_ID, "h1,h2");
filterSet.add(filterMap);
properties.put(RequestResourceProvider.REQUEST_RESOURCE_FILTER_ID, filterSet);
propertySet.add(properties);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
requestInfoProperties.put(RequestResourceProvider.ACTION_ID, actionName);
SecurityContextHolder.getContext().setAuthentication(authentication);
// create the request
Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
provider.createResources(request);
ExecuteActionRequest capturedRequest = actionRequest.getValue();
Assert.assertTrue(actionRequest.hasCaptured());
Assert.assertFalse("expected an action", capturedRequest.isCommand());
Assert.assertEquals(actionName, capturedRequest.getActionName());
Assert.assertEquals(null, capturedRequest.getCommandName());
Assert.assertNotNull(capturedRequest.getResourceFilters());
Assert.assertEquals(1, capturedRequest.getResourceFilters().size());
RequestResourceFilter capturedResourceFilter = capturedRequest.getResourceFilters().get(0);
Assert.assertEquals(null, capturedResourceFilter.getServiceName());
Assert.assertEquals(null, capturedResourceFilter.getComponentName());
Assert.assertNotNull(capturedResourceFilter.getHostNames());
Assert.assertEquals(2, capturedResourceFilter.getHostNames().size());
Assert.assertEquals(0, actionRequest.getValue().getParameters().size());
}
@Test
public void testGetResourcesWithoutCluster() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
Clusters clusters = createNiceMock(Clusters.class);
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster(anyObject(String.class))).andReturn(null).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Collections.singletonList(requestMock));
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
put(1L, HostRoleCommandStatusSummaryDTO.create().inProgress(1));
}}).anyTimes();
// replay
replay(managementController, actionManager, clusters, requestMock, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
Predicate predicate = new PredicateBuilder().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals(100L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID));
}
// verify
verify(managementController, actionManager, clusters, requestMock, requestDAO, hrcDAO);
}
@Test
public void testRequestStatusWithNoTasks() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
Clusters clusters = createNiceMock(Clusters.class);
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = newCapture();
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster(anyObject(String.class))).andReturn(null).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Collections.singletonList(requestMock));
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(
Collections.<Long, HostRoleCommandStatusSummaryDTO>emptyMap()).anyTimes();
// replay
replay(managementController, actionManager, clusters, requestMock, requestDAO, hrcDAO);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
propertyIds.add(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID);
Predicate predicate = new PredicateBuilder().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
Set<Resource> resources = provider.getResources(request, predicate);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals(100L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
Assert.assertEquals("COMPLETED", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(100.0, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
}
// verify
verify(managementController, actionManager, clusters, requestMock, requestDAO, hrcDAO);
}
@Test
@PrepareForTest(AmbariServer.class)
public void testGetLogicalRequestStatusWithNoTasks() throws Exception {
// Given
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
Clusters clusters = createNiceMock(Clusters.class);
RequestEntity requestMock = createNiceMock(RequestEntity.class);
expect(requestMock.getRequestContext()).andReturn("this is a context").anyTimes();
expect(requestMock.getRequestId()).andReturn(100L).anyTimes();
Capture<Collection<Long>> requestIdsCapture = Capture.newInstance();
ClusterTopology topology = createNiceMock(ClusterTopology.class);
Blueprint blueprint = createNiceMock(Blueprint.class);
expect(topology.getClusterId()).andReturn(2L).anyTimes();
Long clusterId = 2L;
String clusterName = "cluster1";
Cluster cluster = createNiceMock(Cluster.class);
expect(cluster.getClusterId()).andReturn(clusterId).anyTimes();
expect(cluster.getClusterName()).andReturn(clusterName).anyTimes();
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(clusters.getCluster(eq(clusterName))).andReturn(cluster).anyTimes();
expect(clusters.getClusterById(clusterId)).andReturn(cluster).anyTimes();
expect(requestDAO.findByPks(capture(requestIdsCapture), eq(true))).andReturn(Lists.newArrayList(requestMock));
expect(hrcDAO.findAggregateCounts((Long) anyObject())).andReturn(
Collections.<Long, HostRoleCommandStatusSummaryDTO>emptyMap()).anyTimes();
TopologyRequest topologyRequest = createNiceMock(TopologyRequest.class);
expect(topologyRequest.getHostGroupInfo()).andReturn(Collections.<String, HostGroupInfo>emptyMap()).anyTimes();
expect(topology.getBlueprint()).andReturn(blueprint).anyTimes();
expect(blueprint.shouldSkipFailure()).andReturn(true).anyTimes();
PowerMock.mockStatic(AmbariServer.class);
expect(AmbariServer.getController()).andReturn(managementController).anyTimes();
PowerMock.replayAll(
topologyRequest,
topology,
blueprint,
managementController,
clusters);
LogicalRequest logicalRequest = new LogicalRequest(200L, topologyRequest, topology);
reset(topologyManager);
expect(topologyManager.getRequest(100L)).andReturn(logicalRequest).anyTimes();
expect(topologyManager.getRequests(eq(Collections.singletonList(100L)))).andReturn(
Collections.singletonList(logicalRequest)).anyTimes();
expect(topologyManager.getStageSummaries(EasyMock.<Long>anyObject())).andReturn(
Collections.<Long, HostRoleCommandStatusSummaryDTO>emptyMap()).anyTimes();
replay(actionManager, requestMock, requestDAO, hrcDAO, topologyManager);
ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
type,
PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
managementController);
Set<String> propertyIds = ImmutableSet.of(
RequestResourceProvider.REQUEST_ID_PROPERTY_ID,
RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID,
RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID
);
Predicate predicate = new PredicateBuilder().
property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
toPredicate();
Request request = PropertyHelper.getReadRequest(propertyIds);
// When
Set<Resource> resources = provider.getResources(request, predicate);
// Then
// verify
PowerMock.verifyAll();
verify(actionManager, requestMock, requestDAO, hrcDAO, topologyManager);
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
Assert.assertEquals(100L, (long)(Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
Assert.assertEquals("PENDING", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
Assert.assertEquals(0.0, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
}
}
}