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

houyu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new b29aee0a BIGTOP-4442: Support resolve nested variables for service 
config (#224)
b29aee0a is described below

commit b29aee0a038558db7c8e8e1835a42ec9619d4f1a
Author: Zhiguo Wu <[email protected]>
AuthorDate: Mon Jun 16 11:29:09 2025 +0800

    BIGTOP-4442: Support resolve nested variables for service config (#224)
---
 .../manager/stack/core/executor/StackExecutor.java |  1 +
 .../manager/stack/core/spi/param/BaseParams.java   | 84 +++++++++++++++++++++-
 .../manager/stack/core/spi/param/Params.java       |  2 +
 .../stack/core/spi/param/BaseParamsTest.java       | 22 ++++++
 .../stack/infra/v1_0_0/grafana/GrafanaParams.java  |  6 +-
 pom.xml                                            |  2 -
 6 files changed, 109 insertions(+), 8 deletions(-)

diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java
index 4bfde11b..16067ffd 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java
@@ -83,6 +83,7 @@ public class StackExecutor {
                     .getClass()
                     .getDeclaredConstructor(ComponentCommandPayload.class)
                     .newInstance(payload);
+            params.initGlobalParams();
             if (Environments.isDevMode()) {
                 log.info("Executing {}::{} on dev mode", script.getName(), 
method.getName());
                 return ShellResult.success();
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
index 9f6f47a0..80693276 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
@@ -29,7 +29,6 @@ import 
org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
 import org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
-import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -44,17 +43,49 @@ import java.util.Map;
 @NoArgsConstructor
 public abstract class BaseParams implements Params {
 
-    @Getter
     protected final Map<String, Object> globalParamsMap = new HashMap<>();
 
+    private boolean globalParamsResolved = false;
+
+    private static int CURRENT_RESOLVING_DEPTH = 0;
+    private static final int MAX_RECURSION_DEPTH = 5;
+
     public static final String LIMITS_CONF_DIR = "/etc/security/limits.d";
 
     protected ComponentCommandPayload payload;
 
-    @SuppressWarnings("unchecked")
     protected BaseParams(ComponentCommandPayload payload) {
         this.payload = payload;
+    }
+
+    public void putGlobalParam(String key, Object value) {
+        if (value instanceof String s) {
+            if (s.contains("${") && s.contains("}")) {
+                globalParamsResolved = false;
+            }
+        }
+
+        globalParamsMap.put(key, value);
+    }
+
+    public Object getGlobalParam(String key) {
+        if (!globalParamsResolved) {
+            recursivelyResolveGlobalParams();
+        }
+
+        return globalParamsMap.get(key);
+    }
+
+    public Map<String, Object> getGlobalParamsMap() {
+        if (!globalParamsResolved) {
+            recursivelyResolveGlobalParams();
+        }
+
+        return globalParamsMap;
+    }
 
+    @SuppressWarnings("unchecked")
+    public void initGlobalParams() {
         // Global Parameters Injection
         Method[] declaredMethods = this.getClass().getDeclaredMethods();
         for (Method declaredMethod : declaredMethods) {
@@ -67,7 +98,54 @@ public abstract class BaseParams implements Params {
                 log.warn("Get {} Params error", declaredMethod, e);
             }
         }
+
         globalParamsMap.remove("content");
+
+        recursivelyResolveGlobalParams();
+        globalParamsResolved = true;
+    }
+
+    private void recursivelyResolveGlobalParams() {
+        CURRENT_RESOLVING_DEPTH++;
+        boolean allResolved = true;
+        for (Map.Entry<String, Object> entry : globalParamsMap.entrySet()) {
+            if (entry.getValue() instanceof String value) {
+                while (value.contains("${") && value.contains("}")) {
+                    allResolved = false;
+                    int start = -1, end = -1;
+                    for (int i = 0; i < value.length(); i++) {
+                        if (value.startsWith("${", i)) {
+                            start = i;
+                        } else if (value.charAt(i) == '}') {
+                            end = i;
+                            break;
+                        }
+                    }
+                    if (start != -1 && end != -1) {
+                        String key = value.substring(start + 2, end);
+                        Object resolvedValue = globalParamsMap.get(key);
+                        if (resolvedValue != null) {
+                            value = value.substring(0, start) + resolvedValue 
+ value.substring(end + 1);
+                            entry.setValue(value);
+                        } else {
+                            // Log a warning if the key is not found
+                            log.warn("Parameter '{}' not found for replacement 
in '{}'", key, entry.getKey());
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (!allResolved) {
+            if (CURRENT_RESOLVING_DEPTH >= MAX_RECURSION_DEPTH) {
+                CURRENT_RESOLVING_DEPTH = 0;
+            } else {
+                recursivelyResolveGlobalParams();
+            }
+        } else {
+            CURRENT_RESOLVING_DEPTH = 0;
+        }
     }
 
     public String hostname() {
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/Params.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/Params.java
index 231a9dd1..3ab509dc 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/Params.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/Params.java
@@ -27,6 +27,8 @@ import java.util.List;
 
 public interface Params extends PrioritySPI {
 
+    void initGlobalParams();
+
     String confDir();
 
     String user();
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
index 59d53a81..782e6d36 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
@@ -37,6 +37,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mockStatic;
@@ -105,6 +106,27 @@ public class BaseParamsTest {
         netUtilsMockedStatic.close();
     }
 
+    @Test
+    public void testInitGlobalParams() {
+        Map<String, Object> globalParamsMap = 
mockBaseParams.getGlobalParamsMap();
+        globalParamsMap.put("a1", "k1");
+        globalParamsMap.put("a2", "k2");
+        globalParamsMap.put("a3", "k3");
+        globalParamsMap.put("k1_k2", "kk1");
+        globalParamsMap.put("kk1_k3", "value");
+        globalParamsMap.put("key", "${key3}");
+        globalParamsMap.put("key1", "${k1_${a2}}_${a3}");
+        globalParamsMap.put("key2", "${${k1_${a2}}_${a3}}");
+        globalParamsMap.put("key3", "${key1}");
+        globalParamsMap.put("key4", "${not_exists}");
+        mockBaseParams.initGlobalParams();
+        assertEquals("kk1_k3", globalParamsMap.get("key"));
+        assertEquals("kk1_k3", globalParamsMap.get("key1"));
+        assertEquals("value", mockBaseParams.getGlobalParamsMap().get("key2"));
+        assertEquals("kk1_k3", globalParamsMap.get("key3"));
+        assertEquals("${not_exists}", globalParamsMap.get("key4"));
+    }
+
     @Test
     public void testHostname() {
         String hostname = mockBaseParams.hostname();
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/grafana/GrafanaParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/grafana/GrafanaParams.java
index 118471c6..ff7e2ca2 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/grafana/GrafanaParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/grafana/GrafanaParams.java
@@ -110,11 +110,11 @@ public class GrafanaParams extends InfraParams {
         }
         prometheusServer = prometheusServers.get(0);
 
-        Map<String, Object> prometheus_configuration = 
LocalSettings.configurations("prometheus", "prometheus");
-        if (prometheus_configuration == null) {
+        Map<String, Object> prometheusConf = 
LocalSettings.configurations("prometheus", "prometheus");
+        if (prometheusConf == null) {
             return configuration;
         }
-        prometheusPort = (String) prometheus_configuration.get("port");
+        prometheusPort = (String) prometheusConf.get("port");
         return configuration;
     }
 
diff --git a/pom.xml b/pom.xml
index ea20a708..b5f1f474 100644
--- a/pom.xml
+++ b/pom.xml
@@ -226,9 +226,7 @@
                     <configuration>
                         <source>${java.version}</source>
                         <failOnError>false</failOnError>
-                        <aggregate>true</aggregate>
                         <skip>${maven.javadoc.skip}</skip>
-                        <additionalparam>-Xdoclint:none</additionalparam>
                     </configuration>
                     <executions>
                         <execution>

Reply via email to