Repository: ambari
Updated Branches:
  refs/heads/trunk 68dd33256 -> 945f35506


AMBARI-6209.  Fix validate_topology=false directive for blueprint create.


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/945f3550
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/945f3550
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/945f3550

Branch: refs/heads/trunk
Commit: 945f355065fab011b747568d8b78deaf02301574
Parents: 68dd332
Author: John Speidel <[email protected]>
Authored: Thu Jun 19 16:23:38 2014 -0400
Committer: John Speidel <[email protected]>
Committed: Thu Jun 19 17:36:39 2014 -0400

----------------------------------------------------------------------
 .../api/resources/BaseResourceDefinition.java   |  24 ++-
 .../resources/BlueprintResourceDefinition.java  |  10 +
 .../api/resources/ResourceDefinition.java       |  10 +
 .../server/api/services/RequestFactory.java     |  67 +++++-
 .../internal/BlueprintResourceProvider.java     |   9 +-
 .../BlueprintResourceDefinitionTest.java        |  11 +
 .../server/api/services/RequestFactoryTest.java | 214 +++++++++++++++++++
 .../internal/BlueprintResourceProviderTest.java |  79 ++++++-
 8 files changed, 408 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
index 1642264..ef92302 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
@@ -30,7 +30,9 @@ import org.apache.ambari.server.controller.spi.Schema;
 import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -88,15 +90,21 @@ public abstract class BaseResourceDefinition implements 
ResourceDefinition {
   }
 
   @Override
