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
           }
         })
       };

Reply via email to