Repository: ambari Updated Branches: refs/heads/trunk 2cceee2ea -> 6237724d4
AMBARI-6957. Fixes NPE during cluster create with blueprint. Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6237724d Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6237724d Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6237724d Branch: refs/heads/trunk Commit: 6237724d4f5cb02bd1541deba6542a72be04af2a Parents: 2cceee2 Author: Robert Nettleton <[email protected]> Authored: Tue Aug 26 14:04:53 2014 -0400 Committer: John Speidel <[email protected]> Committed: Tue Aug 26 14:04:53 2014 -0400 ---------------------------------------------------------------------- .../internal/BaseBlueprintProcessor.java | 37 +- .../BlueprintConfigurationProcessor.java | 5 +- .../internal/ClusterResourceProvider.java | 73 ++- .../internal/ClusterResourceProviderTest.java | 497 ++++++++++++++++++- 4 files changed, 584 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/6237724d/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java index a4165d7..c9f0124 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java @@ -106,7 +106,7 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP Map<String, HostGroupImpl> mapHostGroups = new HashMap<String, HostGroupImpl>(); for (HostGroupEntity hostGroup : blueprint.getHostGroups()) { - mapHostGroups.put(hostGroup.getName(), new HostGroupImpl(hostGroup, stack)); + mapHostGroups.put(hostGroup.getName(), new HostGroupImpl(hostGroup, stack, this)); } return mapHostGroups; } @@ -123,7 +123,7 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP protected Stack parseStack(BlueprintEntity blueprint) throws SystemException { Stack stack; try { - stack = new Stack(blueprint.getStackName(), blueprint.getStackVersion()); + stack = new Stack(blueprint.getStackName(), blueprint.getStackVersion(), getManagementController()); } catch (StackAccessException e) { throw new IllegalArgumentException("Invalid stack information provided for cluster. " + "stack name: " + blueprint.getStackName() + @@ -148,7 +148,7 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP * @throws IllegalArgumentException when validation fails */ protected BlueprintEntity validateTopology(BlueprintEntity blueprint) throws AmbariException { - Stack stack = new Stack(blueprint.getStackName(), blueprint.getStackVersion()); + Stack stack = new Stack(blueprint.getStackName(), blueprint.getStackVersion(), getManagementController()); Map<String, HostGroupImpl> hostGroupMap = parseBlueprintHostGroups(blueprint, stack); Collection<HostGroupImpl> hostGroups = hostGroupMap.values(); Map<String, Map<String, String>> clusterConfig = processBlueprintConfigurations(blueprint, null); @@ -455,7 +455,7 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP /** * Encapsulates stack information. */ - protected class Stack { + protected static class Stack { /** * Stack name */ @@ -514,6 +514,12 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP private Map<String, Map<String, Map<String, ConfigProperty>>> serviceConfigurations = new HashMap<String, Map<String, Map<String, ConfigProperty>>>(); + + /** + * Ambari Management Controller, used to obtain Stack definitions + */ + private final AmbariManagementController ambariManagementController; + /** * Contains a configuration property's value and attributes. */ @@ -553,11 +559,12 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP * @throws AmbariException an exception occurred getting stack information * for the specified name and version */ - public Stack(String name, String version) throws AmbariException { + public Stack(String name, String version, AmbariManagementController ambariManagementController) throws AmbariException { this.name = name; this.version = version; + this.ambariManagementController = ambariManagementController; - Set<StackServiceResponse> stackServices = getManagementController().getStackServices( + Set<StackServiceResponse> stackServices = ambariManagementController.getStackServices( Collections.singleton(new StackServiceRequest(name, version, null))); for (StackServiceResponse stackService : stackServices) { @@ -767,7 +774,7 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP private void parseComponents(String service) throws AmbariException{ Collection<String> componentSet = new HashSet<String>(); - Set<StackServiceComponentResponse> components = getManagementController().getStackComponents( + Set<StackServiceComponentResponse> components = ambariManagementController.getStackComponents( Collections.singleton(new StackServiceComponentRequest(name, version, service, null))); // stack service components @@ -807,7 +814,7 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP serviceConfigurations.put(service, mapServiceConfig); - Set<StackConfigurationResponse> serviceConfigs = getManagementController().getStackConfigurations( + Set<StackConfigurationResponse> serviceConfigs = ambariManagementController.getStackConfigurations( Collections.singleton(new StackConfigurationRequest(name, version, service, null))); for (StackConfigurationResponse config : serviceConfigs) { @@ -846,7 +853,7 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP /** * Host group representation. */ - protected class HostGroupImpl implements HostGroup { + protected static class HostGroupImpl implements HostGroup { /** * Host group entity */ @@ -880,14 +887,20 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP private Stack stack; /** + * The Blueprint processor associated with this HostGroupImpl instance + */ + private final BaseBlueprintProcessor blueprintProcessor; + + /** * Constructor. * * @param hostGroup host group * @param stack stack */ - public HostGroupImpl(HostGroupEntity hostGroup, Stack stack) { + public HostGroupImpl(HostGroupEntity hostGroup, Stack stack, BaseBlueprintProcessor blueprintProcessor) { this.hostGroup = hostGroup; this.stack = stack; + this.blueprintProcessor = blueprintProcessor; parseComponents(); parseConfigurations(); } @@ -1009,14 +1022,14 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP boolean resolved = false; if (dependencyScope.equals("cluster")) { - Collection<String> missingDependencyInfo = verifyComponentCardinalityCount(entity, hostGroups, + Collection<String> missingDependencyInfo = blueprintProcessor.verifyComponentCardinalityCount(entity, hostGroups, componentName, new Cardinality("1+"), autoDeployInfo, stack, clusterConfig); resolved = missingDependencyInfo.isEmpty(); } else if (dependencyScope.equals("host")) { if (components.contains(component) || (autoDeployInfo != null && autoDeployInfo.isEnabled())) { resolved = true; if (addComponent(componentName)) { - addComponentToBlueprint(hostGroup.getBlueprintEntity(), getEntity().getName(), componentName); + blueprintProcessor.addComponentToBlueprint(hostGroup.getBlueprintEntity(), getEntity().getName(), componentName); } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6237724d/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java index c7eef57..c246f83 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java @@ -150,7 +150,8 @@ public class BlueprintConfigurationProcessor { for (HostGroup group : hostGroups) { Collection<String> hosts = group.getHostInfo(); for (String host : hosts) { - if (propValue.contains(host)) { //todo: need to use regular expression to avoid matching a host which is a superset. Can this be fixed??? + //todo: need to use regular expression to avoid matching a host which is a superset. + if (propValue.contains(host)) { matchedHost = true; typeProperties.put(propertyName, propValue.replace( host, "%HOSTGROUP::" + group.getName() + "%")); @@ -697,4 +698,4 @@ public class BlueprintConfigurationProcessor { hbaseEnvMap.put("hbase_master_heapsize", new MPropertyUpdater()); hbaseEnvMap.put("hbase_regionserver_heapsize", new MPropertyUpdater()); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/ambari/blob/6237724d/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java index 3fcfcd4..3498ffb 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java @@ -303,6 +303,16 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor { } + /** + * Package-level access for cluster config + * @return cluster config map + */ + Map<String, Map<String, String>> getClusterConfigurations() { + return mapClusterConfigurations; + } + + + // ----- utility methods --------------------------------------------------- /** @@ -844,7 +854,7 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor { BlueprintConfigurationProcessor configurationProcessor = new BlueprintConfigurationProcessor(mapClusterConfigurations); configurationProcessor.doUpdateForClusterCreate(blueprintHostGroups); - setMissingConfigurations(); + setMissingConfigurations(blueprintHostGroups); } /** @@ -908,14 +918,29 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor { /** * Explicitly set any properties that are required but not currently provided in the stack definition. */ - private void setMissingConfigurations() { + void setMissingConfigurations(Map<String, HostGroupImpl> blueprintHostGroups) { // AMBARI-5206 final Map<String , String> userProps = new HashMap<String , String>(); - userProps.put("oozie_user", "oozie-env"); - userProps.put("hive_user", "hive-env"); - userProps.put("hcat_user", "hive-env"); - userProps.put("hbase_user", "hbase-env"); - userProps.put("falcon_user", "falcon-env"); + + // only add user properties to the map for + // services actually included in the blueprint definition + if (isServiceIncluded("OOZIE", blueprintHostGroups)) { + userProps.put("oozie_user", "oozie-env"); + } + + if (isServiceIncluded("HIVE", blueprintHostGroups)) { + userProps.put("hive_user", "hive-env"); + userProps.put("hcat_user", "hive-env"); + } + + if (isServiceIncluded("HBASE", blueprintHostGroups)) { + userProps.put("hbase_user", "hbase-env"); + } + + if (isServiceIncluded("FALCON", blueprintHostGroups)) { + userProps.put("falcon_user", "falcon-env"); + } + String proxyUserHosts = "hadoop.proxyuser.%s.hosts"; String proxyUserGroups = "hadoop.proxyuser.%s.groups"; @@ -923,14 +948,40 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor { for (String property : userProps.keySet()) { String configType = userProps.get(property); Map<String, String> configs = mapClusterConfigurations.get(configType); - String user = configs.get(property); - if (user != null && !user.isEmpty()) { - ensureProperty("core-site", String.format(proxyUserHosts, user), "*"); - ensureProperty("core-site", String.format(proxyUserGroups, user), "users"); + if (configs != null) { + String user = configs.get(property); + if (user != null && !user.isEmpty()) { + ensureProperty("core-site", String.format(proxyUserHosts, user), "*"); + ensureProperty("core-site", String.format(proxyUserGroups, user), "users"); + } + } else { + LOG.debug("setMissingConfigurations: no user configuration found for type = " + configType + ". This may be caused by an error in the blueprint configuration."); } + } } + + /** + * Determines if any components in the specified service are + * included in the current blueprint's host group definitions. + * + * @param serviceName the Hadoop service name to query on + * @param blueprintHostGroups the map of Host Groups in the current blueprint + * @return true if the named service is included in the blueprint + * false if the named service it not included in the blueprint + */ + protected boolean isServiceIncluded(String serviceName, Map<String, HostGroupImpl> blueprintHostGroups) { + for (String hostGroupName : blueprintHostGroups.keySet()) { + HostGroupImpl hostGroup = blueprintHostGroups.get(hostGroupName); + if (hostGroup.getServices().contains(serviceName)) { + return true; + } + } + + return false; + } + /** * Ensure that the specified property exists. * If not, set a default value. http://git-wip-us.apache.org/repos/asf/ambari/blob/6237724d/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java index b5c50ff..06d8bb7 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java @@ -25,6 +25,7 @@ import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.createStrictMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; @@ -71,6 +72,7 @@ import org.apache.ambari.server.orm.entities.BlueprintEntity; import org.apache.ambari.server.orm.entities.HostGroupComponentEntity; import org.apache.ambari.server.orm.entities.HostGroupConfigEntity; import org.apache.ambari.server.orm.entities.HostGroupEntity; +import org.apache.ambari.server.state.AutoDeployInfo; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ConfigHelper; import org.apache.ambari.server.state.DependencyInfo; @@ -78,7 +80,9 @@ import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.State; import org.easymock.Capture; import org.easymock.EasyMock; +import org.easymock.EasyMockSupport; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import com.google.gson.Gson; @@ -87,6 +91,14 @@ import com.google.gson.Gson; * ClusterResourceProvider tests. */ public class ClusterResourceProviderTest { + + @Before + public void setup() throws Exception { + // reset this static field, to allow unit tests to function independently + BaseBlueprintProcessor.stackInfo = null; + } + + @Test public void testCreateResources() throws Exception{ Resource.Type type = Resource.Type.Cluster; @@ -440,7 +452,12 @@ public class ClusterResourceProviderTest { PersistKeyValueService.init(persistKeyValue); ResourceProvider provider = new TestClusterResourceProvider( managementController, serviceResourceProvider, componentResourceProvider, - hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider); + hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider) { + @Override + protected boolean isServiceIncluded(String serviceName, Map<String, HostGroupImpl> blueprintHostGroups) { + return true; + } + }; RequestStatus requestStatus = provider.createResources(request); @@ -1644,7 +1661,12 @@ public class ClusterResourceProviderTest { PersistKeyValueService.init(persistKeyValue); ResourceProvider provider = new TestClusterResourceProvider( managementController, serviceResourceProvider, componentResourceProvider, - hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider); + hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider) { + @Override + protected boolean isServiceIncluded(String serviceName, Map<String, HostGroupImpl> blueprintHostGroups) { + return true; + } + }; RequestStatus requestStatus = provider.createResources(request); @@ -2336,7 +2358,12 @@ public class ClusterResourceProviderTest { PersistKeyValueService.init(persistKeyValue); ResourceProvider provider = new TestClusterResourceProvider( managementController, serviceResourceProvider, componentResourceProvider, - hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider); + hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider) { + @Override + protected boolean isServiceIncluded(String serviceName, Map<String, HostGroupImpl> blueprintHostGroups) { + return true; + } + }; RequestStatus requestStatus = provider.createResources(request); @@ -2826,6 +2853,470 @@ public class ClusterResourceProviderTest { verify(managementController, response, clusters); } + @Test + public void testSetMissingConfigurationsOozieIncluded() throws Exception { + EasyMockSupport mockSupport = new EasyMockSupport(); + + AmbariManagementController mockMgmtController = + mockSupport.createMock(AmbariManagementController.class); + ResourceProvider mockServiceProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockConfigGroupProvider = + mockSupport.createMock(ResourceProvider.class); + AmbariManagementController mockManagementController = + mockSupport.createMock(AmbariManagementController.class); + StackServiceResponse mockStackServiceResponseOne = + mockSupport.createMock(StackServiceResponse.class); + StackServiceComponentResponse mockStackComponentResponse = + mockSupport.createMock(StackServiceComponentResponse.class); + AmbariMetaInfo mockAmbariMetaInfo = + mockSupport.createMock(AmbariMetaInfo.class); + + expect(mockStackComponentResponse.getComponentName()).andReturn("OOZIE_SERVER"); + expect(mockStackComponentResponse.getCardinality()).andReturn("1"); + expect(mockStackComponentResponse.getAutoDeploy()).andReturn(new AutoDeployInfo()); + + + expect(mockStackServiceResponseOne.getServiceName()).andReturn("OOZIE"); + expect(mockManagementController.getStackServices(isA(Set.class))).andReturn(Collections.singleton(mockStackServiceResponseOne)); + expect(mockManagementController.getStackComponents(isA(Set.class))).andReturn(Collections.singleton(mockStackComponentResponse)); + expect(mockManagementController.getStackConfigurations(isA(Set.class))).andReturn(Collections.<StackConfigurationResponse>emptySet()); + + expect(mockAmbariMetaInfo.getComponentDependencies("HDP", "2.1", "OOZIE", "OOZIE_SERVER")).andReturn(Collections.<DependencyInfo>emptyList()); + + mockSupport.replayAll(); + + + ClusterResourceProvider.init(null, mockAmbariMetaInfo, null); + + BaseBlueprintProcessor.Stack stack = + new BaseBlueprintProcessor.Stack("HDP", "2.1", mockManagementController); + + ClusterResourceProvider clusterResourceProvider = + new TestClusterResourceProvider(mockMgmtController, mockServiceProvider, + mockComponentProvider, mockHostProvider, mockHostComponentProvider, mockConfigGroupProvider); + + + HostGroupEntity hostGroup = new HostGroupEntity(); + hostGroup.setComponents(Collections.<HostGroupComponentEntity>emptyList()); + HostGroupConfigEntity configEntity = new HostGroupConfigEntity(); + configEntity.setConfigData(""); + + hostGroup.setConfigurations(Collections.singletonList(configEntity)); + BaseBlueprintProcessor.HostGroupImpl hostGroupImpl = + new BaseBlueprintProcessor.HostGroupImpl(hostGroup, stack, null); + hostGroupImpl.addComponent("OOZIE_SERVER"); + + // add empty map for core-site, to simulate this configuration entry + clusterResourceProvider.getClusterConfigurations().put("core-site", new HashMap<String, String>()); + clusterResourceProvider.getClusterConfigurations().put("oozie-env", new HashMap<String, String>()); + clusterResourceProvider.getClusterConfigurations().get("oozie-env").put("oozie_user", "oozie"); + + clusterResourceProvider.setMissingConfigurations(Collections.singletonMap("host_group_one", hostGroupImpl)); + + Map<String, String> mapCoreSiteConfig = + clusterResourceProvider.getClusterConfigurations().get("core-site"); + + assertNotNull("core-site map was null.", mapCoreSiteConfig); + assertEquals("Incorrect number of entries in the core-site config map", + 2, mapCoreSiteConfig.size()); + assertEquals("Incorrect value for proxy hosts", + "*", mapCoreSiteConfig.get("hadoop.proxyuser.oozie.hosts")); + assertEquals("Incorrect value for proxy hosts", + "users", mapCoreSiteConfig.get("hadoop.proxyuser.oozie.groups")); + + mockSupport.verifyAll(); + } + + + @Test + public void testSetMissingConfigurationsFalconIncluded() throws Exception { + EasyMockSupport mockSupport = new EasyMockSupport(); + + AmbariManagementController mockMgmtController = + mockSupport.createMock(AmbariManagementController.class); + ResourceProvider mockServiceProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockConfigGroupProvider = + mockSupport.createMock(ResourceProvider.class); + AmbariManagementController mockManagementController = + mockSupport.createMock(AmbariManagementController.class); + StackServiceResponse mockStackServiceResponseOne = + mockSupport.createMock(StackServiceResponse.class); + StackServiceComponentResponse mockStackComponentResponse = + mockSupport.createMock(StackServiceComponentResponse.class); + AmbariMetaInfo mockAmbariMetaInfo = + mockSupport.createMock(AmbariMetaInfo.class); + + expect(mockStackComponentResponse.getComponentName()).andReturn("FALCON_SERVER"); + expect(mockStackComponentResponse.getCardinality()).andReturn("1"); + expect(mockStackComponentResponse.getAutoDeploy()).andReturn(new AutoDeployInfo()); + + + expect(mockStackServiceResponseOne.getServiceName()).andReturn("FALCON"); + expect(mockManagementController.getStackServices(isA(Set.class))).andReturn(Collections.singleton(mockStackServiceResponseOne)); + expect(mockManagementController.getStackComponents(isA(Set.class))).andReturn(Collections.singleton(mockStackComponentResponse)); + expect(mockManagementController.getStackConfigurations(isA(Set.class))).andReturn(Collections.<StackConfigurationResponse>emptySet()); + + expect(mockAmbariMetaInfo.getComponentDependencies("HDP", "2.1", "FALCON", "FALCON_SERVER")).andReturn(Collections.<DependencyInfo>emptyList()); + + mockSupport.replayAll(); + + ClusterResourceProvider.init(null, mockAmbariMetaInfo, null); + + BaseBlueprintProcessor.Stack stack = + new BaseBlueprintProcessor.Stack("HDP", "2.1", mockManagementController); + + ClusterResourceProvider clusterResourceProvider = + new TestClusterResourceProvider(mockMgmtController, mockServiceProvider, + mockComponentProvider, mockHostProvider, mockHostComponentProvider, mockConfigGroupProvider); + + HostGroupEntity hostGroup = new HostGroupEntity(); + hostGroup.setComponents(Collections.<HostGroupComponentEntity>emptyList()); + HostGroupConfigEntity configEntity = new HostGroupConfigEntity(); + configEntity.setConfigData(""); + + hostGroup.setConfigurations(Collections.singletonList(configEntity)); + BaseBlueprintProcessor.HostGroupImpl hostGroupImpl = + new BaseBlueprintProcessor.HostGroupImpl(hostGroup, stack, null); + hostGroupImpl.addComponent("FALCON_SERVER"); + + // add empty map for core-site, to simulate this configuration entry + clusterResourceProvider.getClusterConfigurations().put("core-site", new HashMap<String, String>()); + clusterResourceProvider.getClusterConfigurations().put("falcon-env", new HashMap<String, String>()); + clusterResourceProvider.getClusterConfigurations().get("falcon-env").put("falcon_user", "falcon"); + + clusterResourceProvider.setMissingConfigurations(Collections.singletonMap("host_group_one", hostGroupImpl)); + + Map<String, String> mapCoreSiteConfig = + clusterResourceProvider.getClusterConfigurations().get("core-site"); + + assertNotNull("core-site map was null.", mapCoreSiteConfig); + assertEquals("Incorrect number of entries in the core-site config map", + 2, mapCoreSiteConfig.size()); + assertEquals("Incorrect value for proxy hosts", + "*", mapCoreSiteConfig.get("hadoop.proxyuser.falcon.hosts")); + assertEquals("Incorrect value for proxy hosts", + "users", mapCoreSiteConfig.get("hadoop.proxyuser.falcon.groups")); + + mockSupport.verifyAll(); + } + + + @Test + public void testSetMissingConfigurationsOozieNotIncluded() throws Exception { + EasyMockSupport mockSupport = new EasyMockSupport(); + + AmbariManagementController mockMgmtController = + mockSupport.createMock(AmbariManagementController.class); + ResourceProvider mockServiceProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockConfigGroupProvider = + mockSupport.createMock(ResourceProvider.class); + AmbariManagementController mockManagementController = + mockSupport.createMock(AmbariManagementController.class); + StackServiceResponse mockStackServiceResponseOne = + mockSupport.createMock(StackServiceResponse.class); + StackServiceComponentResponse mockStackComponentResponse = + mockSupport.createMock(StackServiceComponentResponse.class); + AmbariMetaInfo mockAmbariMetaInfo = + mockSupport.createMock(AmbariMetaInfo.class); + + expect(mockStackComponentResponse.getComponentName()).andReturn("OOZIE_SERVER"); + expect(mockStackComponentResponse.getCardinality()).andReturn("1"); + expect(mockStackComponentResponse.getAutoDeploy()).andReturn(new AutoDeployInfo()); + + + expect(mockStackServiceResponseOne.getServiceName()).andReturn("OOZIE"); + expect(mockManagementController.getStackServices(isA(Set.class))).andReturn(Collections.singleton(mockStackServiceResponseOne)); + expect(mockManagementController.getStackComponents(isA(Set.class))).andReturn(Collections.singleton(mockStackComponentResponse)); + expect(mockManagementController.getStackConfigurations(isA(Set.class))).andReturn(Collections.<StackConfigurationResponse>emptySet()); + + expect(mockAmbariMetaInfo.getComponentDependencies("HDP", "2.1", "OOZIE", "OOZIE_SERVER")).andReturn(Collections.<DependencyInfo>emptyList()); + + mockSupport.replayAll(); + + ClusterResourceProvider.init(null, mockAmbariMetaInfo, null); + + BaseBlueprintProcessor.Stack stack = + new BaseBlueprintProcessor.Stack("HDP", "2.1", mockManagementController); + + ClusterResourceProvider clusterResourceProvider = + new TestClusterResourceProvider(mockMgmtController, mockServiceProvider, + mockComponentProvider, mockHostProvider, mockHostComponentProvider, mockConfigGroupProvider); + + + HostGroupEntity hostGroup = new HostGroupEntity(); + hostGroup.setComponents(Collections.<HostGroupComponentEntity>emptyList()); + HostGroupConfigEntity configEntity = new HostGroupConfigEntity(); + configEntity.setConfigData(""); + + hostGroup.setConfigurations(Collections.singletonList(configEntity)); + BaseBlueprintProcessor.HostGroupImpl hostGroupImpl = + new BaseBlueprintProcessor.HostGroupImpl(hostGroup, stack, null); + hostGroupImpl.addComponent("COMPONENT_ONE"); + + // add empty map for core-site, to simulate this configuration entry + clusterResourceProvider.getClusterConfigurations().put("core-site", new HashMap<String, String>()); + + clusterResourceProvider.setMissingConfigurations(Collections.singletonMap("host_group_one", hostGroupImpl)); + + Map<String, String> mapCoreSiteConfig = + clusterResourceProvider.getClusterConfigurations().get("core-site"); + + assertNotNull("core-site map was null.", mapCoreSiteConfig); + assertEquals("Incorrect number of entries in the core-site config map", + 0, mapCoreSiteConfig.size()); + + mockSupport.verifyAll(); + + } + + + @Test + public void testSetMissingConfigurationsFalconNotIncluded() throws Exception { + EasyMockSupport mockSupport = new EasyMockSupport(); + + AmbariManagementController mockMgmtController = + mockSupport.createMock(AmbariManagementController.class); + ResourceProvider mockServiceProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockConfigGroupProvider = + mockSupport.createMock(ResourceProvider.class); + AmbariManagementController mockManagementController = + mockSupport.createMock(AmbariManagementController.class); + StackServiceResponse mockStackServiceResponseOne = + mockSupport.createMock(StackServiceResponse.class); + StackServiceComponentResponse mockStackComponentResponse = + mockSupport.createMock(StackServiceComponentResponse.class); + AmbariMetaInfo mockAmbariMetaInfo = + mockSupport.createMock(AmbariMetaInfo.class); + + expect(mockStackComponentResponse.getComponentName()).andReturn("FALCON_SERVER"); + expect(mockStackComponentResponse.getCardinality()).andReturn("1"); + expect(mockStackComponentResponse.getAutoDeploy()).andReturn(new AutoDeployInfo()); + + + expect(mockStackServiceResponseOne.getServiceName()).andReturn("FALCON"); + expect(mockManagementController.getStackServices(isA(Set.class))).andReturn(Collections.singleton(mockStackServiceResponseOne)); + expect(mockManagementController.getStackComponents(isA(Set.class))).andReturn(Collections.singleton(mockStackComponentResponse)); + expect(mockManagementController.getStackConfigurations(isA(Set.class))).andReturn(Collections.<StackConfigurationResponse>emptySet()); + + expect(mockAmbariMetaInfo.getComponentDependencies("HDP", "2.1", "FALCON", "FALCON_SERVER")).andReturn(Collections.<DependencyInfo>emptyList()); + + mockSupport.replayAll(); + + ClusterResourceProvider.init(null, mockAmbariMetaInfo, null); + + BaseBlueprintProcessor.Stack stack = + new BaseBlueprintProcessor.Stack("HDP", "2.1", mockManagementController); + + ClusterResourceProvider clusterResourceProvider = + new TestClusterResourceProvider(mockMgmtController, mockServiceProvider, + mockComponentProvider, mockHostProvider, mockHostComponentProvider, mockConfigGroupProvider); + + HostGroupEntity hostGroup = new HostGroupEntity(); + hostGroup.setComponents(Collections.<HostGroupComponentEntity>emptyList()); + HostGroupConfigEntity configEntity = new HostGroupConfigEntity(); + configEntity.setConfigData(""); + + hostGroup.setConfigurations(Collections.singletonList(configEntity)); + BaseBlueprintProcessor.HostGroupImpl hostGroupImpl = + new BaseBlueprintProcessor.HostGroupImpl(hostGroup, stack, null); + // blueprint request will not include a reference to FALCON_SERVER + hostGroupImpl.addComponent("COMPONENT_ONE"); + + // add empty map for core-site, to simulate this configuration entry + clusterResourceProvider.getClusterConfigurations().put("core-site", new HashMap<String, String>()); + + clusterResourceProvider.setMissingConfigurations(Collections.singletonMap("host_group_one", hostGroupImpl)); + + Map<String, String> mapCoreSiteConfig = + clusterResourceProvider.getClusterConfigurations().get("core-site"); + + assertNotNull("core-site map was null.", mapCoreSiteConfig); + assertEquals("Incorrect number of entries in the core-site config map", + 0, mapCoreSiteConfig.size()); + + mockSupport.verifyAll(); + + } + + + @Test + public void testSetMissingConfigurationsHiveNotIncluded() throws Exception { + EasyMockSupport mockSupport = new EasyMockSupport(); + + AmbariManagementController mockMgmtController = + mockSupport.createMock(AmbariManagementController.class); + ResourceProvider mockServiceProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockConfigGroupProvider = + mockSupport.createMock(ResourceProvider.class); + AmbariManagementController mockManagementController = + mockSupport.createMock(AmbariManagementController.class); + StackServiceResponse mockStackServiceResponseOne = + mockSupport.createMock(StackServiceResponse.class); + StackServiceComponentResponse mockStackComponentResponse = + mockSupport.createMock(StackServiceComponentResponse.class); + AmbariMetaInfo mockAmbariMetaInfo = + mockSupport.createMock(AmbariMetaInfo.class); + + expect(mockStackComponentResponse.getComponentName()).andReturn("HIVE_SERVER"); + expect(mockStackComponentResponse.getCardinality()).andReturn("1"); + expect(mockStackComponentResponse.getAutoDeploy()).andReturn(new AutoDeployInfo()); + + expect(mockStackServiceResponseOne.getServiceName()).andReturn("HIVE"); + expect(mockManagementController.getStackServices(isA(Set.class))).andReturn(Collections.singleton(mockStackServiceResponseOne)); + expect(mockManagementController.getStackComponents(isA(Set.class))).andReturn(Collections.singleton(mockStackComponentResponse)); + expect(mockManagementController.getStackConfigurations(isA(Set.class))).andReturn(Collections.<StackConfigurationResponse>emptySet()); + + expect(mockAmbariMetaInfo.getComponentDependencies("HDP", "2.1", "HIVE", "HIVE_SERVER")).andReturn(Collections.<DependencyInfo>emptyList()); + + mockSupport.replayAll(); + + ClusterResourceProvider.init(null, mockAmbariMetaInfo, null); + + BaseBlueprintProcessor.Stack stack = + new BaseBlueprintProcessor.Stack("HDP", "2.1", mockManagementController); + + ClusterResourceProvider clusterResourceProvider = + new TestClusterResourceProvider(mockMgmtController, mockServiceProvider, + mockComponentProvider, mockHostProvider, mockHostComponentProvider, mockConfigGroupProvider); + + HostGroupEntity hostGroup = new HostGroupEntity(); + hostGroup.setComponents(Collections.<HostGroupComponentEntity>emptyList()); + HostGroupConfigEntity configEntity = new HostGroupConfigEntity(); + configEntity.setConfigData(""); + + hostGroup.setConfigurations(Collections.singletonList(configEntity)); + BaseBlueprintProcessor.HostGroupImpl hostGroupImpl = + new BaseBlueprintProcessor.HostGroupImpl(hostGroup, stack, null); + // blueprint request will not include a reference to a HIVE component + hostGroupImpl.addComponent("COMPONENT_ONE"); + + // add empty map for core-site, to simulate this configuration entry + clusterResourceProvider.getClusterConfigurations().put("core-site", new HashMap<String, String>()); + + clusterResourceProvider.setMissingConfigurations(Collections.singletonMap("host_group_one", hostGroupImpl)); + + Map<String, String> mapCoreSiteConfig = + clusterResourceProvider.getClusterConfigurations().get("core-site"); + + assertNotNull("core-site map was null.", mapCoreSiteConfig); + assertEquals("Incorrect number of entries in the core-site config map", + 0, mapCoreSiteConfig.size()); + + mockSupport.verifyAll(); + + } + + + @Test + public void testSetMissingConfigurationsHBaseNotIncluded() throws Exception { + EasyMockSupport mockSupport = new EasyMockSupport(); + + AmbariManagementController mockMgmtController = + mockSupport.createMock(AmbariManagementController.class); + ResourceProvider mockServiceProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockHostComponentProvider = + mockSupport.createMock(ResourceProvider.class); + ResourceProvider mockConfigGroupProvider = + mockSupport.createMock(ResourceProvider.class); + AmbariManagementController mockManagementController = + mockSupport.createMock(AmbariManagementController.class); + StackServiceResponse mockStackServiceResponseOne = + mockSupport.createMock(StackServiceResponse.class); + StackServiceComponentResponse mockStackComponentResponse = + mockSupport.createMock(StackServiceComponentResponse.class); + AmbariMetaInfo mockAmbariMetaInfo = + mockSupport.createMock(AmbariMetaInfo.class); + + expect(mockStackComponentResponse.getComponentName()).andReturn("HBASE_SERVER"); + expect(mockStackComponentResponse.getCardinality()).andReturn("1"); + expect(mockStackComponentResponse.getAutoDeploy()).andReturn(new AutoDeployInfo()); + + expect(mockStackServiceResponseOne.getServiceName()).andReturn("HBASE"); + expect(mockManagementController.getStackServices(isA(Set.class))).andReturn(Collections.singleton(mockStackServiceResponseOne)); + expect(mockManagementController.getStackComponents(isA(Set.class))).andReturn(Collections.singleton(mockStackComponentResponse)); + expect(mockManagementController.getStackConfigurations(isA(Set.class))).andReturn(Collections.<StackConfigurationResponse>emptySet()); + + expect(mockAmbariMetaInfo.getComponentDependencies("HDP", "2.1", "HBASE", "HBASE_SERVER")).andReturn(Collections.<DependencyInfo>emptyList()); + + mockSupport.replayAll(); + + ClusterResourceProvider.init(null, mockAmbariMetaInfo, null); + + BaseBlueprintProcessor.Stack stack = + new BaseBlueprintProcessor.Stack("HDP", "2.1", mockManagementController); + + ClusterResourceProvider clusterResourceProvider = + new TestClusterResourceProvider(mockMgmtController, mockServiceProvider, + mockComponentProvider, mockHostProvider, mockHostComponentProvider, mockConfigGroupProvider); + + HostGroupEntity hostGroup = new HostGroupEntity(); + hostGroup.setComponents(Collections.<HostGroupComponentEntity>emptyList()); + HostGroupConfigEntity configEntity = new HostGroupConfigEntity(); + configEntity.setConfigData(""); + + hostGroup.setConfigurations(Collections.singletonList(configEntity)); + BaseBlueprintProcessor.HostGroupImpl hostGroupImpl = + new BaseBlueprintProcessor.HostGroupImpl(hostGroup, stack, null); + // blueprint request will not include a reference to an HBASE component + hostGroupImpl.addComponent("COMPONENT_ONE"); + + // add empty map for core-site, to simulate this configuration entry + clusterResourceProvider.getClusterConfigurations().put("core-site", new HashMap<String, String>()); + + clusterResourceProvider.setMissingConfigurations(Collections.singletonMap("host_group_one", hostGroupImpl)); + + Map<String, String> mapCoreSiteConfig = + clusterResourceProvider.getClusterConfigurations().get("core-site"); + + assertNotNull("core-site map was null.", mapCoreSiteConfig); + assertEquals("Incorrect number of entries in the core-site config map", + 0, mapCoreSiteConfig.size()); + + mockSupport.verifyAll(); + + } + + private class TestClusterResourceProvider extends ClusterResourceProvider { private ResourceProvider serviceResourceProvider;
