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>