You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ho...@apache.org on 2023/03/18 14:37:32 UTC

[ambari] branch trunk updated: AMBARI-25887: Disable host encode for existing hive database when export blueprint configuration (#3659)

This is an automated email from the ASF dual-hosted git repository.

houyu pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new e68b7d3988 AMBARI-25887: Disable host encode for existing hive database when export blueprint configuration (#3659)
e68b7d3988 is described below

commit e68b7d39884895aec24198a13557666c815b7107
Author: Zhiguo Wu <wu...@apache.org>
AuthorDate: Sat Mar 18 22:37:26 2023 +0800

    AMBARI-25887: Disable host encode for existing hive database when export blueprint configuration (#3659)
---
 .../internal/BlueprintConfigurationProcessor.java  | 104 +++++++++++++++------
 1 file changed, 76 insertions(+), 28 deletions(-)

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 b3540dce5d..bd060c8ea9 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
@@ -1508,38 +1508,33 @@ public class BlueprintConfigurationProcessor {
     Map<String, Map<String, String>> properties = configuration.getFullProperties();
     for (Map.Entry<String, Map<String, PropertyUpdater>> entry : updaters.entrySet()) {
       String type = entry.getKey();
-      for (String propertyName : entry.getValue().keySet()) {
+      Map<String, PropertyUpdater> propertyNameUpdaters = entry.getValue();
+      for (Map.Entry<String, PropertyUpdater> propertyNameUpdater : propertyNameUpdaters.entrySet()) {
+        String propertyName = propertyNameUpdater.getKey();
+        PropertyUpdater propertyUpdater = propertyNameUpdater.getValue();
         boolean matchedHost = false;
 
         Map<String, String> typeProperties = properties.get(type);
         if (typeProperties != null && typeProperties.containsKey(propertyName)) {
           String propValue = typeProperties.get(propertyName);
 
-          for (HostGroupInfo groupInfo : clusterTopology.getHostGroupInfo().values()) {
-            Collection<String> hosts = groupInfo.getHostNames();
-            for (String host : hosts) {
-              //todo: need to use regular expression to avoid matching a host which is a superset.
-              if (propValue.contains(host)) {
-                matchedHost = true;
-                configuration.setProperty(type, propertyName,
-                  propValue.replace(host, "%HOSTGROUP::" + groupInfo.getHostGroupName() + "%"));
-                break;
-              }
-            }
-            if (matchedHost) {
-              break;
-            }
+          String replacedValue = propertyUpdater.updateForBlueprintExport(propertyName, propValue, properties, clusterTopology);
+          if (!replacedValue.equals(propValue)) {
+            matchedHost = true;
+            configuration.setProperty(type, propertyName, replacedValue);
           }
+
           // remove properties that do not contain hostnames,
           // except in the case of HA-related properties, that
           // can contain nameservice references instead of hostnames (Fix for Bug AMBARI-7458).
           // also will not remove properties that reference the special 0.0.0.0 network
           // address or properties with undefined hosts
-          if (! matchedHost &&
-            ! isNameServiceProperty(propertyName) &&
-            ! isSpecialNetworkAddress(propValue)  &&
-            ! isUndefinedAddress(propValue) &&
-            ! isPlaceholder(propValue)) {
+          if (!matchedHost &&
+                  !isNameServiceProperty(propertyName) &&
+                  !isDatabaseConnectionURL(propertyName) &&
+                  !isSpecialNetworkAddress(propValue)  &&
+                  !isUndefinedAddress(propValue) &&
+                  !isPlaceholder(propValue)) {
 
             configuration.removeProperty(type, propertyName);
           }
@@ -1572,6 +1567,17 @@ public class BlueprintConfigurationProcessor {
     return configPropertiesWithHASupport.contains(propertyName);
   }
 
+  /**
+   * Determine if a property is a database connection url.
+   *
+   * @param propertyName  property name
+   *
+   * @return true if the property value is a database connection url.
+   */
+  private static boolean isDatabaseConnectionURL(String propertyName) {
+    return propertyName.equals("javax.jdo.option.ConnectionURL");
+  }
+
   /**
    * Queries a property value to determine if the value contains
    *   a host address with all zeros (0.0.0.0).  This is a special
@@ -1608,17 +1614,14 @@ public class BlueprintConfigurationProcessor {
     Map<String, Map<String, String>> properties = configuration.getFullProperties();
     for (Map.Entry<String, Map<String, PropertyUpdater>> entry : updaters.entrySet()) {
       String type = entry.getKey();
-      for (String propertyName : entry.getValue().keySet()) {
+      Map<String, PropertyUpdater> propertyNameUpdaters = entry.getValue();
+      for (Map.Entry<String, PropertyUpdater> propertyNameUpdater : propertyNameUpdaters.entrySet()) {
+        String propertyName = propertyNameUpdater.getKey();
+        PropertyUpdater propertyUpdater = propertyNameUpdater.getValue();
         Map<String, String> typeProperties = properties.get(type);
         if (typeProperties != null && typeProperties.containsKey(propertyName)) {
           String propValue = typeProperties.get(propertyName);
-          for (HostGroupInfo groupInfo : clusterTopology.getHostGroupInfo().values()) {
-            Collection<String> hosts = groupInfo.getHostNames();
-            for (String host : hosts) {
-              propValue = propValue.replaceAll(host + "\\b", "%HOSTGROUP::" +
-                groupInfo.getHostGroupName() + "%");
-            }
-          }
+          propValue = propertyUpdater.updateForBlueprintExport(propertyName, propValue, properties, clusterTopology);
           Collection<String> addedGroups = new HashSet<>();
           String[] toks = propValue.split(",");
           boolean inBrackets = propValue.startsWith("[");
@@ -1967,6 +1970,24 @@ public class BlueprintConfigurationProcessor {
       }
     }
 
+    @Override
+    public String updateForBlueprintExport(String propertyName,
+                                           String value,
+                                           Map<String, Map<String, String>> properties,
+                                           ClusterTopology topology) {
+      for (HostGroupInfo groupInfo : topology.getHostGroupInfo().values()) {
+        Collection<String> hosts = groupInfo.getHostNames();
+        for (String host : hosts) {
+          //todo: need to use regular expression to avoid matching a host which is a superset.
+          if (value.contains(host)) {
+            return value.replace(host, "%HOSTGROUP::" + groupInfo.getHostGroupName() + "%");
+          }
+        }
+      }
+
+      return value;
+    }
+
     @Override
     public Collection<String> getRequiredHostGroups(String propertyName,
                                                     String origValue,
@@ -2216,6 +2237,18 @@ public class BlueprintConfigurationProcessor {
       }
     }
 
+    @Override
+    public String updateForBlueprintExport(String propertyName,
+                                           String value,
+                                           Map<String, Map<String, String>> properties,
+                                           ClusterTopology topology) {
+      if (isDatabaseManaged(properties)) {
+        return super.updateForBlueprintExport(propertyName, value, properties, topology);
+      } else {
+        return value;
+      }
+    }
+
     @Override
     public Collection<String> getRequiredHostGroups(String propertyName,
                                                     String origValue,
@@ -2321,6 +2354,21 @@ public class BlueprintConfigurationProcessor {
       return resolveHostGroupPlaceholder(origValue, hostStrings);
     }
 
+    @Override
+    public String updateForBlueprintExport(String propertyName,
+                                           String value,
+                                           Map<String, Map<String, String>> properties,
+                                           ClusterTopology topology) {
+      for (HostGroupInfo groupInfo : topology.getHostGroupInfo().values()) {
+        Collection<String> hosts = groupInfo.getHostNames();
+        for (String host : hosts) {
+          value = value.replaceAll(host + "\\b", "%HOSTGROUP::" + groupInfo.getHostGroupName() + "%");
+        }
+      }
+
+      return value;
+    }
+
     /**
      * Gets the prefix for hosts
      * @param value property value


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ambari.apache.org
For additional commands, e-mail: commits-help@ambari.apache.org