Browse Source

AMBARI-6957. Fixes NPE during cluster create with blueprint.

Robert Nettleton 10 years ago
parent
commit
6237724d4f

+ 25 - 12
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
      */
@@ -879,15 +886,21 @@ 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);
               }
             }
           }

+ 3 - 2
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());
   }
-}
+}

+ 62 - 11
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.

+ 494 - 3
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;