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