Updated Branches: refs/heads/trunk 9e3d193f1 -> 8b0e64c51
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/8b0e64c5/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java index 6617509..271187b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java @@ -16,8 +16,19 @@ * limitations under the License. */ + package org.apache.ambari.server.controller.internal; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.persist.PersistService; +import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.actionmanager.ActionDefinition; +import org.apache.ambari.server.actionmanager.ActionManager; +import org.apache.ambari.server.actionmanager.ActionType; +import org.apache.ambari.server.actionmanager.TargetHostType; +import org.apache.ambari.server.controller.ActionResponse; +import org.apache.ambari.server.controller.ActionRequest; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.RequestStatusResponse; import org.apache.ambari.server.controller.spi.Predicate; @@ -26,43 +37,79 @@ 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.orm.GuiceJpaInitializer; +import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; -import java.util.Collections; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Set; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; -import static org.easymock.EasyMock.eq; -/** - * ActionResourceProvider tests. - */ public class ActionResourceProviderTest { + + private Injector injector; + + @Before + public void setup() throws Exception { + InMemoryDefaultTestModule module = new InMemoryDefaultTestModule(); + injector = Guice.createInjector(module); + injector.getInstance(GuiceJpaInitializer.class); + } + + @After + public void teardown() { + injector.getInstance(PersistService.class).stop(); + } + @Test - public void testCreateResources() throws Exception { + public void testGetResources() throws Exception { Resource.Type type = Resource.Type.Action; + ActionManager am = createNiceMock(ActionManager.class); + AmbariManagementController managementController = createNiceMock(AmbariManagementController.class); + expect(managementController.getActionManager()).andReturn(am).anyTimes(); + + List<ActionDefinition> allDefinition = new ArrayList<ActionDefinition>(); + allDefinition.add(new ActionDefinition( + "a1", ActionType.SYSTEM, "fileName", "HDFS", "DATANODE", "Does file exist", TargetHostType.ANY, + Short.valueOf("100"))); + allDefinition.add(new ActionDefinition( + "a2", ActionType.SYSTEM, "fileName", "HDFS", "DATANODE", "Does file exist", TargetHostType.ANY, + Short.valueOf("100"))); + allDefinition.add(new ActionDefinition( + "a3", ActionType.SYSTEM, "fileName", "HDFS", "DATANODE", "Does file exist", TargetHostType.ANY, + Short.valueOf("100"))); + + Set<ActionResponse> allResponse = new HashSet<ActionResponse>(); + for (ActionDefinition definition : allDefinition) { + allResponse.add(new ActionResponse(definition)); + } - AmbariManagementController managementController = createMock(AmbariManagementController.class); - RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); - - Map<String, String> requestProperties = new HashMap<String, String>(); - requestProperties.put("context", "Called from a test"); + ActionDefinition namedDefinition = new ActionDefinition( + "a1", ActionType.SYSTEM, "fileName", "HDFS", "DATANODE", "Does file exist", TargetHostType.ANY, + Short.valueOf("100")); - expect(managementController.createActions(AbstractResourceProviderTest.Matcher.getActionRequestSet( - "Cluster100", "Service100", "Action100"), eq(requestProperties))).andReturn(response); + Set<ActionResponse> nameResponse = new HashSet<ActionResponse>(); + nameResponse.add(new ActionResponse(namedDefinition)); - // replay - replay(managementController, response); + expect(am.getAllActionDefinition()).andReturn(allDefinition).once(); + expect(am.getActionDefinition("a1")).andReturn(namedDefinition).once(); + + replay(managementController, am); ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( type, @@ -70,172 +117,224 @@ public class ActionResourceProviderTest { 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>>(); - - // Service 1: create a map of properties for the request - Map<String, Object> properties = new LinkedHashMap<String, Object>(); + Set<String> propertyIds = new HashSet<String>(); - // add properties to the request map - properties.put(ActionResourceProvider.ACTION_CLUSTER_NAME_PROPERTY_ID, "Cluster100"); - properties.put(ActionResourceProvider.ACTION_SERVICE_NAME_PROPERTY_ID, "Service100"); - properties.put(ActionResourceProvider.ACTION_ACTION_NAME_PROPERTY_ID, "Action100"); + propertyIds.add(ActionResourceProvider.ACTION_NAME_PROPERTY_ID); + propertyIds.add(ActionResourceProvider.ACTION_TYPE_PROPERTY_ID); + propertyIds.add(ActionResourceProvider.DEFAULT_TIMEOUT_PROPERTY_ID); + propertyIds.add(ActionResourceProvider.DESCRIPTION_PROPERTY_ID); + propertyIds.add(ActionResourceProvider.INPUTS_PROPERTY_ID); + propertyIds.add(ActionResourceProvider.TARGET_COMPONENT_PROPERTY_ID); + propertyIds.add(ActionResourceProvider.TARGET_HOST_PROPERTY_ID); + propertyIds.add(ActionResourceProvider.TARGET_SERVICE_PROPERTY_ID); - propertySet.add(properties); // create the request - Request request = PropertyHelper.getCreateRequest(propertySet, requestProperties); + Request request = PropertyHelper.getReadRequest(propertyIds); + + // get all ... no predicate + Set<Resource> resources = provider.getResources(request, null); + + Assert.assertEquals(allResponse.size(), resources.size()); + for (Resource resource : resources) { + String actionName = (String) resource.getPropertyValue(ActionResourceProvider.ACTION_NAME_PROPERTY_ID); + String actionType = (String) resource.getPropertyValue(ActionResourceProvider.ACTION_TYPE_PROPERTY_ID); + String defaultTimeout = (String) resource.getPropertyValue(ActionResourceProvider.DEFAULT_TIMEOUT_PROPERTY_ID); + String description = (String) resource.getPropertyValue(ActionResourceProvider.DESCRIPTION_PROPERTY_ID); + String inputs = (String) resource.getPropertyValue(ActionResourceProvider.INPUTS_PROPERTY_ID); + String comp = (String) resource.getPropertyValue(ActionResourceProvider.TARGET_COMPONENT_PROPERTY_ID); + String svc = (String) resource.getPropertyValue(ActionResourceProvider.TARGET_SERVICE_PROPERTY_ID); + String host = (String) resource.getPropertyValue(ActionResourceProvider.TARGET_HOST_PROPERTY_ID); + Assert.assertTrue(allResponse.contains(new ActionResponse(actionName, actionType, + inputs, svc, comp, description, host, defaultTimeout))); + } + + // get actions named a1 + Predicate predicate = + new PredicateBuilder().property(ActionResourceProvider.ACTION_NAME_PROPERTY_ID). + equals("a1").toPredicate(); + resources = provider.getResources(request, predicate); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals("a1", resources.iterator().next(). + getPropertyValue(ActionResourceProvider.ACTION_NAME_PROPERTY_ID)); - provider.createResources(request); // verify - verify(managementController, response); + verify(managementController); } @Test - public void testGetResources() throws Exception { + public void testCreateResources() throws Exception { Resource.Type type = Resource.Type.Action; - AmbariManagementController managementController = createMock(AmbariManagementController.class); + AmbariManagementController managementController = createNiceMock(AmbariManagementController.class); + ActionManager am = createMock(ActionManager.class); + RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); + expect(managementController.getActionManager()).andReturn(am).anyTimes(); + am.createActionDefinition(eq("a1"), eq(ActionType.SYSTEM), eq("fileName"), eq("desc"), eq((String)null), + eq((String)null), eq(TargetHostType.ANY), eq(Short.valueOf("60"))); // replay - replay(managementController); + replay(managementController, am, response); ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( type, PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), managementController); + ((ActionResourceProvider) provider).setEnableExperimental(true); - Set<String> propertyIds = new HashSet<String>(); + AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver(); + + ((ObservableResourceProvider) provider).addObserver(observer); + + // 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>>(); - propertyIds.add(ActionResourceProvider.ACTION_CLUSTER_NAME_PROPERTY_ID); - propertyIds.add(ActionResourceProvider.ACTION_SERVICE_NAME_PROPERTY_ID); - propertyIds.add(ActionResourceProvider.ACTION_ACTION_NAME_PROPERTY_ID); + // Cluster 1: create a map of properties for the request + Map<String, Object> properties = new LinkedHashMap<String, Object>(); + + properties.put(ActionResourceProvider.ACTION_NAME_PROPERTY_ID, "a1"); + properties.put(ActionResourceProvider.ACTION_TYPE_PROPERTY_ID, "SYSTEM"); + properties.put(ActionResourceProvider.TARGET_HOST_PROPERTY_ID, "ANY"); + properties.put(ActionResourceProvider.DESCRIPTION_PROPERTY_ID, "desc"); + properties.put(ActionResourceProvider.INPUTS_PROPERTY_ID, "fileName"); + + propertySet.add(properties); // create the request - Request request = PropertyHelper.getReadRequest(propertyIds); + Request request = PropertyHelper.getCreateRequest(propertySet, null); - // get all ... no predicate - try { - provider.getResources(request, null); - Assert.fail("Expected an UnsupportedOperationException"); - } catch (UnsupportedOperationException e) { - // expected - } + provider.createResources(request); + + ResourceProviderEvent lastEvent = observer.getLastEvent(); + Assert.assertNotNull(lastEvent); + Assert.assertEquals(Resource.Type.Action, lastEvent.getResourceType()); + Assert.assertEquals(ResourceProviderEvent.Type.Create, lastEvent.getType()); + Assert.assertEquals(request, lastEvent.getRequest()); + Assert.assertNull(lastEvent.getPredicate()); // verify - verify(managementController); + verify(managementController, response); } - @Test public void testUpdateResources() throws Exception { Resource.Type type = Resource.Type.Action; - AmbariManagementController managementController = createMock(AmbariManagementController.class); + AmbariManagementController managementController = createNiceMock(AmbariManagementController.class); + ActionManager am = createMock(ActionManager.class); RequestStatusResponse response = createNiceMock(RequestStatusResponse.class); + expect(managementController.getActionManager()).andReturn(am).anyTimes(); + am.updateActionDefinition(eq("a2"), eq((ActionType) null), eq("Updated description"), + eq((TargetHostType) null), eq((Short)null)); + + Map<String, String> mapRequestProps = new HashMap<String, String>(); + mapRequestProps.put("context", "Called from a test"); // replay - replay(managementController, response); + replay(managementController, response, am); ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider( type, PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), managementController); + ((ActionResourceProvider) provider).setEnableExperimental(true); - // add the property map to a set for the request. Map<String, Object> properties = new LinkedHashMap<String, Object>(); + properties.put(ActionResourceProvider.DESCRIPTION_PROPERTY_ID, "Updated description"); + // create the request - Request request = PropertyHelper.getUpdateRequest(properties, null); + Request request = PropertyHelper.getUpdateRequest(properties, mapRequestProps); - Predicate predicate = - new PredicateBuilder().property(ActionResourceProvider.ACTION_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100"). - and().property(ActionResourceProvider.ACTION_SERVICE_NAME_PROPERTY_ID).equals("Service102"). - and().property(ActionResourceProvider.ACTION_ACTION_NAME_PROPERTY_ID).equals("Action100").toPredicate(); - try { - provider.updateResources(request, predicate); - Assert.fail("Expected an UnsupportedOperationException"); - } catch (UnsupportedOperationException e) { - // expected - } + // update the action named a2 + Predicate predicate = new PredicateBuilder().property( + ActionResourceProvider.ACTION_NAME_PROPERTY_ID).equals("a2").toPredicate(); + provider.updateResources(request, predicate); // verify - verify(managementController, response); + verify(managementController, response, am); } @Test - public void testDeleteResources() throws Exception { + public void testEnsureLockedOperations() throws Exception { Resource.Type type = Resource.Type.Action; 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); - Predicate predicate = - new PredicateBuilder().property(ActionResourceProvider.ACTION_ACTION_NAME_PROPERTY_ID).equals("Action100"). - toPredicate(); + Map<String, Object> properties = new LinkedHashMap<String, Object>(); + Map<String, String> mapRequestProps = new HashMap<String, String>(); + mapRequestProps.put("context", "Called from a test"); + // create the request + Request request = PropertyHelper.getUpdateRequest(properties, mapRequestProps); + + Predicate predicate = new PredicateBuilder().property( + ActionResourceProvider.ACTION_NAME_PROPERTY_ID).equals("a2").toPredicate(); try { - provider.deleteResources(predicate); - Assert.fail("Expected an UnsupportedOperationException"); - } catch (UnsupportedOperationException e) { - // expected + provider.updateResources(request, predicate); + Assert.fail("Update call must fail."); + } catch (UnsupportedOperationException ex) { + Assert.assertTrue(ex.getMessage().contains("Not currently supported")); } - // verify - verify(managementController, response); - } - - @Test - public void testCheckPropertyIds() throws Exception { - Set<String> propertyIds = new HashSet<String>(); - propertyIds.add("foo"); - propertyIds.add("cat1/foo"); - propertyIds.add("cat2/bar"); - propertyIds.add("cat2/baz"); - propertyIds.add("cat3/sub1/bam"); - propertyIds.add("cat4/sub2/sub3/bat"); - propertyIds.add("cat5/subcat5/map"); - - Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>(); - - AmbariManagementController managementController = createMock(AmbariManagementController.class); + try { + provider.createResources(request); + Assert.fail("Create call must fail."); + } catch (UnsupportedOperationException ex) { + Assert.assertTrue(ex.getMessage().contains("Not currently supported")); + } - AbstractResourceProvider provider = - (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider( - Resource.Type.Action, - propertyIds, - keyPropertyIds, - managementController); + try { + provider.deleteResources(predicate); + Assert.fail("Delete call must fail."); + } catch (UnsupportedOperationException ex) { + Assert.assertTrue(ex.getMessage().contains("Not currently supported")); + } + } - Set<String> unsupported = provider.checkPropertyIds(Collections.singleton("foo")); - Assert.assertTrue(unsupported.isEmpty()); + public static ActionResourceProvider getActionDefinitionResourceProvider( + AmbariManagementController managementController) { + Resource.Type type = Resource.Type.Action; - // note that key is not in the set of known property ids. We allow it if its parent is a known property. - // this allows for Map type properties where we want to treat the entries as individual properties - Assert.assertTrue(provider.checkPropertyIds(Collections.singleton("cat5/subcat5/map/key")).isEmpty()); + return (ActionResourceProvider) AbstractControllerResourceProvider.getResourceProvider( + type, + PropertyHelper.getPropertyIds(type), + PropertyHelper.getKeyPropertyIds(type), + managementController); + } - unsupported = provider.checkPropertyIds(Collections.singleton("bar")); - Assert.assertEquals(1, unsupported.size()); - Assert.assertTrue(unsupported.contains("bar")); + public static void createAction(AmbariManagementController controller, ActionRequest request) + throws AmbariException { + ActionResourceProvider provider = getActionDefinitionResourceProvider(controller); + provider.createActionDefinition(request); + } - unsupported = provider.checkPropertyIds(Collections.singleton("cat1/foo")); - Assert.assertTrue(unsupported.isEmpty()); + public static Set<ActionResponse> getActions(AmbariManagementController controller, + Set<ActionRequest> requests) + throws AmbariException { + ActionResourceProvider provider = getActionDefinitionResourceProvider(controller); + return provider.getActionDefinitions(requests); + } - unsupported = provider.checkPropertyIds(Collections.singleton("cat1")); - Assert.assertTrue(unsupported.isEmpty()); + public static RequestStatusResponse updateAction(AmbariManagementController controller, + Set<ActionRequest> requests, + Map<String, String> requestProperties) + throws AmbariException { + ActionResourceProvider provider = getActionDefinitionResourceProvider(controller); + return provider.updateActionDefinitions(requests, requestProperties); + } - unsupported = provider.checkPropertyIds(Collections.singleton("parameters/unknown_property")); - Assert.assertTrue(unsupported.isEmpty()); + public static void deleteAction(AmbariManagementController controller, ActionRequest request) + throws AmbariException { + ActionResourceProvider provider = getActionDefinitionResourceProvider(controller); + provider.deleteActionDefinition(request); } } http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/8b0e64c5/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestImplTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestImplTest.java index db35ae8..0ed5d31 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestImplTest.java @@ -149,9 +149,14 @@ public class RequestImplTest { //Action resource properties Assert.assertFalse(validPropertyIds.contains("Action/unsupported_property_id")); - Assert.assertTrue(validPropertyIds.contains("Actions/cluster_name")); - Assert.assertTrue(validPropertyIds.contains("Actions/service_name")); Assert.assertTrue(validPropertyIds.contains("Actions/action_name")); + Assert.assertTrue(validPropertyIds.contains("Actions/action_type")); + Assert.assertTrue(validPropertyIds.contains("Actions/inputs")); + Assert.assertTrue(validPropertyIds.contains("Actions/target_service")); + Assert.assertTrue(validPropertyIds.contains("Actions/target_component")); + Assert.assertTrue(validPropertyIds.contains("Actions/description")); + Assert.assertTrue(validPropertyIds.contains("Actions/target_type")); + Assert.assertTrue(validPropertyIds.contains("Actions/default_timeout")); request = PropertyHelper.getReadRequest(PropertyHelper.getPropertyIds(Resource.Type.Request)); validPropertyIds = request.getPropertyIds(); http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/8b0e64c5/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java index b453934..49f49c6 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java @@ -21,6 +21,7 @@ package org.apache.ambari.server.controller.internal; 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.Predicate; @@ -108,7 +109,7 @@ public class RequestResourceProviderTest { Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>(); Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>(); - Map<Long, String> requestContexts = new HashMap<Long, String>(); + Map<Long, String> requestContexts = new HashMap<Long, String>(); requestContexts.put(100L, "this is a context"); // set expectations @@ -161,7 +162,7 @@ public class RequestResourceProviderTest { Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>(); Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>(); - Map<Long, String> requestContexts = new HashMap<Long, String>(); + Map<Long, String> requestContexts = new HashMap<Long, String>(); requestContexts.put(100L, "this is a context"); // set expectations @@ -223,10 +224,10 @@ public class RequestResourceProviderTest { Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>(); Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>(); - Map<Long, String> requestContexts0 = new HashMap<Long, String>(); + Map<Long, String> requestContexts0 = new HashMap<Long, String>(); requestContexts0.put(100L, "this is a context"); - Map<Long, String> requestContexts1 = new HashMap<Long, String>(); + Map<Long, String> requestContexts1 = new HashMap<Long, String>(); requestContexts1.put(101L, "this is a context"); // set expectations @@ -305,10 +306,10 @@ public class RequestResourceProviderTest { Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>(); Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>(); - Map<Long, String> requestContexts0 = new HashMap<Long, String>(); + Map<Long, String> requestContexts0 = new HashMap<Long, String>(); requestContexts0.put(100L, "this is a context"); - Map<Long, String> requestContexts1 = new HashMap<Long, String>(); + Map<Long, String> requestContexts1 = new HashMap<Long, String>(); requestContexts1.put(101L, "this is a context"); // set expectations @@ -396,10 +397,10 @@ public class RequestResourceProviderTest { Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>(); Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>(); - Map<Long, String> requestContexts0 = new HashMap<Long, String>(); + Map<Long, String> requestContexts0 = new HashMap<Long, String>(); requestContexts0.put(100L, "this is a context"); - Map<Long, String> requestContexts1 = new HashMap<Long, String>(); + Map<Long, String> requestContexts1 = new HashMap<Long, String>(); requestContexts1.put(101L, "this is a context"); // set expectations @@ -529,4 +530,129 @@ public class RequestResourceProviderTest { // 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)); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/8b0e64c5/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ActionDefinitionDAOTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ActionDefinitionDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ActionDefinitionDAOTest.java new file mode 100644 index 0000000..cf87023 --- /dev/null +++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ActionDefinitionDAOTest.java @@ -0,0 +1,137 @@ +/** + * 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.orm.dao; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.persist.PersistService; +import junit.framework.Assert; +import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.Role; +import org.apache.ambari.server.actionmanager.ActionType; +import org.apache.ambari.server.actionmanager.TargetHostType; +import org.apache.ambari.server.orm.GuiceJpaInitializer; +import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +import org.apache.ambari.server.orm.entities.ActionEntity; +import org.apache.ambari.server.state.Service; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import javax.persistence.RollbackException; +import java.util.List; + +public class ActionDefinitionDAOTest { + private Injector injector; + private ActionDefinitionDAO actionDefinitionDAO; + + @Before + public void setup() throws Exception { + injector = Guice.createInjector(new InMemoryDefaultTestModule()); + injector.getInstance(GuiceJpaInitializer.class); + + actionDefinitionDAO = injector.getInstance(ActionDefinitionDAO.class); + } + + @After + public void teardown() throws AmbariException { + injector.getInstance(PersistService.class).stop(); + } + + private ActionEntity createActionDefinition( + String actionName, ActionType actionType, String inputs, String targetService, Role targetComponent, + Short defaultTimeout, String description, TargetHostType targetType, Boolean addToDAO) throws Exception { + ActionEntity actionDefinitionEntity = new ActionEntity(); + + actionDefinitionEntity.setActionName(actionName); + actionDefinitionEntity.setActionType(actionType); + actionDefinitionEntity.setDefaultTimeout(defaultTimeout); + actionDefinitionEntity.setDescription(description); + actionDefinitionEntity.setInputs(inputs); + actionDefinitionEntity.setTargetComponent(targetComponent.toString()); + actionDefinitionEntity.setTargetService(targetService); + actionDefinitionEntity.setTargetType(targetType); + + if (addToDAO) { + actionDefinitionDAO.create(actionDefinitionEntity); + } + + return actionDefinitionEntity; + } + + @Test + public void testFindAll() throws Exception { + createActionDefinition("a1", ActionType.SYSTEM, "fileName", Service.Type.HDFS.toString(), Role.DATANODE, + Short.parseShort("10"), "a1", TargetHostType.ANY, true); + createActionDefinition("a2", ActionType.SYSTEM, "fileName", Service.Type.HDFS.toString(), Role.DATANODE, + Short.parseShort("10"), "a2", TargetHostType.ANY, true); + + List<ActionEntity> actionDefinitionEntities = actionDefinitionDAO.findAll(); + + Assert.assertNotNull(actionDefinitionEntities); + Assert.assertEquals(2, actionDefinitionEntities.size()); + } + + @Test + public void testFindByPK() throws Exception { + createActionDefinition("c1", ActionType.SYSTEM, "fileName", Service.Type.HDFS.toString(), Role.DATANODE, + Short.parseShort("10"), "a1", TargetHostType.ANY, true); + createActionDefinition("c2", ActionType.SYSTEM, "fileName", Service.Type.HDFS.toString(), Role.DATANODE, + Short.parseShort("10"), "a2", TargetHostType.ANY, true); + + ActionEntity actionDefinitionEntity = actionDefinitionDAO.findByPK("c1"); + + Assert.assertNotNull(actionDefinitionEntity); + Assert.assertEquals("c1", actionDefinitionEntity.getActionName()); + } + + @Test + public void testDuplicate() throws Exception { + createActionDefinition("b1", ActionType.SYSTEM, "fileName", Service.Type.HDFS.toString(), Role.DATANODE, + Short.parseShort("10"), "a1", TargetHostType.ANY, true); + try { + createActionDefinition("b1", ActionType.SYSTEM, "fileName", Service.Type.HDFS.toString(), Role.DATANODE, + Short.parseShort("10"), "a1", TargetHostType.ANY, true); + Assert.fail("Should throw exception"); + } catch (RollbackException rbe) { + Assert.assertTrue(rbe.getMessage().contains("duplicate")); + } + } + + @Test + public void testUpdate() throws Exception { + createActionDefinition("d1", ActionType.SYSTEM, "fileName", Service.Type.HDFS.toString(), Role.DATANODE, + Short.parseShort("101"), "a1", TargetHostType.ANY, true); + ActionEntity newOne = createActionDefinition("d1", ActionType.SYSTEM, "fileValue", Service.Type.HDFS.toString(), + Role.DATANODE, Short.parseShort("101"), "a1", TargetHostType.ANY, false); + actionDefinitionDAO.merge(newOne); + ActionEntity actionDefinitionEntity = actionDefinitionDAO.findByPK("d1"); + Assert.assertEquals("fileValue", actionDefinitionEntity.getInputs()); + + actionDefinitionDAO.remove(newOne); + actionDefinitionEntity = actionDefinitionDAO.findByPK("d1"); + Assert.assertNull(actionDefinitionEntity); + } + + @Test + public void testDeleteNonExistent() throws Exception { + ActionEntity newOne = createActionDefinition("d1", ActionType.SYSTEM, "fileValue", Service.Type.HDFS.toString(), + Role.DATANODE, Short.parseShort("101"), "a1", TargetHostType.ANY, false); + actionDefinitionDAO.remove(newOne); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/8b0e64c5/ambari-web/app/controllers/main/host/details.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/host/details.js b/ambari-web/app/controllers/main/host/details.js index e745055..ae24b7e 100644 --- a/ambari-web/app/controllers/main/host/details.js +++ b/ambari-web/app/controllers/main/host/details.js @@ -592,11 +592,12 @@ App.MainHostDetailsController = Em.Controller.extend({ data: JSON.stringify(configsData), timeout: App.timeout, success: function(){ - var actionsUrl = clusterUrl + '/services/HDFS/actions/DECOMMISSION_DATANODE'; + var actionsUrl = clusterUrl + '/requests'; var actionsData = { RequestInfo: { - context: context}, - Body: { + context: context, + command: 'DECOMMISSION_DATANODE', + service_name: 'HDFS', parameters: { excludeFileTag: invocationTag } http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/8b0e64c5/ambari-web/app/utils/ajax.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/ajax.js b/ambari-web/app/utils/ajax.js index 47fdd1e..847ea57 100644 --- a/ambari-web/app/utils/ajax.js +++ b/ambari-web/app/utils/ajax.js @@ -75,14 +75,16 @@ var urls = { } }, 'service.item.smoke': { - 'real': '/clusters/{clusterName}/services/{serviceName}/actions/{actionName}', + 'real': '/clusters/{clusterName}/requests', 'mock': '/data/wizard/deploy/poll_1.json', 'format': function (data) { return { 'type': 'POST', data: JSON.stringify({ RequestInfo: { - "context": data.displayName + " Smoke Test" + "context": data.displayName + " Smoke Test", + "command" : data.actionName, + "service_name" : data.serviceName } }) };
