Repository: ambari
Updated Branches:
  refs/heads/trunk 6f67c4f66 -> c9f0dd0b8


http://git-wip-us.apache.org/repos/asf/ambari/blob/c9f0dd0b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java
new file mode 100644
index 0000000..9d4163a
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java
@@ -0,0 +1,870 @@
+/**
+ * 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.topology;
+
+import org.apache.ambari.server.controller.internal.Stack;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.fail;
+
+/**
+ * Blueprint unit tests.
+ */
+public class BlueprintImplTest {
+
+  private static final Map<String, Map<String, Map<String, String>>> 
EMPTY_ATTRIBUTES =
+      new HashMap<String, Map<String, Map<String, String>>>();
+
+  private static final Map<String, Map<String, String>> EMPTY_PROPERTIES =
+      new HashMap<String, Map<String, String>>();
+
+  private static final Configuration EMPTY_CONFIGURATION = new 
Configuration(EMPTY_PROPERTIES, EMPTY_ATTRIBUTES);
+
+
+
+  @Test
+  public void testValidateConfigurations__basic_positive() throws Exception {
+
+    Stack stack = createNiceMock(Stack.class);
+
+    HostGroup group1 = createNiceMock(HostGroup.class);
+    HostGroup group2 = createNiceMock(HostGroup.class);
+    Collection<HostGroup> hostGroups = new HashSet<HostGroup>();
+    hostGroups.add(group1);
+    hostGroups.add(group2);
+
+    Set<String> group1Components = new HashSet<String>();
+    group1Components.add("c1");
+    group1Components.add("c2");
+
+    Set<String> group2Components = new HashSet<String>();
+    group2Components.add("c1");
+    group2Components.add("c3");
+
+    Collection<Stack.ConfigProperty> requiredHDFSProperties = new 
HashSet<Stack.ConfigProperty>();
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", "foo", 
null));
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", "bar", 
null));
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", 
"some_password", null));
+
+    requiredHDFSProperties.add(new Stack.ConfigProperty("category1", "prop1", 
null));
+
+    Collection<Stack.ConfigProperty> requiredService2Properties = new 
HashSet<Stack.ConfigProperty>();
+    requiredService2Properties.add(new Stack.ConfigProperty("category2", 
"prop2", null));
+
+    expect(stack.getServiceForComponent("c1")).andReturn("HDFS").atLeastOnce();
+    expect(stack.getServiceForComponent("c2")).andReturn("HDFS").atLeastOnce();
+    
expect(stack.getServiceForComponent("c3")).andReturn("SERVICE2").atLeastOnce();
+
+    
expect(stack.getRequiredConfigurationProperties("HDFS")).andReturn(requiredHDFSProperties).atLeastOnce();
+    
expect(stack.getRequiredConfigurationProperties("SERVICE2")).andReturn(requiredService2Properties).atLeastOnce();
+
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"foo")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"bar")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"some_password")).andReturn(true).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "category1", 
"prop1")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("SERVICE2", "category2", 
"prop2")).andReturn(false).atLeastOnce();
+
+    
expect(group1.getConfiguration()).andReturn(EMPTY_CONFIGURATION).atLeastOnce();
+    expect(group1.getName()).andReturn("group1").anyTimes();
+    expect(group1.getComponents()).andReturn(group1Components).atLeastOnce();
+
+    
expect(group2.getConfiguration()).andReturn(EMPTY_CONFIGURATION).atLeastOnce();
+    expect(group2.getName()).andReturn("group2").anyTimes();
+    expect(group2.getComponents()).andReturn(group2Components).atLeastOnce();
+
+    replay(stack, group1, group2);
+
+    // Blueprint config
+    Map<String, Map<String, String>> properties = new HashMap<String, 
Map<String, String>>();
+    Map<String, String> hdfsProps = new HashMap<String, String>();
+    properties.put("hdfs-site", hdfsProps);
+    hdfsProps.put("foo", "val");
+    hdfsProps.put("bar", "val");
+
+    Map<String, String> category1Props = new HashMap<String, String>();
+    properties.put("category1", category1Props);
+    category1Props.put("prop1", "val");
+
+    Map<String, String> category2Props = new HashMap<String, String>();
+    properties.put("category2", category2Props);
+    category2Props.put("prop2", "val");
+
+    Map<String, Map<String, Map<String, String>>> attributes = new 
HashMap<String, Map<String, Map<String, String>>>();
+    // for this basic test not ensuring that stack properties are ignored, 
this is tested in another test
+    Configuration configuration = new Configuration(properties, attributes, 
EMPTY_CONFIGURATION);
+
+    Blueprint blueprint = new BlueprintImpl("test", hostGroups, stack, 
configuration);
+    blueprint.validateRequiredProperties();
+
+    verify(stack, group1, group2);
+  }
+
+  @Test
+  public void testValidateConfigurations__basic_negative() throws Exception {
+
+    Stack stack = createNiceMock(Stack.class);
+
+    HostGroup group1 = createNiceMock(HostGroup.class);
+    HostGroup group2 = createNiceMock(HostGroup.class);
+    Collection<HostGroup> hostGroups = new HashSet<HostGroup>();
+    hostGroups.add(group1);
+    hostGroups.add(group2);
+
+    Set<String> group1Components = new HashSet<String>();
+    group1Components.add("c1");
+    group1Components.add("c2");
+
+    Set<String> group2Components = new HashSet<String>();
+    group2Components.add("c1");
+    group2Components.add("c3");
+
+    Collection<Stack.ConfigProperty> requiredHDFSProperties = new 
HashSet<Stack.ConfigProperty>();
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", "foo", 
null));
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", "bar", 
null));
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", 
"some_password", null));
+
+    requiredHDFSProperties.add(new Stack.ConfigProperty("category1", "prop1", 
null));
+
+    Collection<Stack.ConfigProperty> requiredService2Properties = new 
HashSet<Stack.ConfigProperty>();
+    requiredService2Properties.add(new Stack.ConfigProperty("category2", 
"prop2", null));
+
+    expect(stack.getServiceForComponent("c1")).andReturn("HDFS").atLeastOnce();
+    expect(stack.getServiceForComponent("c2")).andReturn("HDFS").atLeastOnce();
+    
expect(stack.getServiceForComponent("c3")).andReturn("SERVICE2").atLeastOnce();
+
+    
expect(stack.getRequiredConfigurationProperties("HDFS")).andReturn(requiredHDFSProperties).atLeastOnce();
+    
expect(stack.getRequiredConfigurationProperties("SERVICE2")).andReturn(requiredService2Properties).atLeastOnce();
+
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"foo")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"bar")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"some_password")).andReturn(true).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "category1", 
"prop1")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("SERVICE2", "category2", 
"prop2")).andReturn(false).atLeastOnce();
+
+    
expect(group1.getConfiguration()).andReturn(EMPTY_CONFIGURATION).atLeastOnce();
+    expect(group1.getName()).andReturn("group1").anyTimes();
+    expect(group1.getComponents()).andReturn(group1Components).atLeastOnce();
+
+    
expect(group2.getConfiguration()).andReturn(EMPTY_CONFIGURATION).atLeastOnce();
+    expect(group2.getName()).andReturn("group2").anyTimes();
+    expect(group2.getComponents()).andReturn(group2Components).atLeastOnce();
+
+    replay(stack, group1, group2);
+
+    // Blueprint config
+    Map<String, Map<String, String>> properties = new HashMap<String, 
Map<String, String>>();
+    Map<String, String> hdfsProps = new HashMap<String, String>();
+    properties.put("hdfs-site", hdfsProps);
+    hdfsProps.put("foo", "val");
+    hdfsProps.put("bar", "val");
+
+    Map<String, String> category1Props = new HashMap<String, String>();
+    properties.put("category1", category1Props);
+    category1Props.put("prop1", "val");
+
+    Map<String, Map<String, Map<String, String>>> attributes = new 
HashMap<String, Map<String, Map<String, String>>>();
+    // for this basic test not ensuring that stack properties are ignored, 
this is tested in another test
+    Configuration configuration = new Configuration(properties, attributes, 
EMPTY_CONFIGURATION);
+
+    Blueprint blueprint = new BlueprintImpl("test", hostGroups, stack, 
configuration);
+    try {
+      blueprint.validateRequiredProperties();
+      fail("Expected exception to be thrown for missing config property");
+    } catch (InvalidTopologyException e) {
+      System.out.println("****" + e.getMessage() + "***");
+    }
+
+    verify(stack, group1, group2);
+  }
+
+  @Test
+  public void testValidateConfigurations__hostGroupConfig() throws Exception {
+
+    Stack stack = createNiceMock(Stack.class);
+
+    HostGroup group1 = createNiceMock(HostGroup.class);
+    HostGroup group2 = createNiceMock(HostGroup.class);
+    Collection<HostGroup> hostGroups = new HashSet<HostGroup>();
+    hostGroups.add(group1);
+    hostGroups.add(group2);
+
+    Set<String> group1Components = new HashSet<String>();
+    group1Components.add("c1");
+    group1Components.add("c2");
+
+    Set<String> group2Components = new HashSet<String>();
+    group2Components.add("c1");
+    group2Components.add("c3");
+
+    Map<String, Map<String, String>> group2Props = new HashMap<String, 
Map<String, String>>();
+    Map<String, String> group2Category2Props = new HashMap<String, String>();
+    group2Props.put("category2", group2Category2Props);
+    group2Category2Props.put("prop2", "val");
+
+    Collection<Stack.ConfigProperty> requiredHDFSProperties = new 
HashSet<Stack.ConfigProperty>();
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", "foo", 
null));
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", "bar", 
null));
+    requiredHDFSProperties.add(new Stack.ConfigProperty("hdfs-site", 
"some_password", null));
+
+    requiredHDFSProperties.add(new Stack.ConfigProperty("category1", "prop1", 
null));
+
+    Collection<Stack.ConfigProperty> requiredService2Properties = new 
HashSet<Stack.ConfigProperty>();
+    requiredService2Properties.add(new Stack.ConfigProperty("category2", 
"prop2", null));
+
+    expect(stack.getServiceForComponent("c1")).andReturn("HDFS").atLeastOnce();
+    expect(stack.getServiceForComponent("c2")).andReturn("HDFS").atLeastOnce();
+    
expect(stack.getServiceForComponent("c3")).andReturn("SERVICE2").atLeastOnce();
+
+    
expect(stack.getRequiredConfigurationProperties("HDFS")).andReturn(requiredHDFSProperties).atLeastOnce();
+    
expect(stack.getRequiredConfigurationProperties("SERVICE2")).andReturn(requiredService2Properties).atLeastOnce();
+
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"foo")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"bar")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "hdfs-site", 
"some_password")).andReturn(true).atLeastOnce();
+    expect(stack.isPasswordProperty("HDFS", "category1", 
"prop1")).andReturn(false).atLeastOnce();
+    expect(stack.isPasswordProperty("SERVICE2", "category2", 
"prop2")).andReturn(false).atLeastOnce();
+
+    
expect(group1.getConfiguration()).andReturn(EMPTY_CONFIGURATION).atLeastOnce();
+    expect(group1.getName()).andReturn("group1").anyTimes();
+    expect(group1.getComponents()).andReturn(group1Components).atLeastOnce();
+
+    expect(group2.getName()).andReturn("group2").anyTimes();
+    expect(group2.getComponents()).andReturn(group2Components).atLeastOnce();
+
+    // Blueprint config
+    Map<String, Map<String, String>> properties = new HashMap<String, 
Map<String, String>>();
+    Map<String, String> hdfsProps = new HashMap<String, String>();
+    properties.put("hdfs-site", hdfsProps);
+    hdfsProps.put("foo", "val");
+    hdfsProps.put("bar", "val");
+
+    Map<String, String> category1Props = new HashMap<String, String>();
+    properties.put("category1", category1Props);
+    category1Props.put("prop1", "val");
+
+    Map<String, Map<String, Map<String, String>>> attributes = new 
HashMap<String, Map<String, Map<String, String>>>();
+    Configuration configuration = new Configuration(properties, attributes, 
EMPTY_CONFIGURATION);
+    // set config for group2 which contains a required property
+    Configuration group2Configuration = new Configuration(group2Props, 
EMPTY_ATTRIBUTES, configuration);
+    
expect(group2.getConfiguration()).andReturn(group2Configuration).atLeastOnce();
+
+    replay(stack, group1, group2);
+
+    Blueprint blueprint = new BlueprintImpl("test", hostGroups, stack, 
configuration);
+    blueprint.validateRequiredProperties();
+
+    verify(stack, group1, group2);
+  }
+
+  //todo: ensure coverage for these existing tests
+
+  //  private void validateEntity(BlueprintEntity entity, boolean 
containsConfig) {
+//    assertEquals(BLUEPRINT_NAME, entity.getBlueprintName());
+//
+//    StackEntity stackEntity = entity.getStack();
+//    assertEquals("test-stack-name", stackEntity.getStackName());
+//    assertEquals("test-stack-version", stackEntity.getStackVersion());
+//
+//    Collection<HostGroupEntity> hostGroupEntities = entity.getHostGroups();
+//
+//    assertEquals(2, hostGroupEntities.size());
+//    for (HostGroupEntity hostGroup : hostGroupEntities) {
+//      assertEquals(BLUEPRINT_NAME, hostGroup.getBlueprintName());
+//      assertNotNull(hostGroup.getBlueprintEntity());
+//      Collection<HostGroupComponentEntity> componentEntities = 
hostGroup.getComponents();
+//      if (hostGroup.getName().equals("group1")) {
+//        assertEquals("1", hostGroup.getCardinality());
+//        assertEquals(2, componentEntities.size());
+//        Iterator<HostGroupComponentEntity> componentIterator = 
componentEntities.iterator();
+//        String name = componentIterator.next().getName();
+//        assertTrue(name.equals("component1") || name.equals("component2"));
+//        String name2 = componentIterator.next().getName();
+//        assertFalse(name.equals(name2));
+//        assertTrue(name2.equals("component1") || name2.equals("component2"));
+//      } else if (hostGroup.getName().equals("group2")) {
+//        assertEquals("2", hostGroup.getCardinality());
+//        assertEquals(1, componentEntities.size());
+//        HostGroupComponentEntity componentEntity = 
componentEntities.iterator().next();
+//        assertEquals("component1", componentEntity.getName());
+//
+//        if (containsConfig) {
+//          Collection<HostGroupConfigEntity> configurations = 
hostGroup.getConfigurations();
+//          assertEquals(1, configurations.size());
+//          HostGroupConfigEntity hostGroupConfigEntity = 
configurations.iterator().next();
+//          assertEquals(BLUEPRINT_NAME, 
hostGroupConfigEntity.getBlueprintName());
+//          assertSame(hostGroup, hostGroupConfigEntity.getHostGroupEntity());
+//          assertEquals("core-site", hostGroupConfigEntity.getType());
+//          Map<String, String> properties = gson.<Map<String, 
String>>fromJson(
+//              hostGroupConfigEntity.getConfigData(), Map.class);
+//          assertEquals(1, properties.size());
+//          assertEquals("anything", properties.get("my.custom.hg.property"));
+//        }
+//      } else {
+//        fail("Unexpected host group name");
+//      }
+//    }
+//    Collection<BlueprintConfigEntity> configurations = 
entity.getConfigurations();
+//    if (containsConfig) {
+//      assertEquals(1, configurations.size());
+//      BlueprintConfigEntity blueprintConfigEntity = 
configurations.iterator().next();
+//      assertEquals(BLUEPRINT_NAME, blueprintConfigEntity.getBlueprintName());
+//      assertSame(entity, blueprintConfigEntity.getBlueprintEntity());
+//      assertEquals("core-site", blueprintConfigEntity.getType());
+//      Map<String, String> properties = gson.<Map<String, String>>fromJson(
+//          blueprintConfigEntity.getConfigData(), Map.class);
+//      assertEquals(2, properties.size());
+//      assertEquals("480", properties.get("fs.trash.interval"));
+//      assertEquals("8500", properties.get("ipc.client.idlethreshold"));
+//    } else {
+//      assertEquals(0, configurations.size());
+//    }
+//  }
+
+
+
+  //  @Test
+//  public void testCreateResource_Validate__Cardinality__ExternalComponent() 
throws Exception {
+//
+//    Set<Map<String, Object>> setProperties = getTestProperties();
+//    setConfigurationProperties(setProperties);
+//    ((Set<Map<String, String>>) 
setProperties.iterator().next().get("configurations")).
+//        add(Collections.singletonMap("global/hive_database", "Existing MySQL 
Database"));
+//
+//    Iterator iter = ((HashSet<Map<String, HashSet<Map<String, String>>>>) 
setProperties.iterator().next().
+//        get(BlueprintResourceProvider.HOST_GROUP_PROPERTY_ID)).
+//        iterator().next().get("components").iterator();
+//    iter.next();
+//    iter.remove();
+//
+//    AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
+//    Capture<Set<StackServiceRequest>> stackServiceRequestCapture = new 
Capture<Set<StackServiceRequest>>();
+//    Capture<Set<StackServiceComponentRequest>> 
serviceComponentRequestCapture = new 
Capture<Set<StackServiceComponentRequest>>();
+//    Capture<StackConfigurationRequest> stackConfigurationRequestCapture = 
new Capture<StackConfigurationRequest>();
+//    Capture<StackLevelConfigurationRequest> 
stackLevelConfigurationRequestCapture = new 
Capture<StackLevelConfigurationRequest>();
+//    Request request = createMock(Request.class);
+//    StackServiceResponse stackServiceResponse = 
createMock(StackServiceResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse = 
createNiceMock(StackServiceComponentResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse2 = 
createNiceMock(StackServiceComponentResponse.class);
+//    Set<StackServiceComponentResponse> setServiceComponents = new 
HashSet<StackServiceComponentResponse>();
+//    setServiceComponents.add(stackServiceComponentResponse);
+//    setServiceComponents.add(stackServiceComponentResponse2);
+//
+//    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("MYSQL_SERVER");
+//    serviceComponents.add(component1);
+//    serviceComponents.add(component2);
+//
+//    Capture<BlueprintEntity> entityCapture = new Capture<BlueprintEntity>();
+//
+//    // set expectations
+//    
expect(blueprintFactory.createBlueprint(setProperties.iterator().next())).andReturn(blueprint).once();
+//    
expect(blueprint.validateRequiredProperties()).andReturn(Collections.<String, 
Map<String, Collection<String>>>emptyMap()).once();
+//    expect(blueprint.toEntity()).andReturn(entity);
+//    expect(blueprint.getName()).andReturn(BLUEPRINT_NAME).atLeastOnce();
+//    
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(
+//        Collections.<StackServiceResponse>singleton(stackServiceResponse));
+//    
expect(stackServiceResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceResponse.getExcludedConfigTypes()).andReturn(Collections.<String>emptySet());
+//
+//    
expect(managementController.getStackComponents(capture(serviceComponentRequestCapture))).andReturn(setServiceComponents).anyTimes();
+//    
expect(stackServiceComponentResponse.getCardinality()).andReturn("2").anyTimes();
+//    
expect(stackServiceComponentResponse.getComponentName()).andReturn("component1").anyTimes();
+//    
expect(stackServiceComponentResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceComponentResponse2.getCardinality()).andReturn("1").anyTimes();
+//    
expect(stackServiceComponentResponse2.getComponentName()).andReturn("MYSQL_SERVER").anyTimes();
+//    
expect(stackServiceComponentResponse2.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//
+//    
expect(managementController.getStackConfigurations(Collections.singleton(capture(stackConfigurationRequestCapture)))).
+//        andReturn(Collections.<StackConfigurationResponse>emptySet());
+//    
expect(managementController.getStackLevelConfigurations(Collections.singleton(capture(stackLevelConfigurationRequestCapture)))).
+//    andReturn(Collections.<StackConfigurationResponse>emptySet());
+//
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "MYSQL_SERVER")).
+//        andReturn(Collections.<DependencyInfo>emptyList()).anyTimes();
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "component1")).
+//        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")).
+//        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.getService("test-stack-name", "test-stack-version", 
"test-service")).andReturn(service).anyTimes();
+//    dao.create(capture(entityCapture));
+//
+//    replay(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//    // 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());
+//
+//    verify(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//  }
+
+//  @Test
+//   public void 
testCreateResource_Validate__Cardinality__MultipleDependencyInstances() throws 
AmbariException, ResourceAlreadyExistsException,
+//      SystemException, UnsupportedPropertyException, 
NoSuchParentResourceException {
+//
+//    Set<Map<String, Object>> setProperties = getTestProperties();
+//    setConfigurationProperties(setProperties);
+//
+//    AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
+//    Capture<Set<StackServiceRequest>> stackServiceRequestCapture = new 
Capture<Set<StackServiceRequest>>();
+//    Capture<Set<StackServiceComponentRequest>> 
serviceComponentRequestCapture = new 
Capture<Set<StackServiceComponentRequest>>();
+//    Capture<StackConfigurationRequest> stackConfigurationRequestCapture = 
new Capture<StackConfigurationRequest>();
+//    Capture<StackLevelConfigurationRequest> 
stackLevelConfigurationRequestCapture = new 
Capture<StackLevelConfigurationRequest>();
+//    Request request = createMock(Request.class);
+//    StackServiceResponse stackServiceResponse = 
createMock(StackServiceResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse = 
createNiceMock(StackServiceComponentResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse2 = 
createNiceMock(StackServiceComponentResponse.class);
+//    Set<StackServiceComponentResponse> setServiceComponents = new 
HashSet<StackServiceComponentResponse>();
+//    setServiceComponents.add(stackServiceComponentResponse);
+//    setServiceComponents.add(stackServiceComponentResponse2);
+//
+//    DependencyInfo dependencyInfo = new DependencyInfo();
+//    AutoDeployInfo autoDeployInfo = new AutoDeployInfo();
+//    autoDeployInfo.setEnabled(false);
+//    dependencyInfo.setAutoDeploy(autoDeployInfo);
+//    dependencyInfo.setScope("cluster");
+//    dependencyInfo.setName("test-service/component1");
+//
+//    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);
+//
+//    Capture<BlueprintEntity> entityCapture = new Capture<BlueprintEntity>();
+//
+//    // set expectations
+//    
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(
+//        Collections.<StackServiceResponse>singleton(stackServiceResponse));
+//    
expect(stackServiceResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceResponse.getExcludedConfigTypes()).andReturn(Collections.<String>emptySet());
+//
+//    
expect(managementController.getStackComponents(capture(serviceComponentRequestCapture))).andReturn(setServiceComponents).anyTimes();
+//    
expect(stackServiceComponentResponse.getCardinality()).andReturn("2").anyTimes();
+//    
expect(stackServiceComponentResponse.getComponentName()).andReturn("component1").anyTimes();
+//    
expect(stackServiceComponentResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceComponentResponse2.getCardinality()).andReturn("1").anyTimes();
+//    
expect(stackServiceComponentResponse2.getComponentName()).andReturn("component2").anyTimes();
+//    
expect(stackServiceComponentResponse2.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//
+//    
expect(managementController.getStackConfigurations(Collections.singleton(capture(stackConfigurationRequestCapture)))).
+//        andReturn(Collections.<StackConfigurationResponse>emptySet());
+//    
expect(managementController.getStackLevelConfigurations(Collections.singleton(capture(stackLevelConfigurationRequestCapture)))).
+//        andReturn(Collections.<StackConfigurationResponse>emptySet());
+//
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "component2")).
+//        
andReturn(Collections.<DependencyInfo>singletonList(dependencyInfo)).anyTimes();
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "component1")).
+//        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")).
+//        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.getService("test-stack-name", "test-stack-version", 
"test-service")).andReturn(service).anyTimes();
+//    dao.create(capture(entityCapture));
+//
+//    replay(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//    // 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());
+//
+//    verify(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//  }
+
+//  @Test
+//  public void testCreateResource_Validate__Cardinality__AutoCommit() throws 
AmbariException, ResourceAlreadyExistsException,
+//      SystemException, UnsupportedPropertyException, 
NoSuchParentResourceException {
+//
+//    Set<Map<String, Object>> setProperties = getTestProperties();
+//    setConfigurationProperties(setProperties);
+//
+//    // remove component2 from BP
+//    Iterator iter = ((HashSet<Map<String, HashSet<Map<String, String>>>>) 
setProperties.iterator().next().
+//        get(BlueprintResourceProvider.HOST_GROUP_PROPERTY_ID)).
+//        iterator().next().get("components").iterator();
+//    iter.next();
+//    iter.remove();
+//
+//    AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
+//    Capture<Set<StackServiceRequest>> stackServiceRequestCapture = new 
Capture<Set<StackServiceRequest>>();
+//    Capture<Set<StackServiceComponentRequest>> 
serviceComponentRequestCapture = new 
Capture<Set<StackServiceComponentRequest>>();
+//    Capture<StackConfigurationRequest> stackConfigurationRequestCapture = 
new Capture<StackConfigurationRequest>();
+//    Capture<StackLevelConfigurationRequest> 
stackLevelConfigurationRequestCapture = new 
Capture<StackLevelConfigurationRequest>();
+//    Request request = createMock(Request.class);
+//    StackServiceResponse stackServiceResponse = 
createMock(StackServiceResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse = 
createNiceMock(StackServiceComponentResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse2 = 
createNiceMock(StackServiceComponentResponse.class);
+//    Set<StackServiceComponentResponse> setServiceComponents = new 
HashSet<StackServiceComponentResponse>();
+//    setServiceComponents.add(stackServiceComponentResponse);
+//    setServiceComponents.add(stackServiceComponentResponse2);
+//
+//    DependencyInfo dependencyInfo = new DependencyInfo();
+//    AutoDeployInfo autoDeployInfo = new AutoDeployInfo();
+//    autoDeployInfo.setEnabled(true);
+//    autoDeployInfo.setCoLocate("test-service/component1");
+//    dependencyInfo.setAutoDeploy(autoDeployInfo);
+//    dependencyInfo.setScope("cluster");
+//    dependencyInfo.setName("test-service/component2");
+//
+//    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);
+//
+//    Capture<BlueprintEntity> entityCapture = new Capture<BlueprintEntity>();
+//
+//    // set expectations
+//    
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(
+//        Collections.<StackServiceResponse>singleton(stackServiceResponse));
+//    
expect(stackServiceResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceResponse.getExcludedConfigTypes()).andReturn(Collections.<String>emptySet());
+//
+//    
expect(managementController.getStackComponents(capture(serviceComponentRequestCapture))).andReturn(setServiceComponents).anyTimes();
+//    
expect(stackServiceComponentResponse.getCardinality()).andReturn("2").anyTimes();
+//    
expect(stackServiceComponentResponse.getComponentName()).andReturn("component1").anyTimes();
+//    
expect(stackServiceComponentResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceComponentResponse2.getCardinality()).andReturn("1").anyTimes();
+//    
expect(stackServiceComponentResponse2.getComponentName()).andReturn("component2").anyTimes();
+//    
expect(stackServiceComponentResponse2.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//
+//    
expect(managementController.getStackConfigurations(Collections.singleton(capture(stackConfigurationRequestCapture)))).
+//        andReturn(Collections.<StackConfigurationResponse>emptySet());
+//    
expect(managementController.getStackLevelConfigurations(Collections.singleton(capture(stackLevelConfigurationRequestCapture)))).
+//        andReturn(Collections.<StackConfigurationResponse>emptySet());
+//
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "component2")).
+//        andReturn(Collections.<DependencyInfo>emptyList()).anyTimes();
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "component1")).
+//        
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")).
+//        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.getService("test-stack-name", "test-stack-version", 
"test-service")).andReturn(service).anyTimes();
+//    dao.create(capture(entityCapture));
+//
+//    replay(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//    // 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());
+//
+//    verify(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//  }
+
+//  @Test
+//  public void testCreateResource_Validate__Cardinality__Fail() throws 
AmbariException, ResourceAlreadyExistsException,
+//      SystemException, UnsupportedPropertyException, 
NoSuchParentResourceException {
+//
+//    Set<Map<String, Object>> setProperties = getTestProperties();
+//    setConfigurationProperties(setProperties);
+//
+//    Iterator iter = ((HashSet<Map<String, HashSet<Map<String, String>>>>) 
setProperties.iterator().next().
+//        get(BlueprintResourceProvider.HOST_GROUP_PROPERTY_ID)).
+//        iterator().next().get("components").iterator();
+//    iter.next();
+//    iter.remove();
+//
+//    AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
+//    Capture<Set<StackServiceRequest>> stackServiceRequestCapture = new 
Capture<Set<StackServiceRequest>>();
+//    Capture<Set<StackServiceComponentRequest>> 
serviceComponentRequestCapture = new 
Capture<Set<StackServiceComponentRequest>>();
+//    Capture<StackConfigurationRequest> stackConfigurationRequestCapture = 
new Capture<StackConfigurationRequest>();
+//    Capture<StackLevelConfigurationRequest> 
stackLevelConfigurationRequestCapture = new 
Capture<StackLevelConfigurationRequest>();
+//    Request request = createMock(Request.class);
+//    StackServiceResponse stackServiceResponse = 
createMock(StackServiceResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse = 
createNiceMock(StackServiceComponentResponse.class);
+//    StackServiceComponentResponse stackServiceComponentResponse2 = 
createNiceMock(StackServiceComponentResponse.class);
+//    Set<StackServiceComponentResponse> setServiceComponents = new 
HashSet<StackServiceComponentResponse>();
+//    setServiceComponents.add(stackServiceComponentResponse);
+//    setServiceComponents.add(stackServiceComponentResponse2);
+//
+//    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("MYSQL_SERVER");
+//    serviceComponents.add(component1);
+//    serviceComponents.add(component2);
+//
+//    // set expectations
+//    
expect(managementController.getStackServices(capture(stackServiceRequestCapture))).andReturn(
+//        Collections.<StackServiceResponse>singleton(stackServiceResponse));
+//    
expect(stackServiceResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceResponse.getExcludedConfigTypes()).andReturn(Collections.<String>emptySet());
+//
+//    
expect(managementController.getStackComponents(capture(serviceComponentRequestCapture))).andReturn(setServiceComponents).anyTimes();
+//    
expect(stackServiceComponentResponse.getCardinality()).andReturn("2").anyTimes();
+//    
expect(stackServiceComponentResponse.getComponentName()).andReturn("component1").anyTimes();
+//    
expect(stackServiceComponentResponse.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//    
expect(stackServiceComponentResponse2.getCardinality()).andReturn("1").anyTimes();
+//    
expect(stackServiceComponentResponse2.getComponentName()).andReturn("MYSQL_SERVER").anyTimes();
+//    
expect(stackServiceComponentResponse2.getServiceName()).andReturn("test-service").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackName()).andReturn("test-stack-name").anyTimes();
+//    
expect(stackServiceComponentResponse2.getStackVersion()).andReturn("test-stack-version").anyTimes();
+//
+//    
expect(managementController.getStackConfigurations(Collections.singleton(capture(stackConfigurationRequestCapture)))).
+//        andReturn(Collections.<StackConfigurationResponse>emptySet());
+//    
expect(managementController.getStackLevelConfigurations(Collections.singleton(capture(stackLevelConfigurationRequestCapture)))).
+//        andReturn(Collections.<StackConfigurationResponse>emptySet());
+//
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "MYSQL_SERVER")).
+//        andReturn(Collections.<DependencyInfo>emptyList()).anyTimes();
+//    expect(metaInfo.getComponentDependencies("test-stack-name", 
"test-stack-version", "test-service", "component1")).
+//        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")).
+//        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.getService("test-stack-name", "test-stack-version", 
"test-service")).andReturn(service).anyTimes();
+//
+//    replay(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//    // 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);
+//
+//    try {
+//      provider.createResources(request);
+//      fail("Expected validation failure for MYSQL_SERVER");
+//    } catch (IllegalArgumentException e) {
+//      // expected
+//    }
+//
+//    verify(dao, metaInfo, request, managementController, 
stackServiceResponse,
+//        stackServiceComponentResponse, stackServiceComponentResponse2);
+//  }
+
+//  @Test
+//  public void testCreateResource_Validate__AmbariServerComponent() throws 
AmbariException, ResourceAlreadyExistsException,
+//      SystemException, UnsupportedPropertyException, 
NoSuchParentResourceException
+//  {
+//    Request request = createMock(Request.class);
+//    AmbariManagementController managementController = 
createMock(AmbariManagementController.class);
+//    Capture<Set<StackServiceRequest>> stackServiceRequestCapture = new 
Capture<Set<StackServiceRequest>>();
+//
+//    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();
+//    ((HashSet<Map<String, String>>) ((HashSet<Map<String, Object>>) 
setProperties.iterator().next().get(
+//        
BlueprintResourceProvider.HOST_GROUP_PROPERTY_ID)).iterator().next().get("components")).
+//        iterator().next().put("name", "AMBARI_SERVER");
+//
+//    Capture<BlueprintEntity> entityCapture = new Capture<BlueprintEntity>();
+//
+//    // set expectations
+//    
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.getService("test-stack-name", "test-stack-version", 
"test-service")).andReturn(service).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());
+//
+//    verify(dao, metaInfo, request, managementController);
+//  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9f0dd0b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
new file mode 100644
index 0000000..eef14a8
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
@@ -0,0 +1,213 @@
+/**
+ * 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.topology;
+
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.notNull;
+import static org.powermock.api.easymock.PowerMock.createNiceMock;
+import static org.powermock.api.easymock.PowerMock.createStrictMock;
+import static org.powermock.api.easymock.PowerMock.replay;
+import static org.powermock.api.easymock.PowerMock.reset;
+import static org.powermock.api.easymock.PowerMock.verify;
+
+/**
+ * Unit tests for ClusterTopologyImpl.
+ */
+@SuppressWarnings("unchecked")
+public class ClusterTopologyImplTest {
+
+  private static final String CLUSTER_NAME = "cluster_name";
+  private static final Blueprint blueprint = createNiceMock(Blueprint.class);
+  private static final Predicate predicate = createNiceMock(Predicate.class);
+  private static final HostGroup group1 = createNiceMock(HostGroup.class);
+  private static final HostGroup group2 = createNiceMock(HostGroup.class);
+  private static final HostGroup group3 = createNiceMock(HostGroup.class);
+  private static final HostGroup group4 = createNiceMock(HostGroup.class);
+  private final Map<String, HostGroupInfo> hostGroupInfoMap = new 
HashMap<String, HostGroupInfo>();
+  private final Map<String, HostGroup> hostGroupMap = new HashMap<String, 
HostGroup>();
+  private final List<TopologyValidator> topologyValidators = new 
ArrayList<TopologyValidator>();
+  private static Configuration configuration;
+
+  @Before
+  public void setUp() {
+
+    configuration = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>());
+
+    HostGroupInfo group1Info = new HostGroupInfo("group1");
+    HostGroupInfo group2Info = new HostGroupInfo("group2");
+    HostGroupInfo group3Info = new HostGroupInfo("group3");
+    HostGroupInfo group4Info = new HostGroupInfo("group4");
+    hostGroupInfoMap.put("group1", group1Info);
+    hostGroupInfoMap.put("group2", group2Info);
+    hostGroupInfoMap.put("group3", group3Info);
+    hostGroupInfoMap.put("group4", group4Info);
+
+    group1Info.setConfiguration(configuration);
+    Collection<String> group1Hosts = new HashSet<String>();
+    group1Hosts.add("host1");
+    group1Hosts.add("host2");
+    group1Info.addHosts(group1Hosts);
+
+    group2Info.setConfiguration(configuration);
+    Collection<String> group2Hosts = new HashSet<String>();
+    group2Hosts.add("host3");
+    group2Info.addHosts(group2Hosts);
+
+    group3Info.setConfiguration(configuration);
+    group3Info.setRequestedCount(5);
+
+    group4Info.setConfiguration(configuration);
+    group4Info.setRequestedCount(5);
+    group4Info.setPredicate(predicate);
+
+    expect(blueprint.getConfiguration()).andReturn(configuration).anyTimes();
+
+    hostGroupMap.put("group1", group1);
+    hostGroupMap.put("group2", group2);
+    hostGroupMap.put("group3", group3);
+    hostGroupMap.put("group4", group4);
+
+    Set<String> group1Components = new HashSet<String>();
+    group1Components.add("component1");
+    group1Components.add("component2");
+    Set<String> group2Components = new HashSet<String>();
+    group2Components.add("component3");
+    Set<String> group3Components = new HashSet<String>();
+    group3Components.add("component4");
+    Set<String> group4Components = new HashSet<String>();
+    group4Components.add("component5");
+
+    expect(blueprint.getHostGroups()).andReturn(hostGroupMap).anyTimes();
+    expect(blueprint.getHostGroup("group1")).andReturn(group1).anyTimes();
+    expect(blueprint.getHostGroup("group2")).andReturn(group2).anyTimes();
+    expect(blueprint.getHostGroup("group3")).andReturn(group3).anyTimes();
+    expect(blueprint.getHostGroup("group4")).andReturn(group4).anyTimes();
+
+    expect(group1.getConfiguration()).andReturn(configuration).anyTimes();
+    expect(group2.getConfiguration()).andReturn(configuration).anyTimes();
+    expect(group3.getConfiguration()).andReturn(configuration).anyTimes();
+    expect(group4.getConfiguration()).andReturn(configuration).anyTimes();
+
+    expect(group1.getComponents()).andReturn(group1Components).anyTimes();
+    expect(group2.getComponents()).andReturn(group2Components).anyTimes();
+    expect(group3.getComponents()).andReturn(group3Components).anyTimes();
+    expect(group4.getComponents()).andReturn(group4Components).anyTimes();
+  }
+
+  @After
+  public void tearDown() {
+    verify(blueprint, predicate, group1, group2, group3, group4);
+    reset(blueprint, predicate, group1, group2, group3, group4);
+
+    topologyValidators.clear();
+    hostGroupInfoMap.clear();
+    hostGroupMap.clear();
+  }
+
+  private void replayAll() {
+    replay(blueprint, predicate, group1, group2, group3, group4);
+  }
+
+  @Test(expected = InvalidTopologyException.class)
+  public void testCreate_validatorFails() throws Exception {
+    TestTopologyRequest request = new TestTopologyRequest();
+
+    TopologyValidator validator = createStrictMock(TopologyValidator.class);
+    topologyValidators.add(validator);
+
+    validator.validate((ClusterTopology) notNull());
+    expectLastCall().andThrow(new InvalidTopologyException("test"));
+
+    replayAll();
+    replay(validator);
+    // should throw exception due to validation failure
+    new ClusterTopologyImpl(request);
+  }
+
+  @Test
+  public void testCreate_validatorSuccess() throws Exception {
+    TestTopologyRequest request = new TestTopologyRequest();
+
+    TopologyValidator validator = createStrictMock(TopologyValidator.class);
+    topologyValidators.add(validator);
+
+    validator.validate((ClusterTopology) notNull());
+
+    replayAll();
+    replay(validator);
+
+    new ClusterTopologyImpl(request);
+  }
+
+  @Test(expected = InvalidTopologyException.class)
+  public void testCreate_duplicateHosts() throws Exception {
+    // add a duplicate host
+    hostGroupInfoMap.get("group2").addHost("host1");
+
+    TestTopologyRequest request = new TestTopologyRequest();
+
+    replayAll();
+    // should throw exception due to duplicate host
+    new ClusterTopologyImpl(request);
+  }
+
+  private class TestTopologyRequest implements TopologyRequest {
+    @Override
+    public String getClusterName() {
+      return CLUSTER_NAME;
+    }
+
+    @Override
+    public Blueprint getBlueprint() {
+      return blueprint;
+    }
+
+    @Override
+    public Configuration getConfiguration() {
+      return configuration;
+    }
+
+    @Override
+    public Map<String, HostGroupInfo> getHostGroupInfo() {
+      return hostGroupInfoMap;
+    }
+
+    @Override
+    public List<TopologyValidator> getTopologyValidators() {
+      return topologyValidators;
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9f0dd0b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurationFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurationFactoryTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurationFactoryTest.java
new file mode 100644
index 0000000..1c2b177
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurationFactoryTest.java
@@ -0,0 +1,150 @@
+/**
+ * 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 distribut
+ * ed 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.topology;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Creates a configuration instance given user specified properties.
+ */
+public class ConfigurationFactoryTest {
+
+  @Test
+  public void testOldSyntax() throws Exception {
+    ConfigurationFactory factory = new ConfigurationFactory();
+    Configuration configuration = 
factory.getConfiguration(getOldSyntaxConfigProps());
+
+    assertEquals(2, configuration.getProperties().size());
+
+    Map<String, String> configProperties1 = 
configuration.getProperties().get("foo-type");
+    assertEquals(2, configProperties1.size());
+    assertEquals("prop1Value", configProperties1.get("prop1"));
+    assertEquals("prop2Value", configProperties1.get("prop2"));
+
+    Map<String, String> configProperties2 = 
configuration.getProperties().get("bar-type");
+    assertEquals(1, configProperties2.size());
+    assertEquals("prop3Value", configProperties2.get("prop3"));
+
+    assertTrue(configuration.getAttributes().isEmpty());
+  }
+
+  @Test
+  public void testNewSyntax() throws Exception {
+    ConfigurationFactory factory = new ConfigurationFactory();
+    Configuration configuration = 
factory.getConfiguration(getNewSyntaxConfigProps());
+
+    // properties
+    Map<String, Map<String, String>> properties = 
configuration.getProperties();
+    assertEquals(2, properties.size());
+
+    Map<String, String> configProperties1 = properties.get("foo-type");
+    assertEquals(2, configProperties1.size());
+    assertEquals("prop1Value", configProperties1.get("prop1"));
+    assertEquals("prop2Value", configProperties1.get("prop2"));
+
+    Map<String, String> configProperties2 = properties.get("bar-type");
+    assertEquals(1, configProperties2.size());
+    assertEquals("prop3Value", configProperties2.get("prop3"));
+
+    // attributes
+    Map<String, Map<String, Map<String, String>>> attributes = 
configuration.getAttributes();
+    assertEquals(2, attributes.size());
+
+    // config type foo
+    Map<String, Map<String, String>> configType1Attributes = 
attributes.get("foo-type");
+    assertEquals(3, configType1Attributes.size());
+    // prop1 attributes
+    Map<String, String> configType1Prop1Attributes = 
configType1Attributes.get("prop1");
+    assertEquals(2, configType1Prop1Attributes.size());
+    assertEquals("attribute1-prop1-value", 
configType1Prop1Attributes.get("attribute1"));
+    assertEquals("attribute2-prop1-value", 
configType1Prop1Attributes.get("attribute2"));
+    // prop2 attributes
+    Map<String, String> configType1Prop2Attributes = 
configType1Attributes.get("prop2");
+    assertEquals(1, configType1Prop2Attributes.size());
+    assertEquals("attribute1-prop2-value", 
configType1Prop2Attributes.get("attribute1"));
+    // prop3 attributes
+    Map<String, String> configType1Prop3Attributes = 
configType1Attributes.get("prop3");
+    assertEquals(1, configType1Prop3Attributes.size());
+    assertEquals("attribute1-prop3-value", 
configType1Prop3Attributes.get("attribute1"));
+
+    // config type foobar
+    Map<String, Map<String, String>> configType2Attributes = 
attributes.get("foobar-type");
+    assertEquals(2, configType2Attributes.size());
+    // prop10 attributes
+    Map<String, String> configType2Prop1Attributes = 
configType2Attributes.get("prop10");
+    assertEquals(1, configType2Prop1Attributes.size());
+    assertEquals("attribute1-prop10-value", 
configType2Prop1Attributes.get("attribute1"));
+    // prop11 attributes
+    Map<String, String> configType2Prop2Attributes = 
configType2Attributes.get("prop11");
+    assertEquals(1, configType2Prop2Attributes.size());
+    assertEquals("attribute10-prop11-value", 
configType2Prop2Attributes.get("attribute10"));
+  }
+
+  private Collection<Map<String, String>> getNewSyntaxConfigProps() {
+    Collection<Map<String, String>> configurations = new ArrayList<Map<String, 
String>>();
+
+    // type foo has both properties and attributes
+    Map<String, String> configProperties1 = new HashMap<String, String>();
+    configProperties1.put("foo-type/properties/prop1", "prop1Value");
+    configProperties1.put("foo-type/properties/prop2", "prop2Value");
+    // foo type attributes
+    configProperties1.put("foo-type/properties_attributes/attribute1/prop1", 
"attribute1-prop1-value");
+    configProperties1.put("foo-type/properties_attributes/attribute1/prop2", 
"attribute1-prop2-value");
+    configProperties1.put("foo-type/properties_attributes/attribute1/prop3", 
"attribute1-prop3-value");
+    configProperties1.put("foo-type/properties_attributes/attribute2/prop1", 
"attribute2-prop1-value");
+    configurations.add(configProperties1);
+
+    // type bar has only properties
+    Map<String, String> configProperties2 = new HashMap<String, String>();
+    configProperties2.put("bar-type/properties/prop3", "prop3Value");
+    configurations.add(configProperties2);
+
+    // type foobar has only attributes
+    Map<String, String> configProperties3 = new HashMap<String, String>();
+    
configProperties3.put("foobar-type/properties_attributes/attribute1/prop10", 
"attribute1-prop10-value");
+    
configProperties3.put("foobar-type/properties_attributes/attribute10/prop11", 
"attribute10-prop11-value");
+    configurations.add(configProperties3);
+
+    return configurations;
+  }
+
+  private Collection<Map<String, String>> getOldSyntaxConfigProps() {
+    Collection<Map<String, String>> configurations = new ArrayList<Map<String, 
String>>();
+
+    Map<String, String> configProperties1 = new HashMap<String, String>();
+    configProperties1.put("foo-type/prop1", "prop1Value");
+    configProperties1.put("foo-type/prop2", "prop2Value");
+    configurations.add(configProperties1);
+
+    Map<String, String> configProperties2 = new HashMap<String, String>();
+    configProperties2.put("bar-type/prop3", "prop3Value");
+    configurations.add(configProperties2);
+
+    return configurations;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9f0dd0b/ambari-server/src/test/java/org/apache/ambari/server/topology/RequiredPasswordValidatorTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/RequiredPasswordValidatorTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/RequiredPasswordValidatorTest.java
new file mode 100644
index 0000000..bc23b35
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/RequiredPasswordValidatorTest.java
@@ -0,0 +1,305 @@
+/**
+ * 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.topology;
+
+import org.apache.ambari.server.controller.internal.Stack;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import static junit.framework.Assert.assertEquals;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.powermock.api.easymock.PowerMock.createNiceMock;
+import static org.powermock.api.easymock.PowerMock.verify;
+
+/**
+ * Unit tests for RequiredPasswordValidator.
+ */
+public class RequiredPasswordValidatorTest {
+
+  private static final ClusterTopology topology = 
createNiceMock(ClusterTopology.class);
+  private static final Blueprint blueprint = createNiceMock(Blueprint.class);
+  private static final Stack stack = createNiceMock(Stack.class);
+  private static final HostGroup group1 = createNiceMock(HostGroup.class);
+  private static final HostGroup group2 = createNiceMock(HostGroup.class);
+
+  private static Configuration stackDefaults;
+  private static Configuration bpClusterConfig;
+  private static Configuration topoClusterConfig;
+  private static Configuration bpGroup1Config;
+  private static Configuration bpGroup2Config;
+  private static Configuration topoGroup1Config;
+  private static Configuration topoGroup2Config;
+
+  private static final Map<String, HostGroup> hostGroups = new HashMap<String, 
HostGroup>();
+  private static final Map<String, HostGroupInfo> hostGroupInfo = new 
HashMap<String, HostGroupInfo>();
+
+  private static final Collection<String> group1Components = new 
HashSet<String>();
+  private static final Collection<String> group2Components = new 
HashSet<String>();
+  private static final Collection<String> service1Components = new 
HashSet<String>();
+  private static final Collection<String> service2Components = new 
HashSet<String>();
+  private static final Collection<String> service3Components = new 
HashSet<String>();
+
+  private static final Collection<Stack.ConfigProperty> 
service1RequiredPwdConfigs = new HashSet<Stack.ConfigProperty>();
+  private static final Collection<Stack.ConfigProperty> 
service2RequiredPwdConfigs = new HashSet<Stack.ConfigProperty>();
+  private static final Collection<Stack.ConfigProperty> 
service3RequiredPwdConfigs = new HashSet<Stack.ConfigProperty>();
+
+
+  @Before
+  public void setup() {
+
+    stackDefaults = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>());
+
+    bpClusterConfig = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>(), 
stackDefaults);
+
+    topoClusterConfig = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>(), 
bpClusterConfig);
+
+    bpGroup1Config = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>(), 
topoClusterConfig);
+
+    bpGroup2Config = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>(), 
topoClusterConfig);
+
+    topoGroup1Config = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>(), 
bpGroup1Config);
+
+    topoGroup2Config = new Configuration(new HashMap<String, Map<String, 
String>>(),
+        new HashMap<String, Map<String, Map<String, String>>>(), 
bpGroup2Config);
+
+    service1RequiredPwdConfigs.clear();
+    service2RequiredPwdConfigs.clear();
+    service3RequiredPwdConfigs.clear();
+
+    hostGroups.put("group1", group1);
+    hostGroups.put("group2", group2);
+
+    group1Components.add("component1");
+    group1Components.add("component2");
+    group1Components.add("component3");
+
+    group2Components.add("component1");
+    group2Components.add("component4");
+
+    service1Components.add("component1");
+    service1Components.add("component2");
+    service2Components.add("component3");
+    service3Components.add("component4");
+
+    HostGroupInfo hostGroup1Info = new HostGroupInfo("group1");
+    hostGroup1Info.setConfiguration(topoGroup1Config);
+    HostGroupInfo hostGroup2Info = new HostGroupInfo("group2");
+    hostGroup2Info.setConfiguration(topoGroup2Config);
+    hostGroupInfo.put("group1", hostGroup1Info);
+    hostGroupInfo.put("group2", hostGroup2Info);
+
+    
expect(topology.getConfiguration()).andReturn(topoClusterConfig).anyTimes();
+    expect(topology.getBlueprint()).andReturn(blueprint).anyTimes();
+    expect(topology.getHostGroupInfo()).andReturn(hostGroupInfo).anyTimes();
+
+    expect(blueprint.getHostGroups()).andReturn(hostGroups).anyTimes();
+    expect(blueprint.getHostGroup("group1")).andReturn(group1).anyTimes();
+    expect(blueprint.getHostGroup("group2")).andReturn(group2).anyTimes();
+    expect(blueprint.getStack()).andReturn(stack).anyTimes();
+
+    expect(group1.getComponents()).andReturn(group1Components).anyTimes();
+    expect(group2.getComponents()).andReturn(group2Components).anyTimes();
+    
expect(group1.getComponents("service1")).andReturn(Arrays.asList("component1", 
"component2")).anyTimes();
+    
expect(group1.getComponents("service2")).andReturn(Arrays.asList("component3")).anyTimes();
+    
expect(group1.getComponents("service3")).andReturn(Collections.<String>emptySet()).anyTimes();
+    
expect(group2.getComponents("service1")).andReturn(Arrays.asList("component1")).anyTimes();
+    
expect(group2.getComponents("service2")).andReturn(Collections.<String>emptySet()).anyTimes();
+    
expect(group2.getComponents("service3")).andReturn(Arrays.asList("component4")).anyTimes();
+
+    
expect(stack.getServiceForComponent("component1")).andReturn("service1").anyTimes();
+    
expect(stack.getServiceForComponent("component2")).andReturn("service1").anyTimes();
+    
expect(stack.getServiceForComponent("component3")).andReturn("service2").anyTimes();
+    
expect(stack.getServiceForComponent("component4")).andReturn("service3").anyTimes();
+
+    expect(stack.getRequiredConfigurationProperties("service1", 
"PASSWORD")).andReturn(service1RequiredPwdConfigs).anyTimes();
+    expect(stack.getRequiredConfigurationProperties("service2", 
"PASSWORD")).andReturn(service2RequiredPwdConfigs).anyTimes();
+    expect(stack.getRequiredConfigurationProperties("service3", 
"PASSWORD")).andReturn(service3RequiredPwdConfigs).anyTimes();
+
+    replay(topology, blueprint, stack, group1, group2);
+  }
+
+  @After
+  public void tearDown() {
+    verify(topology, blueprint, stack, group1, group2);
+    reset(topology, blueprint, stack, group1, group2);
+  }
+
+
+  @Test
+  public void testValidate_noRequiredProps__noDefaultPwd() throws Exception {
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    // no required pwd properties so shouldn't throw an exception
+    validator.validate(topology);
+  }
+
+  @Test
+  public void testValidate_noRequiredProps__defaultPwd() throws Exception {
+    TopologyValidator validator = new RequiredPasswordValidator("pwd");
+    // no required pwd properties so shouldn't throw an exception
+    validator.validate(topology);
+  }
+
+  @Test(expected = InvalidTopologyException.class)
+  public void testValidate_missingPwd__NoDefaultPwd() throws Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    service1RequiredPwdConfigs.add(pwdProp);
+
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    validator.validate(topology);
+  }
+
+  @Test
+  public void testValidate_missingPwd__defaultPwd() throws Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    service1RequiredPwdConfigs.add(pwdProp);
+
+    TopologyValidator validator = new RequiredPasswordValidator("default-pwd");
+    // default value should be set
+    validator.validate(topology);
+
+    assertEquals(1, topoClusterConfig.getProperties().size());
+    assertEquals("default-pwd", 
topoClusterConfig.getProperties().get("test-type").get("pwdProp"));
+  }
+
+  @Test
+  public void testValidate_pwdPropertyInTopoGroupConfig__NoDefaultPwd() throws 
Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    service3RequiredPwdConfigs.add(pwdProp);
+    // group2 has a component from service 3
+    topoGroup2Config.getProperties().put("test-type", 
Collections.singletonMap("pwdProp", "secret"));
+
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    validator.validate(topology);
+  }
+
+  @Test
+  public void testValidate_pwdPropertyInTopoClusterConfig__NoDefaultPwd() 
throws Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    service3RequiredPwdConfigs.add(pwdProp);
+    // group2 has a component from service 3
+    topoClusterConfig.getProperties().put("test-type", 
Collections.singletonMap("pwdProp", "secret"));
+
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    validator.validate(topology);
+  }
+
+  @Test
+  public void testValidate_pwdPropertyInBPGroupConfig__NoDefaultPwd() throws 
Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    service3RequiredPwdConfigs.add(pwdProp);
+    // group2 has a component from service 3
+    bpGroup2Config.getProperties().put("test-type", 
Collections.singletonMap("pwdProp", "secret"));
+
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    validator.validate(topology);
+  }
+
+  @Test
+  public void testValidate_pwdPropertyInBPClusterConfig__NoDefaultPwd() throws 
Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    service3RequiredPwdConfigs.add(pwdProp);
+    // group2 has a component from service 3
+    bpClusterConfig.getProperties().put("test-type", 
Collections.singletonMap("pwdProp", "secret"));
+
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    validator.validate(topology);
+  }
+
+  @Test(expected = InvalidTopologyException.class)
+  public void testValidate_pwdPropertyInStackConfig__NoDefaultPwd() throws 
Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    service3RequiredPwdConfigs.add(pwdProp);
+    // group2 has a component from service 3
+    stackDefaults.getProperties().put("test-type", 
Collections.singletonMap("pwdProp", "secret"));
+
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    // because stack config is ignored for validation, an exception should be 
thrown
+    validator.validate(topology);
+  }
+
+  @Test
+  public void testValidate_twoRequiredPwdOneSpecified__defaultPwd() throws 
Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    Stack.ConfigProperty pwdProp2 = new Stack.ConfigProperty("test2-type", 
"pwdProp2", null);
+    service1RequiredPwdConfigs.add(pwdProp);
+    service3RequiredPwdConfigs.add(pwdProp2);
+
+    topoClusterConfig.getProperties().put("test2-type", 
Collections.singletonMap("pwdProp2", "secret"));
+
+    TopologyValidator validator = new RequiredPasswordValidator("default-pwd");
+    // default value should be set
+    validator.validate(topology);
+
+    assertEquals(2, topoClusterConfig.getProperties().size());
+    assertEquals("default-pwd", 
topoClusterConfig.getProperties().get("test-type").get("pwdProp"));
+    assertEquals("secret", 
topoClusterConfig.getProperties().get("test2-type").get("pwdProp2"));
+  }
+
+  @Test
+  public void testValidate_twoRequiredPwdTwoSpecified__noDefaultPwd() throws 
Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    Stack.ConfigProperty pwdProp2 = new Stack.ConfigProperty("test2-type", 
"pwdProp2", null);
+    service1RequiredPwdConfigs.add(pwdProp);
+    service3RequiredPwdConfigs.add(pwdProp2);
+
+    topoClusterConfig.getProperties().put("test2-type", 
Collections.singletonMap("pwdProp2", "secret2"));
+    topoClusterConfig.getProperties().put("test-type", 
Collections.singletonMap("pwdProp", "secret1"));
+
+    TopologyValidator validator = new RequiredPasswordValidator(null);
+    // default value should be set
+    validator.validate(topology);
+
+    assertEquals(2, topoClusterConfig.getProperties().size());
+    assertEquals("secret1", 
topoClusterConfig.getProperties().get("test-type").get("pwdProp"));
+    assertEquals("secret2", 
topoClusterConfig.getProperties().get("test2-type").get("pwdProp2"));
+  }
+
+  @Test
+  public void testValidate_multipleMissingPwd__defaultPwd() throws Exception {
+    Stack.ConfigProperty pwdProp = new Stack.ConfigProperty("test-type", 
"pwdProp", null);
+    Stack.ConfigProperty pwdProp2 = new Stack.ConfigProperty("test2-type", 
"pwdProp2", null);
+    service1RequiredPwdConfigs.add(pwdProp);
+    service3RequiredPwdConfigs.add(pwdProp2);
+
+    TopologyValidator validator = new RequiredPasswordValidator("default-pwd");
+    // default value should be set
+    validator.validate(topology);
+
+    assertEquals(2, topoClusterConfig.getProperties().size());
+    assertEquals("default-pwd", 
topoClusterConfig.getProperties().get("test-type").get("pwdProp"));
+    assertEquals("default-pwd", 
topoClusterConfig.getProperties().get("test2-type").get("pwdProp2"));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9f0dd0b/ambari-server/src/test/java/org/apache/ambari/server/utils/TestStageUtils.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/utils/TestStageUtils.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/utils/TestStageUtils.java
index 59cbd2b..b9e4ff0 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/utils/TestStageUtils.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/utils/TestStageUtils.java
@@ -256,7 +256,7 @@ public class TestStageUtils {
 
     //Get cluster host info
     Map<String, Set<String>> info =
-        StageUtils.getClusterHostInfo(fsm.getHostsForCluster("c1"), 
fsm.getCluster("c1"));
+        StageUtils.getClusterHostInfo(fsm.getCluster("c1"));
 
     //All hosts present in cluster host info
     Set<String> allHosts = info.get(HOSTS_LIST);

Reply via email to