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