From 63083ec582db679b18b81c94e9cc9b1c2d284128 Mon Sep 17 00:00:00 2001 From: Balazs Bence Sari <> Date: Wed, 21 Feb 2018 17:01:47 +0100 Subject: [PATCH 1/6] AMBARI-23032 fix execptions, export cluster settings and single mpacks (benyoka) --- .../render/ClusterBlueprintRenderer.java | 102 +++++++++++------- .../internal/ExportBlueprintRequest.java | 14 +-- .../render/ClusterBlueprintRendererTest.java | 59 +++++++--- 3 files changed, 116 insertions(+), 59 deletions(-) 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 deb13db607a..497c229598b 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 @@ -18,6 +18,8 @@ package org.apache.ambari.server.api.query.render; +import static java.util.stream.Collectors.toList; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -26,10 +28,12 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.api.query.QueryInfo; +import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.api.services.Request; import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultImpl; @@ -68,7 +72,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Iterables; +import com.google.common.collect.ImmutableMap; /** * Renderer which renders a cluster resource as a blueprint. @@ -80,6 +84,12 @@ public class ClusterBlueprintRenderer extends BaseRenderer implements Renderer { */ private AmbariManagementController controller = AmbariServer.getController(); + + /** + * MetaInfo used to get stack and mpack information. + */ + private AmbariMetaInfo metaInfo = controller.getAmbariMetaInfo(); + // /** // * Map of configuration type to configuration properties which are required that a user // * input. These properties will be stripped from the exported blueprint. @@ -106,17 +116,28 @@ public TreeNode> finalizeProperties( resultTree.addChild(new HashSet<>(), configType); } + if (resultTree.getChild(Resource.Type.ClusterSetting.name()) == null) { + resultTree.addChild(new HashSet<>(), Resource.Type.ClusterSetting.name()); + } + + String serviceGroupType = Resource.Type.ServiceGroup.name(); + if (resultTree.getChild(serviceGroupType) == null) { + resultTree.addChild(new HashSet<>(), serviceGroupType); + } + + TreeNode> serviceGroupNode = resultTree.getChild(serviceGroupType); String serviceType = Resource.Type.Service.name(); - if (resultTree.getChild(serviceType) == null) { - resultTree.addChild(new HashSet<>(), serviceType); + if (serviceGroupNode.getChild(serviceType) == null) { + serviceGroupNode.addChild(new HashSet<>(), serviceType); } - TreeNode> serviceNode = resultTree.getChild(serviceType); + + TreeNode> serviceNode = serviceGroupNode.getChild(serviceType); if (serviceNode == null) { - serviceNode = resultTree.addChild(new HashSet<>(), serviceType); + serviceNode = serviceGroupNode.addChild(new HashSet<>(), serviceType); } + String serviceComponentType = Resource.Type.Component.name(); - TreeNode> serviceComponentNode = resultTree.getChild( - serviceType + "/" + serviceComponentType); + TreeNode> serviceComponentNode = serviceNode.getChild(serviceComponentType); if (serviceComponentNode == null) { serviceComponentNode = serviceNode.addChild(new HashSet<>(), serviceComponentType); } @@ -198,11 +219,10 @@ private Resource createBlueprintResource(TreeNode clusterNode) { configProcessor.doUpdateForBlueprintExport(); Set stackIds = topology.getBlueprint().getStackIds(); - if (stackIds.size() == 1) { - StackId stackId = Iterables.getOnlyElement(stackIds); - blueprintResource.setProperty("Blueprints/stack_name", stackId.getStackName()); - blueprintResource.setProperty("Blueprints/stack_version", stackId.getStackVersion()); - } + // TODO: mpacks should come from service groups once https://github.com/apache/ambari/pull/234 will be committed + Collection> mpackInstances = stackIds.stream(). + map( stackId -> ImmutableMap.of("name", stackId.getStackName(), "version", stackId.getStackVersion())).collect(toList()); + blueprintResource.setProperty(BlueprintResourceProvider.MPACK_INSTANCES_PROPERTY_ID, mpackInstances); if (topology.isClusterKerberosEnabled()) { Map securityConfigMap = new LinkedHashMap<>(); @@ -238,7 +258,7 @@ private Resource createBlueprintResource(TreeNode clusterNode) { /*** * Constructs the Settings object of the following form: * "settings": [ { - "recovery_settings": [ + "cluster_settings": [ { "recovery_enabled": "true" } ] }, @@ -262,6 +282,8 @@ private Resource createBlueprintResource(TreeNode clusterNode) { "recovery_enabled": "true" } ] } ] * + * NOTE: As of 3.0 global recovery settings will move under a new section called cluster_settings. + * * @param clusterNode * @return A Collection> which represents the Setting Object */ @@ -271,25 +293,27 @@ private Collection> getSettings(TreeNode clusterNo //Initialize collections to create appropriate json structure Collection> blueprintSetting = new ArrayList<>(); - Set> recoverySettingValue = new HashSet<>(); Set> serviceSettingValue = new HashSet<>(); Set> componentSettingValue = new HashSet<>(); - HashMap property = new HashMap<>(); - HashMap componentProperty = new HashMap<>(); - Boolean globalRecoveryEnabled = false; - //Fetch the services, to obtain ServiceInfo and ServiceComponents - Collection> serviceChildren = clusterNode.getChild("services").getChildren(); + // TODO: set mpack instance if needed (multi-mpack case) + Collection> serviceChildren = + clusterNode.getChild("servicegroups"). + getChildren().stream().flatMap( + node -> node.getChild("services").getChildren().stream()). + collect(toList()); + + HashMap serviceProperty; for (TreeNode serviceNode : serviceChildren) { ResourceImpl service = (ResourceImpl) serviceNode.getObject(); Map ServiceInfoMap = service.getPropertiesMap().get("ServiceInfo"); //service_settings population - property = new HashMap<>(); + serviceProperty = new HashMap<>(); if (ServiceInfoMap.get("credential_store_enabled").equals("true")) { - property.put("name", ServiceInfoMap.get("service_name").toString()); - property.put("credential_store_enabled", "true"); + serviceProperty.put("name", ServiceInfoMap.get("service_name").toString()); + serviceProperty.put("credential_store_enabled", "true"); } //Fetch the service Components to obtain ServiceComponentInfo @@ -299,34 +323,36 @@ private Collection> getSettings(TreeNode clusterNo Map 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"); + serviceProperty.put("name", ServiceInfoMap.get("service_name").toString()); + serviceProperty.put("recovery_enabled", "true"); //component_settings population - componentProperty = new HashMap<>(); + HashMap componentProperty = new HashMap<>(); componentProperty.put("name", ServiceComponentInfoMap.get("component_name").toString()); componentProperty.put("recovery_enabled", "true"); + componentSettingValue.add(componentProperty); } } - if (!property.isEmpty()) - serviceSettingValue.add(property); - if (!componentProperty.isEmpty()) - componentSettingValue.add(componentProperty); + if (!serviceProperty.isEmpty()) + serviceSettingValue.add(serviceProperty); } - //recovery_settings population - property = new HashMap<>(); - if (globalRecoveryEnabled) { - property.put("recovery_enabled", "true"); - } else { - property.put("recovery_enabled", "false"); + + // Add cluster settings + Set> clusterSettings = new HashSet<>(); + TreeNode settingsNode = clusterNode.getChild("settings"); + if (null != settingsNode) { + for (TreeNode clusterSettingNode: settingsNode.getChildren()) { + Map nodeProperties = clusterSettingNode.getObject().getPropertiesMap().get("ClusterSettingInfo"); + String key = Objects.toString(nodeProperties.get("cluster_setting_name")); + String value = Objects.toString(nodeProperties.get("cluster_setting_value")); + clusterSettings.add(ImmutableMap.of(key, value)); + } } - recoverySettingValue.add(property); //Add all the different setting values. Map settingMap = new HashMap<>(); - settingMap.put("recovery_settings", recoverySettingValue); + settingMap.put("cluster_settings", clusterSettings); blueprintSetting.add(settingMap); settingMap = new HashMap<>(); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java index 13ae732cec5..4d2fd4ac513 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java @@ -46,11 +46,11 @@ import org.apache.ambari.server.topology.HostGroup; import org.apache.ambari.server.topology.HostGroupImpl; import org.apache.ambari.server.topology.HostGroupInfo; -import org.apache.ambari.server.topology.InvalidTopologyTemplateException; -import org.apache.ambari.server.topology.TopologyRequest; +import org.apache.ambari.server.topology.InvalidTopologyTemplateException;import org.apache.ambari.server.topology.TopologyRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; /** @@ -154,14 +154,16 @@ private void createHostGroupInfo(Collection exportedHostGroup private Stack parseStack(Resource clusterResource) throws InvalidTopologyTemplateException { - String[] stackTokens = String.valueOf(clusterResource.getPropertyValue( - ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID)).split("-"); + Splitter splitter = Splitter.on('-').limit(2); // We are only interested to split on the first '-', e.g. + // HDPCORE-1.0.0-b46 should split to HDPCORE, 1.0.0-b46 + List stackTokens = splitter.splitToList(clusterResource.getPropertyValue( + ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID).toString()); try { - return new Stack(stackTokens[0], stackTokens[1], controller); + return new Stack(stackTokens.get(0), stackTokens.get(1), controller); } catch (AmbariException e) { throw new InvalidTopologyTemplateException(String.format( - "The specified stack doesn't exist: name=%s version=%s", stackTokens[0], stackTokens[1])); + "The specified stack doesn't exist: name=%s version=%s", stackTokens.get(0), stackTokens.get(1))); } } 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 7a1ce8b2175..1fa8a3a156b 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 @@ -288,7 +288,23 @@ public TreeNode createResultTreeSettingsObject(TreeNode resu TreeNode clusterTree = resultTree.addChild(clusterResource, "Cluster:1"); - TreeNode servicesTree = clusterTree.addChild(null, "services"); + // Add global recovery_enabled as cluster setting + TreeNode settingsNode = clusterTree.addChild(null, "settings"); + Resource clusterSettingResource = new ResourceImpl(Resource.Type.ClusterSetting); + clusterSettingResource.setProperty("ClusterSettingInfo/cluster_setting_name", "recovery_enabled"); + clusterSettingResource.setProperty("ClusterSettingInfo/cluster_setting_value", "true"); + settingsNode.addChild(clusterSettingResource, "ClusterSetting:1"); + + TreeNode serviceGroupsTree = clusterTree.addChild(null, "servicegroups"); + Resource serviceGroupResource = new ResourceImpl(Resource.Type.ServiceGroup); + serviceGroupResource.setProperty("ServiceGroupInfo/cluster_id", "1"); + serviceGroupResource.setProperty("ServiceGroupInfo/cluster_name", "c1"); + serviceGroupResource.setProperty("ServiceGroupInfo/service_group_id", "1"); + serviceGroupResource.setProperty("ServiceGroupInfo/service_group_name", "core"); + TreeNode serviceGroup1Tree = serviceGroupsTree.addChild(serviceGroupResource, "ServiceGroup:1"); + clusterTree.addChild(serviceGroupsTree); + + TreeNode servicesTree = serviceGroup1Tree.addChild(null, "services"); servicesTree.setProperty("isCollection", "true"); //Scenario 1 : Service with Credential Store enabled, Recovery enabled for Component:1 and not for Component:2 @@ -381,15 +397,15 @@ public void testGetSettings_instance(){ assertTrue(children.containsKey("settings")); List> settingValues = (ArrayList)children.get("settings"); - Boolean isRecoverySettings = false; + Boolean isClusterSettings = false; Boolean isComponentSettings = false; Boolean isServiceSettings = false; //Verify actual values for(Map settingProp : settingValues){ - if(settingProp.containsKey("recovery_settings")){ - isRecoverySettings = true; - HashSet> checkPropSize = (HashSet)settingProp.get("recovery_settings"); + if(settingProp.containsKey("cluster_settings")){ + isClusterSettings = true; + HashSet> checkPropSize = (HashSet)settingProp.get("cluster_settings"); assertEquals(1,checkPropSize.size()); assertEquals("true",checkPropSize.iterator().next().get("recovery_enabled")); @@ -416,7 +432,7 @@ public void testGetSettings_instance(){ } } //Verify if required information is present in actual result - assertTrue(isRecoverySettings); + assertTrue(isClusterSettings); assertTrue(isComponentSettings); assertTrue(isServiceSettings); @@ -461,8 +477,7 @@ public void testFinalizeResult_kerberos() throws Exception{ Resource blueprintResource = blueprintNode.getObject(); Map> properties = blueprintResource.getPropertiesMap(); - assertEquals(STACK_ID.getStackName(), properties.get("Blueprints").get("stack_name")); - assertEquals(STACK_ID.getStackVersion(), properties.get("Blueprints").get("stack_version")); + checkMpackInstance(properties); Map securityProperties = (Map) properties.get("Blueprints").get("security"); assertEquals("KERBEROS", securityProperties.get("type")); @@ -487,8 +502,7 @@ public void testFinalizeResult() throws Exception{ Resource blueprintResource = blueprintNode.getObject(); Map> properties = blueprintResource.getPropertiesMap(); - assertEquals(STACK_ID.getStackName(), properties.get("Blueprints").get("stack_name")); - assertEquals(STACK_ID.getStackVersion(), properties.get("Blueprints").get("stack_version")); + checkMpackInstance(properties); Collection> host_groups = (Collection>) properties.get("").get("host_groups"); assertEquals(2, host_groups.size()); @@ -566,8 +580,7 @@ public void testFinalizeResultWithAttributes() throws Exception{ Resource blueprintResource = blueprintNode.getObject(); Map> properties = blueprintResource.getPropertiesMap(); - assertEquals(STACK_ID.getStackName(), properties.get("Blueprints").get("stack_name")); - assertEquals(STACK_ID.getStackVersion(), properties.get("Blueprints").get("stack_version")); + checkMpackInstance(properties); Collection> host_groups = (Collection>) properties.get("").get("host_groups"); assertEquals(2, host_groups.size()); @@ -702,9 +715,18 @@ public Map> getPropertiesMap() { TreeNode clusterTree = resultTree.addChild(clusterResource, "Cluster:1"); - // add empty services resource for basic unit testing - Resource servicesResource = new ResourceImpl(Resource.Type.Service); - clusterTree.addChild(servicesResource, "services"); + // add a service group and empty services resource for basic unit testing + TreeNode serviceGroupsTree = clusterTree.addChild(null, "servicegroups"); + Resource serviceGroupResource = new ResourceImpl(Resource.Type.ServiceGroup); + serviceGroupResource.setProperty("ServiceGroupInfo/cluster_id", "1"); + serviceGroupResource.setProperty("ServiceGroupInfo/cluster_name", "c1"); + serviceGroupResource.setProperty("ServiceGroupInfo/service_group_id", "1"); + serviceGroupResource.setProperty("ServiceGroupInfo/service_group_name", "core"); + TreeNode serviceGroup1Tree = serviceGroupsTree.addChild(serviceGroupResource, "ServiceGroup:1"); + clusterTree.addChild(serviceGroupsTree); + + TreeNode servicesTree = serviceGroup1Tree.addChild(null, "services"); + servicesTree.setProperty("isCollection", "true"); Resource configurationsResource = new ResourceImpl(Resource.Type.Configuration); @@ -804,6 +826,13 @@ public Map> getPropertiesMap() { host3ComponentsTree.addChild(ttComponentResource, "HostComponent:2"); } + private void checkMpackInstance(Map> blueprintProperties) { + Map mpackInstanceProperties = + ((List>)blueprintProperties.get("").get("mpack_instances")).get(0); + assertEquals(STACK_ID.getStackName(), mpackInstanceProperties.get("name")); + assertEquals(STACK_ID.getStackVersion(), mpackInstanceProperties.get("version")); + } + private String getLocalHostName() throws UnknownHostException { return InetAddress.getLocalHost().getHostName(); } From 4ec039157a1c8469e1aae9cc6ae6e56f707b7fc1 Mon Sep 17 00:00:00 2001 From: Balazs Bence Sari <> Date: Thu, 22 Feb 2018 12:59:36 +0100 Subject: [PATCH 2/6] AMBARI-23032 fix review comments (benyoka) --- .../render/ClusterBlueprintRenderer.java | 74 +++++++------------ .../BlueprintConfigurationProcessor.java | 2 +- .../ClusterSettingResourceProvider.java | 7 +- .../internal/ExportBlueprintRequest.java | 13 ++-- 4 files changed, 38 insertions(+), 58 deletions(-) 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 497c229598b..120eec7a77c 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 @@ -46,6 +46,7 @@ import org.apache.ambari.server.controller.internal.ArtifactResourceProvider; import org.apache.ambari.server.controller.internal.BlueprintConfigurationProcessor; import org.apache.ambari.server.controller.internal.BlueprintResourceProvider; +import org.apache.ambari.server.controller.internal.ClusterSettingResourceProvider; import org.apache.ambari.server.controller.internal.ExportBlueprintRequest; import org.apache.ambari.server.controller.internal.RequestImpl; import org.apache.ambari.server.controller.internal.ResourceImpl; @@ -111,59 +112,38 @@ public TreeNode> finalizeProperties( copyPropertiesToResult(queryProperties, resultTree); - String configType = Resource.Type.Configuration.name(); - if (resultTree.getChild(configType) == null) { - resultTree.addChild(new HashSet<>(), configType); - } + getOrCreateChild(resultTree, Resource.Type.Configuration.name(), "properties"); - if (resultTree.getChild(Resource.Type.ClusterSetting.name()) == null) { - resultTree.addChild(new HashSet<>(), Resource.Type.ClusterSetting.name()); - } + getOrCreateChild(resultTree, Resource.Type.ClusterSetting.name()); - String serviceGroupType = Resource.Type.ServiceGroup.name(); - if (resultTree.getChild(serviceGroupType) == null) { - resultTree.addChild(new HashSet<>(), serviceGroupType); - } + TreeNode> serviceGroupNode = getOrCreateChild(resultTree, Resource.Type.ServiceGroup.name()); + TreeNode> serviceNode = getOrCreateChild(serviceGroupNode, Resource.Type.Service.name()); + getOrCreateChild(serviceNode, Resource.Type.Component.name(), + "ServiceComponentInfo/cluster_name", + "ServiceComponentInfo/service_name", + "ServiceComponentInfo/component_name", + "ServiceComponentInfo/recovery_enabled"); - TreeNode> serviceGroupNode = resultTree.getChild(serviceGroupType); - String serviceType = Resource.Type.Service.name(); - if (serviceGroupNode.getChild(serviceType) == null) { - serviceGroupNode.addChild(new HashSet<>(), serviceType); - } + TreeNode> hostNode = getOrCreateChild(resultTree, Resource.Type.Host.name()); + getOrCreateChild(hostNode, Resource.Type.HostComponent.name(), "HostRoles/component_name"); - TreeNode> serviceNode = serviceGroupNode.getChild(serviceType); - if (serviceNode == null) { - serviceNode = serviceGroupNode.addChild(new HashSet<>(), serviceType); - } + return resultTree; + } - String serviceComponentType = Resource.Type.Component.name(); - TreeNode> serviceComponentNode = serviceNode.getChild(serviceComponentType); - if (serviceComponentNode == null) { - serviceComponentNode = serviceNode.addChild(new HashSet<>(), serviceComponentType); + private TreeNode> getOrCreateChild(TreeNode> parent, + String resourceType, + String... properties) { + TreeNode> child = parent.getChild(resourceType); + if (null == child) { + child = parent.addChild(new HashSet<>(), resourceType); } - 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(); - TreeNode> hostComponentNode = resultTree.getChild( - hostType + "/" + hostComponentType); - - if (hostComponentNode == null) { - TreeNode> hostNode = resultTree.getChild(hostType); - if (hostNode == null) { - hostNode = resultTree.addChild(new HashSet<>(), hostType); - } - hostComponentNode = hostNode.addChild(new HashSet<>(), hostComponentType); + for (String property: properties) { + child.getObject().add(property); } - resultTree.getChild(configType).getObject().add("properties"); - hostComponentNode.getObject().add("HostRoles/component_name"); - - return resultTree; + return child; } + @Override public Result finalizeResult(Result queryResult) { TreeNode resultTree = queryResult.getResultTree(); @@ -343,9 +323,9 @@ private Collection> getSettings(TreeNode clusterNo TreeNode settingsNode = clusterNode.getChild("settings"); if (null != settingsNode) { for (TreeNode clusterSettingNode: settingsNode.getChildren()) { - Map nodeProperties = clusterSettingNode.getObject().getPropertiesMap().get("ClusterSettingInfo"); - String key = Objects.toString(nodeProperties.get("cluster_setting_name")); - String value = Objects.toString(nodeProperties.get("cluster_setting_value")); + Map nodeProperties = clusterSettingNode.getObject().getPropertiesMap().get(ClusterSettingResourceProvider.RESPONSE_KEY); + String key = Objects.toString(nodeProperties.get(ClusterSettingResourceProvider.CLUSTER_SETTING_NAME_PROPERTY_ID)); + String value = Objects.toString(nodeProperties.get(ClusterSettingResourceProvider.CLUSTER_SETTING_VALUE_PROPERTY_ID)); clusterSettings.add(ImmutableMap.of(key, value)); } } 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 8da1f51ee2c..5db49a65be8 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 @@ -522,7 +522,7 @@ public void doUpdateForBlueprintExport() { doFilterPriorToExport(configuration); } - } + } /** * This method iterates over the properties passed in, and applies a diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterSettingResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterSettingResourceProvider.java index 936826a4318..af2c11ebd01 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterSettingResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterSettingResourceProvider.java @@ -70,13 +70,16 @@ public class ClusterSettingResourceProvider extends AbstractControllerResourcePr // ----- Property ID constants --------------------------------------------- + public static final String CLUSTER_SETTING_NAME_PROPERTY_ID = "cluster_setting_name"; + public static final String CLUSTER_SETTING_VALUE_PROPERTY_ID = "cluster_setting_value"; + public static final String RESPONSE_KEY = "ClusterSettingInfo"; public static final String ALL_PROPERTIES = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "*"; public static final String CLUSTER_SETTING_CLUSTER_ID_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_id"; public static final String CLUSTER_SETTING_CLUSTER_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_name"; public static final String CLUSTER_SETTING_CLUSTER_SETTING_ID_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_setting_id"; - public static final String CLUSTER_SETTING_CLUSTER_SETTING_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_setting_name"; - public static final String CLUSTER_SETTING_CLUSTER_SETTING_VALUE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "cluster_setting_value"; + public static final String CLUSTER_SETTING_CLUSTER_SETTING_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + CLUSTER_SETTING_NAME_PROPERTY_ID; + public static final String CLUSTER_SETTING_CLUSTER_SETTING_VALUE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + CLUSTER_SETTING_VALUE_PROPERTY_ID; private static final Set pkPropertyIds = Sets.newHashSet(new String[]{ diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java index 4d2fd4ac513..dbb1b0edee0 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExportBlueprintRequest.java @@ -46,11 +46,11 @@ import org.apache.ambari.server.topology.HostGroup; import org.apache.ambari.server.topology.HostGroupImpl; import org.apache.ambari.server.topology.HostGroupInfo; -import org.apache.ambari.server.topology.InvalidTopologyTemplateException;import org.apache.ambari.server.topology.TopologyRequest; +import org.apache.ambari.server.topology.InvalidTopologyTemplateException; +import org.apache.ambari.server.topology.TopologyRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; /** @@ -154,16 +154,13 @@ private void createHostGroupInfo(Collection exportedHostGroup private Stack parseStack(Resource clusterResource) throws InvalidTopologyTemplateException { - Splitter splitter = Splitter.on('-').limit(2); // We are only interested to split on the first '-', e.g. - // HDPCORE-1.0.0-b46 should split to HDPCORE, 1.0.0-b46 - List stackTokens = splitter.splitToList(clusterResource.getPropertyValue( + StackId stackId = new StackId(clusterResource.getPropertyValue( ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID).toString()); - try { - return new Stack(stackTokens.get(0), stackTokens.get(1), controller); + return new Stack(stackId.getStackName(), stackId.getStackVersion(), controller); } catch (AmbariException e) { throw new InvalidTopologyTemplateException(String.format( - "The specified stack doesn't exist: name=%s version=%s", stackTokens.get(0), stackTokens.get(1))); + "The specified stack doesn't exist: name=%s version=%s", stackId.getStackName(), stackId.getStackVersion())); } } From bd2f0b3d952bf20c3f35d34c46f7cdfcae20234d Mon Sep 17 00:00:00 2001 From: Balazs Bence Sari <> Date: Thu, 22 Feb 2018 13:05:49 +0100 Subject: [PATCH 3/6] AMBARI-23032 better method naming (benyoka) --- .../render/ClusterBlueprintRenderer.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 120eec7a77c..6a2b43d93c1 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 @@ -112,27 +112,27 @@ public TreeNode> finalizeProperties( copyPropertiesToResult(queryProperties, resultTree); - getOrCreateChild(resultTree, Resource.Type.Configuration.name(), "properties"); + ensureChild(resultTree, Resource.Type.Configuration.name(), "properties"); - getOrCreateChild(resultTree, Resource.Type.ClusterSetting.name()); + ensureChild(resultTree, Resource.Type.ClusterSetting.name()); - TreeNode> serviceGroupNode = getOrCreateChild(resultTree, Resource.Type.ServiceGroup.name()); - TreeNode> serviceNode = getOrCreateChild(serviceGroupNode, Resource.Type.Service.name()); - getOrCreateChild(serviceNode, Resource.Type.Component.name(), + TreeNode> serviceGroupNode = ensureChild(resultTree, Resource.Type.ServiceGroup.name()); + TreeNode> serviceNode = ensureChild(serviceGroupNode, Resource.Type.Service.name()); + ensureChild(serviceNode, Resource.Type.Component.name(), "ServiceComponentInfo/cluster_name", "ServiceComponentInfo/service_name", "ServiceComponentInfo/component_name", "ServiceComponentInfo/recovery_enabled"); - TreeNode> hostNode = getOrCreateChild(resultTree, Resource.Type.Host.name()); - getOrCreateChild(hostNode, Resource.Type.HostComponent.name(), "HostRoles/component_name"); + TreeNode> hostNode = ensureChild(resultTree, Resource.Type.Host.name()); + ensureChild(hostNode, Resource.Type.HostComponent.name(), "HostRoles/component_name"); return resultTree; } - private TreeNode> getOrCreateChild(TreeNode> parent, - String resourceType, - String... properties) { + private TreeNode> ensureChild(TreeNode> parent, + String resourceType, + String... properties) { TreeNode> child = parent.getChild(resourceType); if (null == child) { child = parent.addChild(new HashSet<>(), resourceType); From 33c0f20cfc4a09c5d2fc698af5597a4b6af91a39 Mon Sep 17 00:00:00 2001 From: Balazs Bence Sari <> Date: Thu, 22 Feb 2018 14:33:52 +0100 Subject: [PATCH 4/6] AMBARI-23032 fix review comments #2 (benyoka) --- .../render/ClusterBlueprintRenderer.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 6a2b43d93c1..4a822dc9d44 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 @@ -112,30 +112,30 @@ public TreeNode> finalizeProperties( copyPropertiesToResult(queryProperties, resultTree); - ensureChild(resultTree, Resource.Type.Configuration.name(), "properties"); + ensureChild(resultTree, Resource.Type.Configuration, "properties"); - ensureChild(resultTree, Resource.Type.ClusterSetting.name()); + ensureChild(resultTree, Resource.Type.ClusterSetting); - TreeNode> serviceGroupNode = ensureChild(resultTree, Resource.Type.ServiceGroup.name()); - TreeNode> serviceNode = ensureChild(serviceGroupNode, Resource.Type.Service.name()); - ensureChild(serviceNode, Resource.Type.Component.name(), + TreeNode> serviceGroupNode = ensureChild(resultTree, Resource.Type.ServiceGroup); + TreeNode> serviceNode = ensureChild(serviceGroupNode, Resource.Type.Service); + ensureChild(serviceNode, Resource.Type.Component, "ServiceComponentInfo/cluster_name", "ServiceComponentInfo/service_name", "ServiceComponentInfo/component_name", "ServiceComponentInfo/recovery_enabled"); - TreeNode> hostNode = ensureChild(resultTree, Resource.Type.Host.name()); - ensureChild(hostNode, Resource.Type.HostComponent.name(), "HostRoles/component_name"); + TreeNode> hostNode = ensureChild(resultTree, Resource.Type.Host); + ensureChild(hostNode, Resource.Type.HostComponent, "HostRoles/component_name"); return resultTree; } private TreeNode> ensureChild(TreeNode> parent, - String resourceType, + Resource.Type resourceType, String... properties) { - TreeNode> child = parent.getChild(resourceType); + TreeNode> child = parent.getChild(resourceType.name()); if (null == child) { - child = parent.addChild(new HashSet<>(), resourceType); + child = parent.addChild(new HashSet<>(), resourceType.name()); } for (String property: properties) { child.getObject().add(property); From aba404a311594f8a0f05312175dcaff1599b018e Mon Sep 17 00:00:00 2001 From: Balazs Bence Sari <> Date: Thu, 22 Feb 2018 14:36:54 +0100 Subject: [PATCH 5/6] AMBARI-23032 fix review comments #3 (benyoka) --- .../controller/internal/BlueprintConfigurationProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5db49a65be8..8da1f51ee2c 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 @@ -522,7 +522,7 @@ public void doUpdateForBlueprintExport() { doFilterPriorToExport(configuration); } - } + } /** * This method iterates over the properties passed in, and applies a From 91f1560fa0d780c42003d1f1d6d6c9e5cb00e72e Mon Sep 17 00:00:00 2001 From: Balazs Bence Sari <> Date: Mon, 26 Feb 2018 12:26:03 +0100 Subject: [PATCH 6/6] AMBARI-23032 fix swallowed exceptions during mpack installation --- .../internal/MpackResourceProvider.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java index a867d11602d..3aefd42d659 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java @@ -159,12 +159,15 @@ public RequestStatus createResourcesAuthorized(final Request request) associatedResources.add(resource); return getRequestStatus(null, associatedResources); } - } catch (IOException e) { - if (e instanceof ConnectException) - throw new SystemException("The Mpack Uri : " + mpackRequest.getMpackUri() + " is not valid. Please try again"); - e.printStackTrace(); - } catch (BodyParseException e1) { - e1.printStackTrace(); + } + catch (ConnectException e) { + throw new SystemException("The Mpack Uri: " + mpackRequest.getMpackUri() + " is not valid. Please try again", e); + } + catch (IOException e) { + throw new SystemException("I/O exception occured during installing mpack: " + mpackRequest.getMpackUri(), e); + } + catch (BodyParseException e) { + throw new SystemException("Invalid mpack registration request", e); } return null; }