You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2014/08/27 16:05:01 UTC
[20/35] git commit: AMBARI-6957. Fixes NPE during cluster create with
blueprint.
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/branch-alerts-dev
Commit: 6237724d4f5cb02bd1541deba6542a72be04af2a
Parents: 2cceee2
Author: Robert Nettleton <rn...@hortonworks.com>
Authored: Tue Aug 26 14:04:53 2014 -0400
Committer: John Speidel <js...@hortonworks.com>
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;