blob: 016ba59e6ee68bfdb514e9057fdbe70fa0672b78 [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 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.controller.ExecuteActionRequest;
import org.apache.ambari.server.controller.AmbariManagementController;
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.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.easymock.Capture;
import org.junit.Assert;
import org.junit.Test;
import java.util.Collection;
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 static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
/**
* RequestResourceProvider tests.
*/
public class RequestResourceProviderTest {
@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 testGetResources() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
HostRoleCommand hostRoleCommand = createNiceMock(HostRoleCommand.class);
List<HostRoleCommand> hostRoleCommands = new LinkedList<HostRoleCommand>();
hostRoleCommands.add(hostRoleCommand);
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
Map<Long, String> requestContexts = new HashMap<Long, String>();
requestContexts.put(100L, "this is a context");
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager);
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts);
expect(hostRoleCommand.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS);
// replay
replay(managementController, actionManager, hostRoleCommand);
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, hostRoleCommand);
}
@Test
public void testGetResourcesWithCluster() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
HostRoleCommand hostRoleCommand = createNiceMock(HostRoleCommand.class);
Clusters clusters = createNiceMock(Clusters.class);
Cluster cluster = createNiceMock(Cluster.class);
List<HostRoleCommand> hostRoleCommands = new LinkedList<HostRoleCommand>();
hostRoleCommands.add(hostRoleCommand);
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
Map<Long, String> requestContexts = new HashMap<Long, String>();
requestContexts.put(100L, "this is a context");
// 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(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts);
expect(hostRoleCommand.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS);
// replay
replay(managementController, actionManager, hostRoleCommand, clusters, cluster);
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, hostRoleCommand, clusters, cluster);
}
@Test
public void testGetResourcesOrPredicate() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
HostRoleCommand hostRoleCommand = createNiceMock(HostRoleCommand.class);
List<HostRoleCommand> hostRoleCommands = new LinkedList<HostRoleCommand>();
hostRoleCommands.add(hostRoleCommand);
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
Map<Long, String> requestContexts = new HashMap<Long, String>();
requestContexts.put(100L, "this is a context");
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands).anyTimes();
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts).anyTimes();
expect(hostRoleCommand.getRequestId()).andReturn(100L);
expect(hostRoleCommand.getRequestId()).andReturn(101L);
expect(hostRoleCommand.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS).anyTimes();
// replay
replay(managementController, actionManager, hostRoleCommand);
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, hostRoleCommand);
}
@Test
public void testGetResourcesCompleted() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
HostRoleCommand hostRoleCommand0 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand1 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand2 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand3 = createNiceMock(HostRoleCommand.class);
List<HostRoleCommand> hostRoleCommands0 = new LinkedList<HostRoleCommand>();
hostRoleCommands0.add(hostRoleCommand0);
hostRoleCommands0.add(hostRoleCommand1);
List<HostRoleCommand> hostRoleCommands1 = new LinkedList<HostRoleCommand>();
hostRoleCommands1.add(hostRoleCommand2);
hostRoleCommands1.add(hostRoleCommand3);
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
Map<Long, String> requestContexts0 = new HashMap<Long, String>();
requestContexts0.put(100L, "this is a context");
Map<Long, String> requestContexts1 = new HashMap<Long, String>();
requestContexts1.put(101L, "this is a context");
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands0);
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands1);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts0);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts1);
expect(hostRoleCommand0.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand1.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand2.getRequestId()).andReturn(101L).anyTimes();
expect(hostRoleCommand3.getRequestId()).andReturn(101L).anyTimes();
expect(hostRoleCommand0.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
expect(hostRoleCommand1.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
expect(hostRoleCommand2.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
expect(hostRoleCommand3.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
// replay
replay(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
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, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
}
@Test
public void testGetResourcesInProgress() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
HostRoleCommand hostRoleCommand0 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand1 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand2 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand3 = createNiceMock(HostRoleCommand.class);
List<HostRoleCommand> hostRoleCommands0 = new LinkedList<HostRoleCommand>();
hostRoleCommands0.add(hostRoleCommand0);
hostRoleCommands0.add(hostRoleCommand1);
List<HostRoleCommand> hostRoleCommands1 = new LinkedList<HostRoleCommand>();
hostRoleCommands1.add(hostRoleCommand2);
hostRoleCommands1.add(hostRoleCommand3);
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
Map<Long, String> requestContexts0 = new HashMap<Long, String>();
requestContexts0.put(100L, "this is a context");
Map<Long, String> requestContexts1 = new HashMap<Long, String>();
requestContexts1.put(101L, "this is a context");
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands0);
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands1);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts0);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts1);
expect(hostRoleCommand0.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand1.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand2.getRequestId()).andReturn(101L).anyTimes();
expect(hostRoleCommand3.getRequestId()).andReturn(101L).anyTimes();
expect(hostRoleCommand0.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS).anyTimes();
expect(hostRoleCommand1.getStatus()).andReturn(HostRoleStatus.PENDING).anyTimes();
expect(hostRoleCommand2.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS).anyTimes();
expect(hostRoleCommand3.getStatus()).andReturn(HostRoleStatus.QUEUED).anyTimes();
// replay
replay(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
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, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
}
@Test
public void testGetResourcesFailed() throws Exception {
Resource.Type type = Resource.Type.Request;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
ActionManager actionManager = createNiceMock(ActionManager.class);
HostRoleCommand hostRoleCommand0 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand1 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand2 = createNiceMock(HostRoleCommand.class);
HostRoleCommand hostRoleCommand3 = createNiceMock(HostRoleCommand.class);
List<HostRoleCommand> hostRoleCommands0 = new LinkedList<HostRoleCommand>();
hostRoleCommands0.add(hostRoleCommand0);
hostRoleCommands0.add(hostRoleCommand1);
List<HostRoleCommand> hostRoleCommands1 = new LinkedList<HostRoleCommand>();
hostRoleCommands1.add(hostRoleCommand2);
hostRoleCommands1.add(hostRoleCommand3);
Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
Map<Long, String> requestContexts0 = new HashMap<Long, String>();
requestContexts0.put(100L, "this is a context");
Map<Long, String> requestContexts1 = new HashMap<Long, String>();
requestContexts1.put(101L, "this is a context");
// set expectations
expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands0);
expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands1);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts0);
expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts1);
expect(hostRoleCommand0.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand1.getRequestId()).andReturn(100L).anyTimes();
expect(hostRoleCommand2.getRequestId()).andReturn(101L).anyTimes();
expect(hostRoleCommand3.getRequestId()).andReturn(101L).anyTimes();
expect(hostRoleCommand0.getStatus()).andReturn(HostRoleStatus.FAILED).anyTimes();
expect(hostRoleCommand1.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
expect(hostRoleCommand2.getStatus()).andReturn(HostRoleStatus.ABORTED).anyTimes();
expect(hostRoleCommand3.getStatus()).andReturn(HostRoleStatus.TIMEDOUT).anyTimes();
// replay
replay(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
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("ABORTED", 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, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
}
@Test
public void testUpdateResources() 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.
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("Request100").toPredicate();
try {
provider.updateResources(request, predicate);
Assert.fail("Expected an UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// expected
}
// verify
verify(managementController, response);
}
@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(predicate);
Assert.fail("Expected an UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// expected
}
// verify
verify(managementController);
}
@Test
public void testCreateResourcesForCommands() throws Exception {
Resource.Type type = Resource.Type.Request;
Capture<ExecuteActionRequest> actionRequest = new Capture<ExecuteActionRequest>();
Capture<HashMap<String, String>> propertyMap = new Capture<HashMap<String, String>>();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
expect(managementController.createAction(capture(actionRequest), capture(propertyMap)))
.andReturn(response).anyTimes();
// replay
replay(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>();
properties.put(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID, "c1");
propertySet.add(properties);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
requestInfoProperties.put(RequestResourceProvider.SERVICE_NAME_ID, "HDFS");
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);
Assert.assertTrue(actionRequest.hasCaptured());
Assert.assertTrue(actionRequest.getValue().isCommand());
Assert.assertEquals(null, actionRequest.getValue().getActionName());
Assert.assertEquals("HDFS_SERVICE_CHECK", actionRequest.getValue().getCommandName());
Assert.assertEquals("HDFS", actionRequest.getValue().getServiceName());
Assert.assertEquals(null, actionRequest.getValue().getComponentName());
Assert.assertNotNull(actionRequest.getValue().getHosts());
Assert.assertEquals(0, actionRequest.getValue().getHosts().size());
Assert.assertEquals(0, actionRequest.getValue().getParameters().size());
}
@Test
public void testCreateResourcesForCommandsWithParams() throws Exception {
Resource.Type type = Resource.Type.Request;
Capture<ExecuteActionRequest> actionRequest = new Capture<ExecuteActionRequest>();
Capture<HashMap<String, String>> propertyMap = new Capture<HashMap<String, String>>();
AmbariManagementController managementController = createMock(AmbariManagementController.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
expect(managementController.createAction(capture(actionRequest), capture(propertyMap)))
.andReturn(response).anyTimes();
// replay
replay(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>();
properties.put(RequestResourceProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID, "c1");
propertySet.add(properties);
Map<String, String> requestInfoProperties = new HashMap<String, String>();
requestInfoProperties.put(RequestResourceProvider.SERVICE_NAME_ID, "HDFS");
requestInfoProperties.put("/parameters/param1", "value1");
requestInfoProperties.put("/parameters/param2", "value2");
requestInfoProperties.put(RequestResourceProvider.HOSTS_ID, "host1 ,host2, host3 ");
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");
try {
provider.createResources(request);
} catch (UnsupportedOperationException ex) {
Assert.assertTrue(ex.getMessage().contains("Both command and action cannot be specified"));
}
requestInfoProperties.remove(RequestResourceProvider.ACTION_ID);
provider.createResources(request);
Assert.assertTrue(actionRequest.hasCaptured());
Assert.assertTrue(actionRequest.getValue().isCommand());
Assert.assertEquals(null, actionRequest.getValue().getActionName());
Assert.assertEquals("HDFS_SERVICE_CHECK", actionRequest.getValue().getCommandName());
Assert.assertEquals("HDFS", actionRequest.getValue().getServiceName());
Assert.assertEquals(null, actionRequest.getValue().getComponentName());
Assert.assertEquals(3, actionRequest.getValue().getHosts().size());
Assert.assertArrayEquals(expectedHosts, actionRequest.getValue().getHosts().toArray());
Assert.assertEquals(2, actionRequest.getValue().getParameters().size());
for(String key : expectedParams.keySet()) {
Assert.assertEquals(expectedParams.get(key), actionRequest.getValue().getParameters().get(key));
}
}
}