You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sm...@apache.org on 2017/02/10 02:39:36 UTC
ambari git commit: AMBARI-19909. Export Blueprints does not contain
the settings object and hence the credential store values (Madhuvanthi
Radhakrishnan via smohanty)
Repository: ambari
Updated Branches:
refs/heads/branch-2.5 f425159e3 -> f4e65c276
AMBARI-19909. Export Blueprints does not contain the settings object and hence the credential store values (Madhuvanthi Radhakrishnan via smohanty)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f4e65c27
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f4e65c27
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f4e65c27
Branch: refs/heads/branch-2.5
Commit: f4e65c2769751e290e58951cb144b67b33678892
Parents: f425159
Author: Sumit Mohanty <sm...@hortonworks.com>
Authored: Thu Feb 9 18:39:22 2017 -0800
Committer: Sumit Mohanty <sm...@hortonworks.com>
Committed: Thu Feb 9 18:39:22 2017 -0800
----------------------------------------------------------------------
.../query/render/ClusterBlueprintRenderer.java | 124 ++++++++++++++++
.../render/ClusterBlueprintRendererTest.java | 143 +++++++++++++++++++
2 files changed, 267 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/f4e65c27/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
index 1a9ea91..77ccc24 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
@@ -109,6 +109,20 @@ public class ClusterBlueprintRenderer extends BaseRenderer implements Renderer {
if (resultTree.getChild(serviceType) == null) {
resultTree.addChild(new HashSet<String>(), serviceType);
}
+ TreeNode<Set<String>> serviceNode = resultTree.getChild(serviceType);
+ if (serviceNode == null) {
+ serviceNode = resultTree.addChild(new HashSet<String>(), serviceType);
+ }
+ String serviceComponentType = Resource.Type.Component.name();
+ TreeNode<Set<String>> serviceComponentNode = resultTree.getChild(
+ serviceType + "/" + serviceComponentType);
+ if (serviceComponentNode == null) {
+ serviceComponentNode = serviceNode.addChild(new HashSet<String>(), serviceComponentType);
+ }
+ serviceComponentNode.getObject().add("ServiceComponentInfo/cluster_name");
+ serviceComponentNode.getObject().add("ServiceComponentInfo/service_name");
+ serviceComponentNode.getObject().add("ServiceComponentInfo/component_name");
+ serviceComponentNode.getObject().add("ServiceComponentInfo/recovery_enabled");
String hostType = Resource.Type.Host.name();
String hostComponentType = Resource.Type.HostComponent.name();
@@ -214,9 +228,119 @@ public class ClusterBlueprintRenderer extends BaseRenderer implements Renderer {
blueprintResource.setProperty("configurations", processConfigurations(topology));
+ //Fetch settings section for blueprint
+ blueprintResource.setProperty("settings", getSettings(clusterNode));
+
return blueprintResource;
}
+ /***
+ * Constructs the Settings object of the following form:
+ * "settings": [ {
+ "recovery_settings": [
+ {
+ "recovery_enabled": "true"
+ } ] },
+ {
+ "service_settings": [ {
+ "name": "HDFS",
+ "recovery_enabled": "true",
+ "credential_store_enabled": "true"
+ },
+ {
+ "name": "TEZ",
+ "recovery_enabled": "false"
+ },
+ {
+ "name": "HIVE",
+ "recovery_enabled": "false"
+ } ] },
+ {
+ "component_settings": [ {
+ "name": "DATANODE",
+ "recovery_enabled": "true"
+ } ] } ]
+ *
+ * @param clusterNode
+ * @return A Collection<Map<String, Object>> which represents the Setting Object
+ */
+ private Collection<Map<String, Object>> getSettings(TreeNode<Resource> clusterNode) {
+ LOG.info("ClusterBlueprintRenderer: getSettings()");
+
+ //Initialize collections to create appropriate json structure
+ Collection<Map<String, Object>> blueprintSetting = new ArrayList<Map<String, Object>>();
+
+ Set<Map<String, String>> recoverySettingValue = new HashSet<Map<String, String>>();
+ Set<Map<String, String>> serviceSettingValue = new HashSet<Map<String, String>>();
+ Set<Map<String, String>> componentSettingValue = new HashSet<Map<String, String>>();
+
+ HashMap<String, String> property = new HashMap<>();
+ HashMap<String, String> componentProperty = new HashMap<>();
+ Boolean globalRecoveryEnabled = false;
+
+ //Fetch the services, to obtain ServiceInfo and ServiceComponents
+ Collection<TreeNode<Resource>> serviceChildren = clusterNode.getChild("services").getChildren();
+ for (TreeNode serviceNode : serviceChildren) {
+ ResourceImpl service = (ResourceImpl) serviceNode.getObject();
+ Map<String, Object> ServiceInfoMap = service.getPropertiesMap().get("ServiceInfo");
+
+ //service_settings population
+ property = new HashMap<>();
+ if (ServiceInfoMap.get("credential_store_supported").equals("true")) {
+ if (ServiceInfoMap.get("credential_store_enabled").equals("true")) {
+ property.put("name", ServiceInfoMap.get("service_name").toString());
+ property.put("credential_store_enabled", "true");
+ }
+ }
+
+ //Fetch the service Components to obtain ServiceComponentInfo
+ Collection<TreeNode<Resource>> componentChildren = serviceNode.getChild("components").getChildren();
+ for (TreeNode componentNode : componentChildren) {
+ ResourceImpl component = (ResourceImpl) componentNode.getObject();
+ Map<String, Object> ServiceComponentInfoMap = component.getPropertiesMap().get("ServiceComponentInfo");
+
+ if (ServiceComponentInfoMap.get("recovery_enabled").equals("true")) {
+ globalRecoveryEnabled = true;
+ property.put("name", ServiceInfoMap.get("service_name").toString());
+ property.put("recovery_enabled", "true");
+
+ //component_settings population
+ componentProperty = new HashMap<>();
+ componentProperty.put("name", ServiceComponentInfoMap.get("component_name").toString());
+ componentProperty.put("recovery_enabled", "true");
+ }
+ }
+
+ if (!property.isEmpty())
+ serviceSettingValue.add(property);
+ if (!componentProperty.isEmpty())
+ componentSettingValue.add(componentProperty);
+ }
+ //recovery_settings population
+ property = new HashMap<>();
+ if (globalRecoveryEnabled) {
+ property.put("recovery_enabled", "true");
+ } else {
+ property.put("recovery_enabled", "false");
+ }
+ recoverySettingValue.add(property);
+
+ //Add all the different setting values.
+ Map<String, Object> settingMap = new HashMap<>();
+ settingMap.put("recovery_settings", recoverySettingValue);
+ blueprintSetting.add(settingMap);
+
+ settingMap = new HashMap<>();
+ settingMap.put("service_settings", serviceSettingValue);
+ blueprintSetting.add(settingMap);
+
+ settingMap = new HashMap<>();
+ settingMap.put("component_settings", componentSettingValue);
+ blueprintSetting.add(settingMap);
+
+ return blueprintSetting;
+ }
+
private Map<String, Object> getKerberosDescriptor(ClusterController clusterController, String clusterName) throws AmbariException {
PredicateBuilder pb = new PredicateBuilder();
Predicate predicate = pb.begin().property("Artifacts/cluster_name").equals(clusterName).and().
http://git-wip-us.apache.org/repos/asf/ambari/blob/f4e65c27/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
index 1fe48df..a761c62 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
@@ -56,6 +56,7 @@ import org.powermock.modules.junit4.PowerMockRunner;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -238,6 +239,148 @@ public class ClusterBlueprintRendererTest {
assertTrue(propertyTree.getChild("Host/HostComponent").getObject().contains("HostRoles/component_name"));
}
+ public TreeNode<Resource> createResultTreeSettingsObject(TreeNode<Resource> resultTree){
+ Resource clusterResource = new ResourceImpl(Resource.Type.Cluster);
+
+ clusterResource.setProperty("Clusters/cluster_name", "testCluster");
+ clusterResource.setProperty("Clusters/version", "HDP-1.3.3");
+
+ TreeNode<Resource> clusterTree = resultTree.addChild(clusterResource, "Cluster:1");
+
+ TreeNode<Resource> servicesTree = clusterTree.addChild(null, "services");
+ servicesTree.setProperty("isCollection", "true");
+
+ //Scenario 1 : Service with Credential Store enabled, Recovery enabled for Component:1 and not for Component:2
+ Resource serviceResource1 = new ResourceImpl(Resource.Type.Service);
+ serviceResource1.setProperty("ServiceInfo/service_name","Service:1");
+ serviceResource1.setProperty("ServiceInfo/credential_store_supported","true");
+ serviceResource1.setProperty("ServiceInfo/credential_store_enabled","true");
+ TreeNode<Resource> serviceTree = servicesTree.addChild(serviceResource1, "Service:1");
+
+ Resource ttComponentResource = new ResourceImpl(Resource.Type.Component);
+ ttComponentResource.setProperty("ServiceComponentInfo/component_name", "Component:1");
+ ttComponentResource.setProperty("ServiceComponentInfo/cluster_name", "testCluster");
+ ttComponentResource.setProperty("ServiceComponentInfo/service_name", "Service:1");
+ ttComponentResource.setProperty("ServiceComponentInfo/recovery_enabled", "true");
+
+ Resource dnComponentResource = new ResourceImpl(Resource.Type.Component);
+ dnComponentResource.setProperty("ServiceComponentInfo/component_name", "Component:2");
+ dnComponentResource.setProperty("ServiceComponentInfo/cluster_name", "testCluster");
+ dnComponentResource.setProperty("ServiceComponentInfo/service_name", "Service:1");
+ dnComponentResource.setProperty("ServiceComponentInfo/recovery_enabled", "false");
+
+ TreeNode<Resource> componentsTree1 = serviceTree.addChild(null, "components");
+ componentsTree1.setProperty("isCollection", "true");
+
+ componentsTree1.addChild(ttComponentResource, "Component:1");
+ componentsTree1.addChild(dnComponentResource, "Component:2");
+
+ //Scenario 2 :Service with Credential Store disabled, Recovery enabled for Component:1
+ Resource serviceResource2 = new ResourceImpl(Resource.Type.Service);
+ serviceResource2.setProperty("ServiceInfo/service_name","Service:2");
+ serviceResource2.setProperty("ServiceInfo/credential_store_supported","true");
+ serviceResource2.setProperty("ServiceInfo/credential_store_enabled","false");
+ serviceTree = servicesTree.addChild(serviceResource2, "Service:2");
+
+ ttComponentResource = new ResourceImpl(Resource.Type.Component);
+ ttComponentResource.setProperty("ServiceComponentInfo/component_name", "Component:1");
+ ttComponentResource.setProperty("ServiceComponentInfo/cluster_name", "testCluster");
+ ttComponentResource.setProperty("ServiceComponentInfo/service_name", "Service:2");
+ ttComponentResource.setProperty("ServiceComponentInfo/recovery_enabled", "true");
+
+ TreeNode<Resource> componentsTree2 = serviceTree.addChild(null, "components");
+ componentsTree2.setProperty("isCollection", "true");
+
+ componentsTree2.addChild(ttComponentResource, "Component:1");
+
+ //Scenario 3 :Service with both Credential Store and Recovery enabled as false
+ Resource serviceResource3 = new ResourceImpl(Resource.Type.Service);
+ serviceResource3.setProperty("ServiceInfo/service_name","Service:3");
+ serviceResource3.setProperty("ServiceInfo/credential_store_supported","false");
+ serviceResource3.setProperty("ServiceInfo/credential_store_enabled","false");
+ serviceTree = servicesTree.addChild(serviceResource3, "Service:3");
+
+ ttComponentResource = new ResourceImpl(Resource.Type.Component);
+ ttComponentResource.setProperty("ServiceComponentInfo/component_name", "Component:1");
+ ttComponentResource.setProperty("ServiceComponentInfo/cluster_name", "testCluster");
+ ttComponentResource.setProperty("ServiceComponentInfo/service_name", "Service:3");
+ ttComponentResource.setProperty("ServiceComponentInfo/recovery_enabled", "false");
+
+ TreeNode<Resource> componentsTree3 = serviceTree.addChild(null, "components");
+ componentsTree3.setProperty("isCollection", "true");
+
+ componentsTree3.addChild(ttComponentResource, "Component:1");
+
+ //Add empty configurations
+ Resource configurationsResource = new ResourceImpl(Resource.Type.Configuration);
+ clusterTree.addChild(configurationsResource, "configurations");
+
+ //Add empty hosts
+ Resource hostResource = new ResourceImpl(Resource.Type.Host);
+ clusterTree.addChild(hostResource, "hosts");
+
+ return resultTree;
+ }
+
+ @Test
+ public void testGetSettings_instance(){
+ Result result = new ResultImpl(true);
+
+ TreeNode<Resource> resultTree = createResultTreeSettingsObject(result.getResultTree());
+
+ ClusterBlueprintRenderer renderer = new TestBlueprintRenderer(topology);
+ Result blueprintResult = renderer.finalizeResult(result);
+ TreeNode<Resource> blueprintTree = blueprintResult.getResultTree();
+ TreeNode<Resource> blueprintNode = blueprintTree.getChildren().iterator().next();
+ Resource blueprintResource = blueprintNode.getObject();
+ Map<String, Map<String, Object>> propertiesMap = blueprintResource.getPropertiesMap();
+ Map<String,Object> children = propertiesMap.get("");
+
+ //Verify if required information is present in actual result
+ assertTrue(children.containsKey("settings"));
+
+ List<Map<String,Object>> settingValues = (ArrayList)children.get("settings");
+ Boolean isRecoverySettings = false;
+ Boolean isComponentSettings = false;
+ Boolean isServiceSettings = false;
+
+ //Verify actual values
+ for(Map<String,Object> settingProp : settingValues){
+ if(settingProp.containsKey("recovery_settings")){
+ isRecoverySettings = true;
+ HashSet<Map<String,String>> checkPropSize = (HashSet)settingProp.get("recovery_settings");
+ assertEquals(1,checkPropSize.size());
+ assertEquals("true",checkPropSize.iterator().next().get("recovery_enabled"));
+
+ }
+ if(settingProp.containsKey("component_settings")){
+ isComponentSettings = true;
+ HashSet<Map<String,String>> checkPropSize = (HashSet)settingProp.get("component_settings");
+ assertEquals(1,checkPropSize.size());
+ Map<String, String> finalProp = checkPropSize.iterator().next();
+ assertEquals("Component:1",finalProp.get("name"));
+ assertEquals("true",finalProp.get("recovery_enabled"));
+ }
+ if(settingProp.containsKey("service_settings")){
+ isServiceSettings = true;
+ HashSet<Map<String,String>> checkPropSize = (HashSet)settingProp.get("service_settings");
+ assertEquals(2,checkPropSize.size());
+ for(Map<String,String> finalProp : checkPropSize){
+ if(finalProp.containsKey("credential_store_enabled")){
+ assertEquals("Service:1",finalProp.get("name"));
+ assertEquals("true",finalProp.get("recovery_enabled"));
+ }
+ assertFalse(finalProp.get("name").equals("Service:3"));
+ }
+ }
+ }
+ //Verify if required information is present in actual result
+ assertTrue(isRecoverySettings);
+ assertTrue(isComponentSettings);
+ assertTrue(isServiceSettings);
+
+ }
+
@Test
public void testFinalizeProperties__instance_noComponentNode() {
QueryInfo rootQuery = new QueryInfo(new ClusterResourceDefinition(), new HashSet<String>());