+  public Collection<String> getCreateDirectives() {
+    // return a collection which can be modified by sub resources
+    return new HashSet<String>();
+  }
+
+  @Override
   public boolean equals(Object o) {
-      boolean result =false;
-      if(this == o) result = true;
-      if(o instanceof BaseResourceDefinition){
-          BaseResourceDefinition other = (BaseResourceDefinition) o;
-          if(m_type == other.m_type )
-              result = true;
-      }
-      return result;
+    boolean result =false;
+    if(this == o) result = true;
+    if(o instanceof BaseResourceDefinition){
+        BaseResourceDefinition other = (BaseResourceDefinition) o;
+        if(m_type == other.m_type )
+            result = true;
+    }
+    return result;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinition.java
index 7e81a8f..adf9eca 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinition.java
@@ -20,6 +20,8 @@ package org.apache.ambari.server.api.resources;
 
 import org.apache.ambari.server.controller.spi.Resource;
 
+import java.util.Collection;
+
 
 /**
  * Blueprint resource definition.
@@ -42,4 +44,12 @@ public class BlueprintResourceDefinition extends 
BaseResourceDefinition {
   public String getSingularName() {
     return "blueprint";
   }
+
+  @Override
+  public Collection<String> getCreateDirectives() {
+    Collection<String> directives = super.getCreateDirectives();
+    directives.add("validate_topology");
+
+    return directives;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceDefinition.java
index 6a169b1..1e0a4db 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceDefinition.java
@@ -25,6 +25,7 @@ import org.apache.ambari.server.api.util.TreeNode;
 
 import org.apache.ambari.server.api.services.ResultPostProcessor;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
@@ -80,6 +81,15 @@ public interface ResourceDefinition {
   public Renderer getRenderer(String name) throws IllegalArgumentException;
 
   /**
+   * Obtain the set of create directives for the resource.  A create directive 
is
+   * information that can be provided in the query string of a POST operation 
for
+   * the resource.  These directives are not predicates but are put into the
+   * map of request info properties used by the resource provider when creating
+   * the resource.
+   */
+  public Collection<String> getCreateDirectives();
+
+  /**
    * Resource specific result processor.
    * Used to provide resource specific processing of a result.
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestFactory.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestFactory.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestFactory.java
index b516df9..649e210 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestFactory.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestFactory.java
@@ -18,10 +18,15 @@
 
 package org.apache.ambari.server.api.services;
 
+import org.apache.ambari.server.api.resources.ResourceDefinition;
 import org.apache.ambari.server.api.resources.ResourceInstance;
 
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.UriInfo;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Factory for {@link Request} instances.
@@ -47,12 +52,68 @@ public class RequestFactory {
       case DELETE:
         return new DeleteRequest(headers, body, uriInfo, resource);
       case POST:
-        return ((uriInfo.getQueryParameters().isEmpty() && 
body.getQueryString() == null) || body == null) ?
-            new PostRequest(headers, body, uriInfo, resource) :
-            new QueryPostRequest(headers, body, uriInfo, resource);
+        return createPostRequest(headers, body, uriInfo, resource);
       default:
         throw new IllegalArgumentException("Invalid request type: " + 
requestType);
     }
   }
 
+  /**
+   * Create a POST request.  This will either be a standard post request or a 
query post request.
+   * A query post request first applies a query to a collection resource and 
then creates
+   * sub-resources to all matches of the predicate.
+   *
+   * @param headers   http headers
+   * @param uriInfo   uri information
+   * @param resource  associated resource instance
+   *
+   * @return new post request
+   */
+  private Request createPostRequest(HttpHeaders headers, RequestBody body, 
UriInfo uriInfo, ResourceInstance resource) {
+    boolean batchCreate = false;
+    Map<String, String> queryParameters = getQueryParameters(uriInfo, body);
+    if (! queryParameters.isEmpty()) {
+      ResourceDefinition resourceDefinition = resource.getResourceDefinition();
+      Collection<String> directives = resourceDefinition.getCreateDirectives();
+
+      Map<String, String> requestInfoProperties = 
body.getRequestInfoProperties();
+      for (Map.Entry<String, String> entry : queryParameters.entrySet()) {
+        if (directives.contains(entry.getKey())) {
+          requestInfoProperties.put(entry.getKey(), entry.getValue());
+        } else {
+          batchCreate = true;
+        }
+      }
+    }
+
+    return (batchCreate) ?
+        new QueryPostRequest(headers, body, uriInfo, resource) :
+        new PostRequest(headers, body, uriInfo, resource);
+  }
+
+  /**
+   * Gather query parameters from uri and body query string.
+   *
+   * @param uriInfo  contains uri info
+   * @param body     request body
+   *
+   * @return map of query parameters or an empty map if no parameters are 
present
+   */
+  private Map<String, String> getQueryParameters(UriInfo uriInfo, RequestBody 
body) {
+    Map<String, String> queryParameters = new HashMap<String, String>();
+    for (Map.Entry<String, List<String>> entry : 
uriInfo.getQueryParameters().entrySet()) {
+      queryParameters.put(entry.getKey(), entry.getValue().get(0));
+    }
+
+    String bodyQueryString = body.getQueryString();
+    if (bodyQueryString != null && ! bodyQueryString.isEmpty()) {
+      String[] toks = bodyQueryString.split("&");
+      for (String tok : toks) {
+        String[] keyVal = tok.split("=");
+        queryParameters.put(keyVal[0], keyVal.length == 2 ? keyVal[1] : "");
+      }
+    }
+    return queryParameters;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
index 8c99f90..747c7a4 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
@@ -138,7 +138,7 @@ public class BlueprintResourceProvider extends 
BaseBlueprintProcessor {
              ResourceAlreadyExistsException, NoSuchParentResourceException {
 
     for (Map<String, Object> properties : request.getProperties()) {
-      createResources(getCreateCommand(properties));
+      createResources(getCreateCommand(properties, 
request.getRequestInfoProperties()));
     }
     notifyCreate(Resource.Type.Blueprint, request);
 
@@ -522,11 +522,12 @@ public class BlueprintResourceProvider extends 
BaseBlueprintProcessor {
   /**
    * Create a create command with all properties set.
    *
-   * @param properties  properties to be applied to blueprint
+   * @param properties        properties to be applied to blueprint
+   * @param requestInfoProps  request info properties
    *
    * @return a new create command
    */
-  private Command<Void> getCreateCommand(final Map<String, Object> properties) 
{
+  private Command<Void> getCreateCommand(final Map<String, Object> properties, 
final Map<String, String> requestInfoProps) {
     return new Command<Void>() {
       @Override
       public Void invoke() throws AmbariException {
@@ -545,7 +546,7 @@ public class BlueprintResourceProvider extends 
BaseBlueprintProcessor {
                                              missingProperties);
         }
 
-        String validateTopology = (String) properties.get("validate_topology");
+        String validateTopology =  requestInfoProps.get("validate_topology");
         if (validateTopology == null || ! 
validateTopology.equalsIgnoreCase("false")) {
           validateTopology(blueprint);
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinitionTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinitionTest.java
index a4531c3..bfcb822 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinitionTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BlueprintResourceDefinitionTest.java
@@ -22,6 +22,9 @@ import org.apache.ambari.server.controller.spi.Resource;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.Collection;
+import java.util.Set;
+
 /**
  * BlueprintResourceDefinition tests.
  */
@@ -50,4 +53,12 @@ public class BlueprintResourceDefinitionTest {
     BlueprintResourceDefinition definition = new BlueprintResourceDefinition();
     Assert.assertTrue(definition.getSubResourceDefinitions().isEmpty());
   }
+
+  @Test
+  public void testGetCreateDirectives() {
+    BlueprintResourceDefinition definition = new BlueprintResourceDefinition();
+    Collection<String> directives = definition.getCreateDirectives();
+    Assert.assertEquals(1, directives.size());
+    Assert.assertTrue(directives.contains("validate_topology"));
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/test/java/org/apache/ambari/server/api/services/RequestFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/api/services/RequestFactoryTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/api/services/RequestFactoryTest.java
new file mode 100644
index 0000000..5c56670
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/api/services/RequestFactoryTest.java
@@ -0,0 +1,214 @@
+/**
+ * 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.api.services;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriInfo;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.ambari.server.api.resources.ResourceDefinition;
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * RequestFactory unit tests.
+ */
+public class RequestFactoryTest {
+
+  @Test
+  public void testCreate_Post__NoQueryParams() {
+    HttpHeaders headers = createNiceMock(HttpHeaders.class);
+    UriInfo uriInfo = createNiceMock(UriInfo.class);
+    RequestBody body = createStrictMock(RequestBody.class);
+    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+    @SuppressWarnings("unchecked")
+    MultivaluedMap<String, String> mapQueryParams = 
createMock(MultivaluedMap.class);
+
+    //expectations
+    expect(uriInfo.getQueryParameters()).andReturn(mapQueryParams).anyTimes();
+    expect(mapQueryParams.entrySet()).andReturn(Collections.<Map.Entry<String, 
List<String>>>emptySet()).anyTimes();
+    expect(body.getQueryString()).andReturn(null);
+
+    replay(headers, uriInfo, body, resource, mapQueryParams);
+
+    //test
+    RequestFactory factory = new RequestFactory();
+    Request request = factory.createRequest(headers, body, uriInfo, 
Request.Type.POST, resource);
+
+    assertEquals(resource, request.getResource());
+    assertEquals(body, request.getBody());
+    assertEquals(Request.Type.POST, request.getRequestType());
+
+    verify(headers, uriInfo, body, resource, mapQueryParams);
+  }
+
+  @Test
+  // query post : uri contains query string
+  public void testCreate_Post__UriQueryParams() {
+    HttpHeaders headers = createNiceMock(HttpHeaders.class);
+    UriInfo uriInfo = createNiceMock(UriInfo.class);
+    RequestBody body = createNiceMock(RequestBody.class);
+    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+    ResourceDefinition resourceDefinition = 
createNiceMock(ResourceDefinition.class);
+    @SuppressWarnings("unchecked")
+    MultivaluedMap<String, String> mapQueryParams = 
createMock(MultivaluedMap.class);
+    Map<String, List<String>> mapProps = new HashMap<String, List<String>>();
+    mapProps.put("foo", Collections.singletonList("bar"));
+
+
+    //expectations
+    expect(uriInfo.getQueryParameters()).andReturn(mapQueryParams).anyTimes();
+    
expect(mapQueryParams.entrySet()).andReturn(mapProps.entrySet()).anyTimes();
+    
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
+    
expect(resourceDefinition.getCreateDirectives()).andReturn(Collections.<String>emptySet());
+    expect(body.getQueryString()).andReturn(null);
+
+    replay(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+
+    //test
+    RequestFactory factory = new RequestFactory();
+    Request request = factory.createRequest(headers, body, uriInfo, 
Request.Type.POST, resource);
+
+    assertEquals(resource, request.getResource());
+    assertEquals(body, request.getBody());
+    assertEquals(Request.Type.QUERY_POST, request.getRequestType());
+
+    verify(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+  }
+
+  @Test
+  // post with create directive in URI
+  public void testCreate_Post__WithUriDirective() {
+    HttpHeaders headers = createNiceMock(HttpHeaders.class);
+    UriInfo uriInfo = createNiceMock(UriInfo.class);
+    RequestBody body = createNiceMock(RequestBody.class);
+    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+    ResourceDefinition resourceDefinition = 
createNiceMock(ResourceDefinition.class);
+
+    @SuppressWarnings("unchecked")
+    MultivaluedMap<String, String> mapQueryParams = 
createMock(MultivaluedMap.class);
+    Map<String, List<String>> mapProps = new HashMap<String, List<String>>();
+    mapProps.put("foo", Collections.singletonList("bar"));
+
+    Map<String, String> requestInfoMap = new HashMap<String, String>();
+
+    //expectations
+    expect(uriInfo.getQueryParameters()).andReturn(mapQueryParams).anyTimes();
+    
expect(mapQueryParams.entrySet()).andReturn(mapProps.entrySet()).anyTimes();
+    
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
+    
expect(resourceDefinition.getCreateDirectives()).andReturn(Collections.singleton("foo"));
+    expect(body.getQueryString()).andReturn(null);
+    
expect(body.getRequestInfoProperties()).andReturn(requestInfoMap).anyTimes();
+
+    replay(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+
+    //test
+    RequestFactory factory = new RequestFactory();
+    Request request = factory.createRequest(headers, body, uriInfo, 
Request.Type.POST, resource);
+
+    assertEquals(resource, request.getResource());
+    assertEquals(body, request.getBody());
+    assertEquals(Request.Type.POST, request.getRequestType());
+    assertEquals("bar", requestInfoMap.get("foo"));
+
+    verify(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+  }
+
+  @Test
+  // query post : body contains query string
+  public void testCreate_Post__BodyQueryParams() {
+    HttpHeaders headers = createNiceMock(HttpHeaders.class);
+    UriInfo uriInfo = createNiceMock(UriInfo.class);
+    RequestBody body = createNiceMock(RequestBody.class);
+    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+    ResourceDefinition resourceDefinition = 
createNiceMock(ResourceDefinition.class);
+    @SuppressWarnings("unchecked")
+    MultivaluedMap<String, String> mapQueryParams = 
createMock(MultivaluedMap.class);
+
+    //expectations
+    expect(uriInfo.getQueryParameters()).andReturn(mapQueryParams).anyTimes();
+    expect(mapQueryParams.entrySet()).andReturn(Collections.<Map.Entry<String, 
List<String>>>emptySet()).anyTimes();
+    
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
+    
expect(resourceDefinition.getCreateDirectives()).andReturn(Collections.<String>emptySet());
+    expect(body.getQueryString()).andReturn("foo=bar");
+
+    replay(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+
+    //test
+    RequestFactory factory = new RequestFactory();
+    Request request = factory.createRequest(headers, body, uriInfo, 
Request.Type.POST, resource);
+
+    assertEquals(resource, request.getResource());
+    assertEquals(body, request.getBody());
+    assertEquals(Request.Type.QUERY_POST, request.getRequestType());
+
+    verify(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+  }
+
+  @Test
+  // post with create directive in body
+  public void testCreate_Post__WithBodyDirective() {
+    HttpHeaders headers = createNiceMock(HttpHeaders.class);
+    UriInfo uriInfo = createNiceMock(UriInfo.class);
+    RequestBody body = createNiceMock(RequestBody.class);
+    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+    ResourceDefinition resourceDefinition = 
createNiceMock(ResourceDefinition.class);
+
+    @SuppressWarnings("unchecked")
+    MultivaluedMap<String, String> mapQueryParams = 
createMock(MultivaluedMap.class);
+    Map<String, List<String>> mapProps = new HashMap<String, List<String>>();
+    mapProps.put("foo", Collections.singletonList("bar"));
+
+    Map<String, String> requestInfoMap = new HashMap<String, String>();
+
+    //expectations
+    expect(uriInfo.getQueryParameters()).andReturn(mapQueryParams).anyTimes();
+    expect(mapQueryParams.entrySet()).andReturn(Collections.<Map.Entry<String, 
List<String>>>emptySet()).anyTimes();
+    
expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
+    
expect(resourceDefinition.getCreateDirectives()).andReturn(Collections.singleton("foo"));
+    expect(body.getQueryString()).andReturn("foo=bar");
+    
expect(body.getRequestInfoProperties()).andReturn(requestInfoMap).anyTimes();
+
+    replay(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+
+    //test
+    RequestFactory factory = new RequestFactory();
+    Request request = factory.createRequest(headers, body, uriInfo, 
Request.Type.POST, resource);
+
+    assertEquals(resource, request.getResource());
+    assertEquals(body, request.getBody());
+    assertEquals(Request.Type.POST, request.getRequestType());
+    assertEquals("bar", requestInfoMap.get("foo"));
+
+    verify(headers, uriInfo, body, resource, mapQueryParams, 
resourceDefinition);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/945f3550/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
index 85dbf97..2da3fe5 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
@@ -134,6 +134,73 @@ public class BlueprintResourceProviderTest {
     
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(
         Collections.<StackServiceResponse>emptySet());
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
+    expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
+    expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
+    expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
+        andReturn(serviceComponents).anyTimes();
+    expect(metaInfo.getComponentToService("test-stack-name", 
"test-stack-version", "component1")).
+        andReturn("test-service").anyTimes();
+    expect(metaInfo.getComponentToService("test-stack-name", 
"test-stack-version", "component2")).
+        andReturn("test-service").anyTimes();
+    expect(metaInfo.getRequiredProperties("test-stack-name", 
"test-stack-version", "test-service")).andReturn(
+        Collections.<String, 
org.apache.ambari.server.state.PropertyInfo>emptyMap()).anyTimes();
+    dao.create(capture(entityCapture));
+
+    replay(dao, metaInfo, request, managementController);
+    // end expectations
+
+    ResourceProvider provider = 
AbstractControllerResourceProvider.getResourceProvider(
+        Resource.Type.Blueprint,
+        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
+        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
+        managementController);
+
+    AbstractResourceProviderTest.TestObserver observer = new 
AbstractResourceProviderTest.TestObserver();
+    ((ObservableResourceProvider)provider).addObserver(observer);
+
+    provider.createResources(request);
+
+    ResourceProviderEvent lastEvent = observer.getLastEvent();
+    assertNotNull(lastEvent);
+    assertEquals(Resource.Type.Blueprint, lastEvent.getResourceType());
+    assertEquals(ResourceProviderEvent.Type.Create, lastEvent.getType());
+    assertEquals(request, lastEvent.getRequest());
+    assertNull(lastEvent.getPredicate());
+
+    validateEntity(entityCapture.getValue(), false);
+
+    verify(dao, metaInfo, request, managementController);
+  }
+
+  @Test
+  public void testCreateResources_NoValidation() throws AmbariException, 
ResourceAlreadyExistsException, SystemException,
+      UnsupportedPropertyException, NoSuchParentResourceException {
+
+    AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
+    Request request = createMock(Request.class);
+
+    Map<String, ServiceInfo> services = new HashMap<String, ServiceInfo>();
+    ServiceInfo service = new ServiceInfo();
+    service.setName("test-service");
+    services.put("test-service", service);
+
+    List<ComponentInfo> serviceComponents = new ArrayList<ComponentInfo>();
+    ComponentInfo component1 = new ComponentInfo();
+    component1.setName("component1");
+    ComponentInfo component2 = new ComponentInfo();
+    component2.setName("component2");
+    serviceComponents.add(component1);
+    serviceComponents.add(component2);
+
+    Set<Map<String, Object>> setProperties = getTestProperties();
+
+
+    Capture<BlueprintEntity> entityCapture = new Capture<BlueprintEntity>();
+
+    // set expectations
+    expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>singletonMap("validate_topology", "false"));
     expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
@@ -201,6 +268,7 @@ public class BlueprintResourceProviderTest {
     
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(
         Collections.<StackServiceResponse>emptySet());
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
@@ -327,6 +395,7 @@ public class BlueprintResourceProviderTest {
 
     // set expectations
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
 
     replay(dao, metaInfo, request);
     // end expectations
@@ -367,6 +436,7 @@ public class BlueprintResourceProviderTest {
 
     // set expectations
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
         andReturn(serviceComponents).anyTimes();
@@ -410,6 +480,7 @@ public class BlueprintResourceProviderTest {
 
     // set expectations
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
         andReturn(serviceComponents).anyTimes();
@@ -453,6 +524,7 @@ public class BlueprintResourceProviderTest {
 
     // set expectations
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
         andReturn(serviceComponents).anyTimes();
@@ -495,6 +567,7 @@ public class BlueprintResourceProviderTest {
 
     // set expectations
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
         andReturn(serviceComponents).anyTimes();
@@ -582,6 +655,7 @@ public class BlueprintResourceProviderTest {
         andReturn(Collections.<DependencyInfo>emptyList()).anyTimes();
 
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
@@ -689,6 +763,7 @@ public class BlueprintResourceProviderTest {
         andReturn(Collections.<DependencyInfo>emptyList()).anyTimes();
 
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
@@ -804,6 +879,7 @@ public class BlueprintResourceProviderTest {
         
andReturn(Collections.<DependencyInfo>singletonList(dependencyInfo)).anyTimes();
 
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
@@ -908,6 +984,7 @@ public class BlueprintResourceProviderTest {
         andReturn(Collections.<DependencyInfo>emptyList()).anyTimes();
 
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
@@ -975,6 +1052,7 @@ public class BlueprintResourceProviderTest {
     
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(
         Collections.<StackServiceResponse>emptySet());
     expect(request.getProperties()).andReturn(setProperties);
+    expect(request.getRequestInfoProperties()).andReturn(Collections.<String, 
String>emptyMap());
     expect(dao.findByName(BLUEPRINT_NAME)).andReturn(null);
     expect(metaInfo.getServices("test-stack-name", 
"test-stack-version")).andReturn(services).anyTimes();
     expect(metaInfo.getComponentsByService("test-stack-name", 
"test-stack-version", "test-service")).
@@ -1039,7 +1117,6 @@ public class BlueprintResourceProviderTest {
     setHostGroupProperties.add(mapHostGroupProperties2);
 
     Map<String, Object> mapProperties = new HashMap<String, Object>();
-    mapProperties.put("validate_topology", "true");
     mapProperties.put(BlueprintResourceProvider.BLUEPRINT_NAME_PROPERTY_ID, 
BLUEPRINT_NAME);
     mapProperties.put(BlueprintResourceProvider.STACK_NAME_PROPERTY_ID, 
"test-stack-name");
     mapProperties.put(BlueprintResourceProvider.STACK_VERSION_PROPERTY_ID, 
"test-stack-version");

Reply via email to