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

wuzhiguo 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 b041addb BIGTOP-4488: Add required attribute for config property (#258)
b041addb is described below

commit b041addb6db65f1d4ef2966d54ae7e0b04582856
Author: Zhiguo Wu <[email protected]>
AuthorDate: Tue Aug 26 12:01:38 2025 +0800

    BIGTOP-4488: Add required attribute for config property (#258)
---
 .../ServerEventsListener.java}                     | 20 +++++++-----
 .../manager/server/mcp/tool/StackMcpTool.java      |  3 --
 .../bigtop/manager/server/model/dto/AttrsDTO.java  |  2 ++
 .../bigtop/manager/server/model/req/AttrsReq.java  |  2 ++
 .../bigtop/manager/server/model/vo/AttrsVO.java    |  2 ++
 .../manager/server/stack/model/AttrsModel.java     |  2 ++
 .../manager/server/utils/StackConfigUtils.java     |  1 +
 .../bigtop/manager/server/utils/StackUtils.java    | 12 ++++---
 .../services/zookeeper/configuration/zoo.cfg.xml   |  3 ++
 .../command/stage/AbstractComponentStageTest.java  | 37 +++++++++++-----------
 .../command/stage/ComponentAddStageTest.java       | 23 +++++++++++---
 .../command/stage/ComponentCheckStageTest.java     | 23 +++++++++++---
 .../command/stage/ComponentConfigureStageTest.java | 23 +++++++++++---
 .../command/stage/ComponentInitStageTest.java      | 23 +++++++++++---
 .../command/stage/ComponentPrepareStageTest.java   | 23 +++++++++++---
 .../command/stage/ComponentStartStageTest.java     | 23 +++++++++++---
 .../command/stage/ComponentStopStageTest.java      | 23 +++++++++++---
 .../manager/stack/infra/param/InfraParams.java     | 30 ------------------
 18 files changed, 176 insertions(+), 99 deletions(-)

diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/AttrsModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/config/ServerEventsListener.java
similarity index 61%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/AttrsModel.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/config/ServerEventsListener.java
index e765bde9..b12dc37e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/AttrsModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/config/ServerEventsListener.java
@@ -16,16 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.stack.model;
+package org.apache.bigtop.manager.server.config;
 
-import lombok.Data;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
-import jakarta.xml.bind.annotation.XmlAccessType;
-import jakarta.xml.bind.annotation.XmlAccessorType;
+import org.springframework.boot.context.event.ApplicationStartedEvent;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.EventListener;
 
-@Data
-@XmlAccessorType(XmlAccessType.FIELD)
-public class AttrsModel {
+@Configuration
+public class ServerEventsListener {
 
-    private String type;
+    @EventListener(ApplicationStartedEvent.class)
+    public void onApplicationReadyEvent() {
+        // Init stacks
+        StackUtils.parseStack();
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/mcp/tool/StackMcpTool.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/mcp/tool/StackMcpTool.java
index 229d6b78..f27bf40b 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/mcp/tool/StackMcpTool.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/mcp/tool/StackMcpTool.java
@@ -46,9 +46,6 @@ public class StackMcpTool implements McpTool {
         for (Map.Entry<StackDTO, List<ServiceDTO>> entry : 
StackUtils.STACK_SERVICE_MAP.entrySet()) {
             StackDTO stackDTO = entry.getKey();
             List<ServiceDTO> serviceDTOList = entry.getValue();
-            for (ServiceDTO serviceDTO : serviceDTOList) {
-                
serviceDTO.setConfigs(StackUtils.SERVICE_CONFIG_MAP.get(serviceDTO.getName()));
-            }
 
             StackVO stackVO = StackConverter.INSTANCE.fromDTO2VO(stackDTO);
             
stackVO.setServices(ServiceConverter.INSTANCE.fromDTO2VO(serviceDTOList));
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AttrsDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AttrsDTO.java
index 422846b0..b3552e78 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AttrsDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AttrsDTO.java
@@ -25,5 +25,7 @@ import java.io.Serializable;
 @Data
 public class AttrsDTO implements Serializable {
 
+    private Boolean required;
+
     private String type;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AttrsReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AttrsReq.java
index 71e26bc9..3f34aa61 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AttrsReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AttrsReq.java
@@ -23,5 +23,7 @@ import lombok.Data;
 @Data
 public class AttrsReq {
 
+    private Boolean required;
+
     private String type;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AttrsVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AttrsVO.java
index ec52426d..9738c0f2 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AttrsVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AttrsVO.java
@@ -23,5 +23,7 @@ import lombok.Data;
 @Data
 public class AttrsVO {
 
+    private Boolean required;
+
     private String type;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/AttrsModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/AttrsModel.java
index e765bde9..8222c2c4 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/AttrsModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/AttrsModel.java
@@ -27,5 +27,7 @@ import jakarta.xml.bind.annotation.XmlAccessorType;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class AttrsModel {
 
+    private Boolean required;
+
     private String type;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
index d4a86d7c..3ac22694 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
@@ -66,6 +66,7 @@ public class StackConfigUtils {
         if (propertyModel.getAttrs() != null) {
             AttrsModel attrsModel = propertyModel.getAttrs();
             AttrsDTO attrsDTO = new AttrsDTO();
+            attrsDTO.setRequired(attrsModel.getRequired());
             attrsDTO.setType(attrsModel.getType());
             propertyDTO.setAttrs(attrsDTO);
         }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackUtils.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackUtils.java
index 1f49dc47..42002e08 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackUtils.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackUtils.java
@@ -78,11 +78,13 @@ public class StackUtils {
 
     public static final DAG<String, ComponentCommandWrapper, DagGraphEdge> DAG 
= new DAG<>();
 
-    static {
-        parseStack();
-    }
+    private static boolean parsed = false;
+
+    public static synchronized void parseStack() {
+        if (parsed) {
+            return;
+        }
 
-    private static void parseStack() {
         File stacksFolder = loadStacksFolder();
         File[] stackFolders = 
Optional.ofNullable(stacksFolder.listFiles()).orElse(new File[0]);
 
@@ -95,6 +97,8 @@ public class StackUtils {
                 parseService(new StackDTO(stackName, stackVersion), 
versionFolder);
             }
         }
+
+        parsed = true;
     }
 
     /**
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
index 09d3478b..44ed0977 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
@@ -44,6 +44,9 @@
         <value>2181</value>
         <display-name>Port for running ZK Server</display-name>
         <description>Port for running ZK Server.</description>
+        <attrs>
+            <required>true</required>
+        </attrs>
     </property>
     <property>
         <name>dataDir</name>
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStageTest.java
index c921a054..cdc385e1 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.dao.po.ClusterPO;
 import org.apache.bigtop.manager.server.command.task.TaskContext;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -29,10 +32,6 @@ import org.mockito.MockedStatic;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.test.util.ReflectionTestUtils;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doCallRealMethod;
@@ -45,6 +44,21 @@ public class AbstractComponentStageTest {
     @Mock
     private AbstractComponentStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     @SuppressWarnings("unchecked")
     public void testCreateTaskContext() {
@@ -61,13 +75,6 @@ public class AbstractComponentStageTest {
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
         ReflectionTestUtils.setField(stage, "clusterPO", clusterPO);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
-        Map<String, List<String>> componentHosts = new HashMap<>();
-        componentHosts.put("test", List.of("host1"));
-
-        when(stage.getClusterHosts()).thenReturn(componentHosts);
         doCallRealMethod().when(stage).createTaskContext(any());
         TaskContext taskContext = stage.createTaskContext("host1");
 
@@ -79,13 +86,5 @@ public class AbstractComponentStageTest {
         assertEquals("zookeeper", taskContext.getServiceUser());
         assertEquals("test", taskContext.getUserGroup());
         assertEquals("/opt", taskContext.getRootDir());
-
-        Map<String, Object> properties = taskContext.getProperties();
-        Map<String, List<String>> clusterHosts = (Map<String, List<String>>) 
properties.get("clusterHosts");
-        assertEquals(1, taskContext.getProperties().size());
-        assertEquals(1, clusterHosts.size());
-        assertEquals("host1", clusterHosts.get("test").get(0));
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentAddStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentAddStageTest.java
index e2b213e5..a7a94c29 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentAddStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentAddStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.server.command.task.ComponentAddTask;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -44,6 +47,21 @@ public class ComponentAddStageTest {
     @Mock
     private ComponentAddStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     public void testCreateTask() {
         MockedConstruction<?> mocked = 
mockConstruction(ComponentAddTask.class);
@@ -65,12 +83,7 @@ public class ComponentAddStageTest {
 
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
         doCallRealMethod().when(stage).getName();
         assertEquals("Add ZooKeeper Server", stage.getName());
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStageTest.java
index 2db9eda9..caa81988 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.server.command.task.ComponentCheckTask;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -44,6 +47,21 @@ public class ComponentCheckStageTest {
     @Mock
     private ComponentCheckStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     public void testCreateTask() {
         MockedConstruction<?> mocked = 
mockConstruction(ComponentCheckTask.class);
@@ -65,12 +83,7 @@ public class ComponentCheckStageTest {
 
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
         doCallRealMethod().when(stage).getName();
         assertEquals("Check ZooKeeper Server", stage.getName());
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentConfigureStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentConfigureStageTest.java
index 0967eb0a..04bbebb1 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentConfigureStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentConfigureStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.server.command.task.ComponentConfigureTask;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -44,6 +47,21 @@ public class ComponentConfigureStageTest {
     @Mock
     private ComponentConfigureStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     public void testCreateTask() {
         MockedConstruction<?> mocked = 
mockConstruction(ComponentConfigureTask.class);
@@ -65,12 +83,7 @@ public class ComponentConfigureStageTest {
 
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
         doCallRealMethod().when(stage).getName();
         assertEquals("Configure ZooKeeper Server", stage.getName());
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentInitStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentInitStageTest.java
index 9457b703..dc7cae98 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentInitStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentInitStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.server.command.task.ComponentInitTask;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -44,6 +47,21 @@ public class ComponentInitStageTest {
     @Mock
     private ComponentInitStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     public void testCreateTask() {
         MockedConstruction<?> mocked = 
mockConstruction(ComponentInitTask.class);
@@ -65,12 +83,7 @@ public class ComponentInitStageTest {
 
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
         doCallRealMethod().when(stage).getName();
         assertEquals("Init ZooKeeper Server", stage.getName());
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentPrepareStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentPrepareStageTest.java
index 20339b66..c90a6d9e 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentPrepareStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentPrepareStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.server.command.task.ComponentPrepareTask;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -44,6 +47,21 @@ public class ComponentPrepareStageTest {
     @Mock
     private ComponentPrepareStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     public void testCreateTask() {
         MockedConstruction<?> mocked = 
mockConstruction(ComponentPrepareTask.class);
@@ -65,12 +83,7 @@ public class ComponentPrepareStageTest {
 
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
         doCallRealMethod().when(stage).getName();
         assertEquals("Prepare ZooKeeper Server", stage.getName());
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStageTest.java
index d625e8e8..bbff7bee 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.server.command.task.ComponentStartTask;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -44,6 +47,21 @@ public class ComponentStartStageTest {
     @Mock
     private ComponentStartStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     public void testCreateTask() {
         MockedConstruction<?> mocked = 
mockConstruction(ComponentStartTask.class);
@@ -65,12 +83,7 @@ public class ComponentStartStageTest {
 
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
         doCallRealMethod().when(stage).getName();
         assertEquals("Start ZooKeeper Server", stage.getName());
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStageTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStageTest.java
index de6e0b54..fc8cee81 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStageTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStageTest.java
@@ -21,7 +21,10 @@ package org.apache.bigtop.manager.server.command.stage;
 import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.server.command.task.ComponentStopTask;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -44,6 +47,21 @@ public class ComponentStopStageTest {
     @Mock
     private ComponentStopStage stage;
 
+    private static MockedStatic<Environments> mocked;
+
+    @BeforeAll
+    public static void setup() {
+        mocked = mockStatic(Environments.class);
+        when(Environments.isDevMode()).thenReturn(true);
+
+        StackUtils.parseStack();
+    }
+
+    @AfterAll
+    public static void teardown() {
+        mocked.close();
+    }
+
     @Test
     public void testCreateTask() {
         MockedConstruction<?> mocked = 
mockConstruction(ComponentStopTask.class);
@@ -65,12 +83,7 @@ public class ComponentStopStageTest {
 
         ReflectionTestUtils.setField(stage, "stageContext", stageContext);
 
-        MockedStatic<Environments> mocked = mockStatic(Environments.class);
-        when(Environments.isDevMode()).thenReturn(true);
-
         doCallRealMethod().when(stage).getName();
         assertEquals("Stop ZooKeeper Server", stage.getName());
-
-        mocked.close();
     }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/param/InfraParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/param/InfraParams.java
index fe586d77..33e3ce2d 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/param/InfraParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/param/InfraParams.java
@@ -18,16 +18,12 @@
  */
 package org.apache.bigtop.manager.stack.infra.param;
 
-import org.apache.bigtop.manager.common.utils.Environments;
 import org.apache.bigtop.manager.grpc.payload.ComponentCommandPayload;
 import org.apache.bigtop.manager.stack.core.spi.param.BaseParams;
 
-import org.apache.commons.lang3.SystemUtils;
-
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
-import java.io.File;
 import java.util.List;
 import java.util.Map;
 
@@ -49,32 +45,6 @@ public abstract class InfraParams extends BaseParams {
         return "infra";
     }
 
-    /**
-     * Infra stack do not belong to any cluster, we cannot use stack home of 
cluster
-     *
-     * @return group name
-     */
-    @Override
-    public String stackHome() {
-        // Parent path of agent dir, which is bigtop-manager-agent/../
-        String parentPath;
-        if (Environments.isDevMode()) {
-            return SystemUtils.getUserDir().getParentFile().getPath();
-        } else {
-            parentPath = new File(InfraParams.class
-                            .getProtectionDomain()
-                            .getCodeSource()
-                            .getLocation()
-                            .getPath())
-                    .getParentFile()
-                    .getParentFile()
-                    .getParentFile()
-                    .getPath();
-        }
-
-        return parentPath + "/infras";
-    }
-
     public Map<String, List<String>> getClusterHosts() {
         // In Component Status stage, clusterHosts is null
         return payload.getClusterHosts();

Reply via email to