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 04875b86 BIGTOP-4246: Refactor APIs for Cluster (#99)
04875b86 is described below

commit 04875b86e90979493b81088128905c2bb5ed4de6
Author: Zhiguo Wu <[email protected]>
AuthorDate: Wed Nov 6 15:17:24 2024 +0000

    BIGTOP-4246: Refactor APIs for Cluster (#99)
---
 .../service/ComponentStatusServiceGrpcImpl.java    |  2 +-
 .../message/entity/payload/CommandPayload.java     |  2 +-
 .../common/message/entity/pojo/ClusterInfo.java    | 14 +----
 .../apache/bigtop/manager/dao/po/ClusterPO.java    | 37 ++++++------
 .../bigtop/manager/dao/repository/ClusterDao.java  |  9 +--
 .../main/resources/mapper/mysql/ClusterMapper.xml  | 40 ++++++-------
 .../resources/mapper/mysql/ComponentMapper.xml     |  2 +-
 .../resources/mapper/mysql/HostComponentMapper.xml | 10 ++--
 .../src/main/resources/mapper/mysql/HostMapper.xml |  8 +--
 .../main/resources/mapper/mysql/ServiceMapper.xml  |  4 +-
 .../resources/mapper/postgresql/ClusterMapper.xml  | 40 ++++++-------
 .../mapper/postgresql/ComponentMapper.xml          |  2 +-
 .../mapper/postgresql/HostComponentMapper.xml      | 10 ++--
 .../resources/mapper/postgresql/HostMapper.xml     |  8 +--
 .../resources/mapper/postgresql/ServiceMapper.xml  |  4 +-
 .../server/command/job/ClusterCreateJob.java       | 64 ++++++++++++++-------
 .../server/command/job/ServiceInstallJob.java      |  3 -
 .../command/stage/AbstractComponentStage.java      |  4 +-
 .../server/command/stage/HostCheckStage.java       |  3 -
 .../manager/server/command/stage/StageContext.java | 10 ++--
 .../server/command/task/AbstractComponentTask.java |  2 +-
 .../server/command/task/CacheFileUpdateTask.java   | 14 +----
 .../manager/server/command/task/TaskContext.java   |  2 +-
 .../command/validator/ClusterCreateValidator.java  |  9 ++-
 .../command/validator/ClusterHostValidator.java    | 67 ----------------------
 .../manager/server/controller/HostController.java  | 24 ++++----
 .../manager/server/enums/ApiExceptionEnum.java     |  2 +-
 .../{HostStatus.java => HealthyStatusEnum.java}    |  8 +--
 .../bigtop/manager/server/enums/LocaleKeys.java    |  2 +-
 .../server/model/converter/ClusterConverter.java   |  6 +-
 .../manager/server/model/dto/ClusterDTO.java       | 14 ++---
 .../bigtop/manager/server/model/dto/HostDTO.java   |  2 +
 .../model/dto/command/ClusterCommandDTO.java       | 14 ++---
 .../manager/server/model/req/ClusterReq.java       | 21 +------
 .../bigtop/manager/server/model/req/HostReq.java   |  3 +
 .../model/req/command/ClusterCommandReq.java       | 26 ++++-----
 .../bigtop/manager/server/model/vo/ClusterVO.java  | 22 +++++--
 .../manager/server/service/ClusterService.java     |  7 ---
 .../bigtop/manager/server/service/HostService.java |  6 +-
 .../server/service/impl/ClusterServiceImpl.java    | 61 ++------------------
 .../server/service/impl/HostServiceImpl.java       | 13 ++---
 .../src/main/resources/ddl/MySQL-DDL-CREATE.sql    | 27 ++++-----
 .../main/resources/ddl/PostgreSQL-DDL-CREATE.sql   | 29 +++++-----
 .../main/resources/i18n/messages_en_US.properties  |  2 +-
 .../main/resources/i18n/messages_zh_CN.properties  |  2 +-
 .../server/controller/HostControllerTest.java      | 38 +++++-------
 .../manager/server/service/ClusterServiceTest.java | 34 ++---------
 .../manager/stack/bigtop/param/BigtopParams.java   |  4 +-
 .../manager/stack/core/param/BaseParams.java       |  2 +-
 .../manager/stack/core/utils/LocalSettings.java    |  4 +-
 50 files changed, 273 insertions(+), 470 deletions(-)

diff --git 
a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/service/ComponentStatusServiceGrpcImpl.java
 
b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/service/ComponentStatusServiceGrpcImpl.java
index 0f43995a..d2d745cf 100644
--- 
a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/service/ComponentStatusServiceGrpcImpl.java
+++ 
b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/service/ComponentStatusServiceGrpcImpl.java
@@ -48,7 +48,7 @@ public class ComponentStatusServiceGrpcImpl extends 
ComponentStatusServiceGrpc.C
             commandPayload.setServiceUser(request.getServiceUser());
             commandPayload.setComponentName(request.getComponentName());
             
commandPayload.setCommandScript(JsonUtils.readFromString(request.getCommandScript(),
 ScriptInfo.class));
-            commandPayload.setRoot(request.getRoot());
+            commandPayload.setRootDir(request.getRoot());
             commandPayload.setStackName(request.getStackName());
             commandPayload.setStackVersion(request.getStackVersion());
             ShellResult shellResult = StackExecutor.execute(commandPayload);
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
index bf7951c9..142f7d4f 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
@@ -52,7 +52,7 @@ public class CommandPayload extends BasePayload {
 
     private String stackVersion;
 
-    private String root;
+    private String rootDir;
 
     private String componentName;
 
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/ClusterInfo.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/ClusterInfo.java
index 94ea3ae8..1c750c73 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/ClusterInfo.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/ClusterInfo.java
@@ -20,22 +20,10 @@ package 
org.apache.bigtop.manager.common.message.entity.pojo;
 
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class ClusterInfo {
 
-    private String clusterName;
-
-    private String stackName;
-
-    private String stackVersion;
-
     private String userGroup;
 
-    private String root;
-
-    private String repoTemplate;
-
-    private List<String> packages;
+    private String rootDir;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
index 3076e22c..96789e1e 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
@@ -36,35 +36,36 @@ public class ClusterPO extends BasePO implements 
Serializable {
     @Column(name = "id")
     private Long id;
 
-    @Column(name = "cluster_name")
-    private String clusterName;
+    @Column(name = "name")
+    private String name;
 
-    @Column(name = "cluster_type")
-    private Integer clusterType;
+    @Column(name = "desc")
+    private String desc;
 
-    @Column(name = "root")
-    private String root;
+    @Column(name = "type")
+    private Integer type;
 
     @Column(name = "user_group")
     private String userGroup;
 
-    @Column(name = "packages")
-    private String packages;
+    @Column(name = "root_dir")
+    private String rootDir;
 
-    @Column(name = "repo_template")
-    private String repoTemplate;
+    @Column(name = "status")
+    private Integer status;
 
-    @Column(name = "state")
-    private String state;
+    @Transient
+    private String createUser;
+
+    @Transient
+    private Long totalHost;
 
-    @Column(name = "selected")
-    private Boolean selected;
+    @Transient
+    private Long totalProcessor;
 
     @Transient
-    @Column(name = "stack_name")
-    private String stackName;
+    private Long totalMemory;
 
     @Transient
-    @Column(name = "stack_version")
-    private String stackVersion;
+    private Long totalDisk;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ClusterDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ClusterDao.java
index de2ec326..af60ee87 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ClusterDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ClusterDao.java
@@ -23,16 +23,13 @@ import org.apache.bigtop.manager.dao.po.ClusterPO;
 
 import org.apache.ibatis.annotations.Param;
 
-import java.util.List;
-import java.util.Optional;
-
 public interface ClusterDao extends BaseDao<ClusterPO> {
 
-    Optional<ClusterPO> findByClusterName(@Param("clusterName") String 
clusterName);
+    ClusterPO findDetailsById(@Param("id") Long id);
+
+    ClusterPO findByName(@Param("name") String name);
 
     Integer count();
 
     ClusterPO findByIdJoin(@Param("clusterId") Long clusterId);
-
-    List<ClusterPO> findAllByJoin();
 }
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml
index 75caa42a..a691861b 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml
@@ -24,22 +24,32 @@
 <mapper namespace="org.apache.bigtop.manager.dao.repository.ClusterDao">
 
     <sql id="baseColumns">
-        id, cluster_name, cluster_type, root, user_group, packages, 
repo_template, state, selected, stack_id
+        id, name, desc, type, user_group, root_dir, status
     </sql>
     <sql id="baseColumnsV2">
-        ${alias}.id, ${alias}.cluster_name, ${alias}.cluster_type, 
${alias}.root, ${alias}.user_group, ${alias}.packages, ${alias}.repo_template, 
${alias}.state, ${alias}.selected, ${alias}.stack_id
+        ${alias}.id, ${alias}.name, ${alias}.desc, ${alias}.type, 
${alias}.user_group, ${alias}.root_dir, ${alias}.status
     </sql>
 
-    <select id="findByClusterName" 
resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
+    <select id="findDetailsById" 
resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
+        select
+        <include refid="baseColumnsV2">
+            <property name="alias" value="c"/>
+        </include>, u.nickname as create_user,
+        count(h.id) as total_host, sum(h.available_processors) as 
total_processor,
+        sum(h.total_memory_size) as total_memory, sum(h.total_disk) as 
total_disk
+        from
+        cluster c left join user u on c.create_by = u.id
+        left join host h on c.id = h.cluster_id
+        where c.id = #{id}
+        limit 1
+    </select>
+
+    <select id="findByName" 
resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
         select
         <include refid="baseColumns"/>
         from
         cluster
-        <where>
-            <if test="clusterName!=null">
-                cluster_name=#{clusterName}
-            </if>
-        </where>
+        where name = #{name}
         limit 1
     </select>
 
@@ -64,18 +74,4 @@
             </if>
         </where>
     </select>
-
-    <select id="findAllByJoin"
-            resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
-        select
-        <include refid="baseColumnsV2">
-            <property name="alias" value="r"/>
-        </include>
-        , s.stack_name, s.stack_version
-        from
-        cluster r
-        inner join stack s
-        on r.stack_id = s.id
-    </select>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml
index cc1c93d6..1a567de4 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml
@@ -52,7 +52,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="r"/>
         </include>
-        ,c.cluster_name, s.service_name
+        ,c.name as cluster_name, s.service_name
         from
         component r
         inner join cluster c
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml
index c01dd029..9f906104 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml
@@ -57,7 +57,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.cluster_name, ht.hostname
+        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.name as cluster_name, ht.hostname
         from
         host_component hc
         inner join (select * from component
@@ -148,7 +148,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.cluster_name, ht.hostname
+        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.name as cluster_name, ht.hostname
         from
         host_component hc
         inner join component c
@@ -176,7 +176,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-            , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.cluster_name, ht.hostname
+            , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.name as cluster_name, ht.hostname
         from
         host_component hc
         inner join (select * from component
@@ -201,7 +201,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        
,st.stack_name,st.stack_version,ser.service_name,ser.service_user,clu.root,c.component_name,c.command_script,hst.hostname
+        
,ser.service_name,ser.service_user,clu.root_dir,c.component_name,c.command_script,hst.hostname
         from
         host_component hc
         inner join host hst
@@ -215,8 +215,6 @@
         inner join
         service ser
         on c.service_id=ser.id and c.cluster_id = ser.cluster_id
-        inner join stack st
-        on clu.stack_id = st.id
     </select>
 
     <select id="countByHostId" resultType="java.lang.Integer">
diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
index e530890c..97b95be0 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
@@ -54,7 +54,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
         </include>
-        ,clus.cluster_name
+        ,clus.name as cluster_name
         from
         (select * from host
         <where>
@@ -75,7 +75,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
         </include>
-        ,clus.cluster_name
+        ,clus.name as cluster_name
         from
         host h
         inner join
@@ -109,7 +109,7 @@
         select
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
-        </include>, c.cluster_name, count(hc.id) as component_num
+        </include>, c.name as cluster_name, count(hc.id) as component_num
         from host h
         left join cluster c on h.cluster_id = c.id
         left join host_component hc on h.id = hc.host_id
@@ -134,7 +134,7 @@
         select
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
-        </include>, c.cluster_name, count(hc.id) as component_num
+        </include>, c.name as cluster_name, count(hc.id) as component_num
         from host h
         left join cluster c on h.cluster_id = c.id
         left join host_component hc on h.id = hc.host_id
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
index 9b38c838..3f951e04 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
@@ -58,7 +58,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="s"/>
         </include>
-        , clus.cluster_name, clus.user_group, c.component_name, c.category, 
c.quick_link, c.id as cid
+        , clus.name as cluster_name, clus.user_group, c.component_name, 
c.category, c.quick_link, c.id as cid
         from
         (select * from service
         <where>
@@ -81,7 +81,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="s"/>
         </include>
-        , clus.cluster_name, clus.user_group
+        , clus.name as cluster_name, clus.user_group
         from
         (select * from service
         <where>
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml
index 75caa42a..99c515ed 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml
@@ -24,22 +24,32 @@
 <mapper namespace="org.apache.bigtop.manager.dao.repository.ClusterDao">
 
     <sql id="baseColumns">
-        id, cluster_name, cluster_type, root, user_group, packages, 
repo_template, state, selected, stack_id
+        id, name, "desc", type, user_group, root_dir, status
     </sql>
     <sql id="baseColumnsV2">
-        ${alias}.id, ${alias}.cluster_name, ${alias}.cluster_type, 
${alias}.root, ${alias}.user_group, ${alias}.packages, ${alias}.repo_template, 
${alias}.state, ${alias}.selected, ${alias}.stack_id
+        ${alias}.id, ${alias}.name, ${alias}."desc", ${alias}.type, 
${alias}.user_group, ${alias}.root_dir, ${alias}.status
     </sql>
 
-    <select id="findByClusterName" 
resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
+    <select id="findDetailsById" 
resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
+        select
+        <include refid="baseColumnsV2">
+            <property name="alias" value="c"/>
+        </include>, u.nickname as create_user,
+        count(h.id) as total_host, sum(h.available_processors) as 
total_processor,
+        sum(h.total_memory_size) as total_memory, sum(h.total_disk) as 
total_disk
+        from
+        cluster c left join user u on c.create_by = u.id
+        left join host h on c.id = h.cluster_id
+        where c.id = #{id}
+        limit 1
+    </select>
+
+    <select id="findByName" 
resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
         select
         <include refid="baseColumns"/>
         from
         cluster
-        <where>
-            <if test="clusterName!=null">
-                cluster_name=#{clusterName}
-            </if>
-        </where>
+        where name = #{name}
         limit 1
     </select>
 
@@ -64,18 +74,4 @@
             </if>
         </where>
     </select>
-
-    <select id="findAllByJoin"
-            resultType="org.apache.bigtop.manager.dao.po.ClusterPO">
-        select
-        <include refid="baseColumnsV2">
-            <property name="alias" value="r"/>
-        </include>
-        , s.stack_name, s.stack_version
-        from
-        cluster r
-        inner join stack s
-        on r.stack_id = s.id
-    </select>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml
index cc1c93d6..1a567de4 100644
--- 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml
+++ 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml
@@ -52,7 +52,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="r"/>
         </include>
-        ,c.cluster_name, s.service_name
+        ,c.name as cluster_name, s.service_name
         from
         component r
         inner join cluster c
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
index 927a6e61..ada7d947 100644
--- 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
+++ 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
@@ -57,7 +57,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.cluster_name, ht.hostname
+        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.name as cluster_name, ht.hostname
         from
         host_component hc
         inner join (select * from component
@@ -148,7 +148,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.cluster_name, ht.hostname
+        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.name as cluster_name, ht.hostname
         from
         host_component hc
         inner join component c
@@ -176,7 +176,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.cluster_name, ht.hostname
+        , c.service_id, c.component_name, c.display_name, c.category, 
s.service_name, clus.name as cluster_name, ht.hostname
         from
         host_component hc
         inner join (select * from component
@@ -201,7 +201,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        
,st.stack_name,st.stack_version,ser.service_name,ser.service_user,clu.root,c.component_name,c.command_script,hst.hostname
+        
,ser.service_name,ser.service_user,clu.root_dir,c.component_name,c.command_script,hst.hostname
         from
         host_component hc
         inner join host hst
@@ -215,8 +215,6 @@
         inner join
         service ser
         on c.service_id=ser.id and c.cluster_id = ser.cluster_id
-        inner join stack st
-        on clu.stack_id = st.id
     </select>
 
     <select id="countByHostId" resultType="java.lang.Integer">
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
index 4659b421..d98dc593 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
@@ -54,7 +54,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
         </include>
-        ,clus.cluster_name
+        ,clus.name as cluster_name
         from
         (select * from host
         <where>
@@ -75,7 +75,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
         </include>
-        ,clus.cluster_name
+        ,clus.name as cluster_name
         from
         host h
         left join cluster clus
@@ -102,7 +102,7 @@
         select
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
-        </include>, c.cluster_name, count(hc.id) as component_num
+        </include>, c.name as cluster_name, count(hc.id) as component_num
         from host h
         left join cluster c on h.cluster_id = c.id
         left join host_component hc on h.id = hc.host_id
@@ -127,7 +127,7 @@
         select
         <include refid="baseColumnsV2">
             <property name="alias" value="h"/>
-        </include>, c.cluster_name, count(hc.id) as component_num
+        </include>, c.name as cluster_name, count(hc.id) as component_num
         from host h
         left join cluster c on h.cluster_id = c.id
         left join host_component hc on h.id = hc.host_id
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
index 9b38c838..3f951e04 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
@@ -58,7 +58,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="s"/>
         </include>
-        , clus.cluster_name, clus.user_group, c.component_name, c.category, 
c.quick_link, c.id as cid
+        , clus.name as cluster_name, clus.user_group, c.component_name, 
c.category, c.quick_link, c.id as cid
         from
         (select * from service
         <where>
@@ -81,7 +81,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="s"/>
         </include>
-        , clus.cluster_name, clus.user_group
+        , clus.name as cluster_name, clus.user_group
         from
         (select * from service
         <where>
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
index 91a4c609..dc81e8ab 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
@@ -18,25 +18,28 @@
  */
 package org.apache.bigtop.manager.server.command.job;
 
-import org.apache.bigtop.manager.common.enums.MaintainState;
-import org.apache.bigtop.manager.dao.po.ClusterPO;
+import org.apache.bigtop.manager.dao.po.HostPO;
 import org.apache.bigtop.manager.dao.po.JobPO;
 import org.apache.bigtop.manager.dao.po.StagePO;
 import org.apache.bigtop.manager.dao.po.TaskPO;
+import org.apache.bigtop.manager.dao.repository.HostDao;
 import org.apache.bigtop.manager.server.command.stage.CacheFileUpdateStage;
 import org.apache.bigtop.manager.server.command.stage.HostCheckStage;
 import org.apache.bigtop.manager.server.command.stage.Stage;
 import org.apache.bigtop.manager.server.command.stage.StageContext;
 import org.apache.bigtop.manager.server.command.task.Task;
+import org.apache.bigtop.manager.server.enums.HealthyStatusEnum;
 import org.apache.bigtop.manager.server.holder.SpringContextHolder;
 import org.apache.bigtop.manager.server.model.converter.ClusterConverter;
 import org.apache.bigtop.manager.server.model.dto.ClusterDTO;
 import org.apache.bigtop.manager.server.model.dto.CommandDTO;
-import org.apache.bigtop.manager.server.service.ClusterService;
+
+import java.util.ArrayList;
+import java.util.List;
 
 public class ClusterCreateJob extends AbstractJob {
 
-    private ClusterService clusterService;
+    private HostDao hostDao;
 
     public ClusterCreateJob(JobContext jobContext) {
         super(jobContext);
@@ -46,7 +49,7 @@ public class ClusterCreateJob extends AbstractJob {
     protected void injectBeans() {
         super.injectBeans();
 
-        this.clusterService = 
SpringContextHolder.getBean(ClusterService.class);
+        hostDao = SpringContextHolder.getBean(HostDao.class);
     }
 
     @Override
@@ -60,26 +63,50 @@ public class ClusterCreateJob extends AbstractJob {
     public void beforeRun() {
         super.beforeRun();
 
-        // Save cluster
-        CommandDTO commandDTO = jobContext.getCommandDTO();
-        ClusterDTO clusterDTO = 
ClusterConverter.INSTANCE.fromCommand2DTO(commandDTO.getClusterCommand());
-        clusterService.save(clusterDTO);
+        saveCluster();
+
+        linkHostToCluster();
+
+        linkJobToCluster();
     }
 
     @Override
     public void onSuccess() {
         super.onSuccess();
+    }
+
+    @Override
+    public String getName() {
+        return "Create cluster";
+    }
+
+    private void saveCluster() {
+        CommandDTO commandDTO = jobContext.getCommandDTO();
+        ClusterDTO clusterDTO = 
ClusterConverter.INSTANCE.fromCommand2DTO(commandDTO.getClusterCommand());
+        clusterPO = clusterDao.findByName(clusterDTO.getName());
+        if (clusterPO == null) {
+            clusterPO = ClusterConverter.INSTANCE.fromDTO2PO(clusterDTO);
+        }
 
+        clusterPO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
+        clusterDao.save(clusterPO);
+    }
+
+    private void linkHostToCluster() {
         CommandDTO commandDTO = jobContext.getCommandDTO();
-        ClusterPO clusterPO = clusterDao
-                
.findByClusterName(commandDTO.getClusterCommand().getClusterName())
-                .orElse(new ClusterPO());
+        List<Long> ids = commandDTO.getClusterCommand().getHostIds();
+        List<HostPO> hostPOList = new ArrayList<>();
+        for (Long id : ids) {
+            HostPO hostPO = new HostPO();
+            hostPO.setId(id);
+            hostPO.setClusterId(clusterPO.getId());
+            hostPOList.add(hostPO);
+        }
 
-        // Update cluster state to installed
-        clusterPO.setState(MaintainState.INSTALLED.getName());
-        clusterDao.partialUpdateById(clusterPO);
+        hostDao.partialUpdateByIds(hostPOList);
+    }
 
-        // Link job to cluster after cluster successfully added
+    private void linkJobToCluster() {
         JobPO jobPO = getJobPO();
         jobPO.setClusterId(clusterPO.getId());
         jobDao.partialUpdateById(jobPO);
@@ -96,9 +123,4 @@ public class ClusterCreateJob extends AbstractJob {
             }
         }
     }
-
-    @Override
-    public String getName() {
-        return "Create cluster";
-    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
index c701f8c7..4cf3107c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
@@ -139,9 +139,6 @@ public class ServiceInstallJob extends AbstractServiceJob {
         String serviceName = serviceCommand.getServiceName();
         ClusterPO clusterPO = clusterDao.findByIdJoin(clusterId);
 
-        String stackName = clusterPO.getStackName();
-        String stackVersion = clusterPO.getStackVersion();
-
         // 1. Persist service and components
         if (servicePO == null) {
             ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
index 54b27282..3c9da086 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
@@ -67,14 +67,14 @@ public abstract class AbstractComponentStage extends 
AbstractStage {
         TaskContext taskContext = new TaskContext();
         taskContext.setHostname(hostname);
         taskContext.setClusterId(clusterPO.getId());
-        taskContext.setClusterName(clusterPO.getClusterName());
+        taskContext.setClusterName(clusterPO.getName());
         taskContext.setServiceName(serviceDTO.getServiceName());
         taskContext.setStackName(stageContext.getStackName());
         taskContext.setStackVersion(stageContext.getStackVersion());
         taskContext.setComponentName(componentDTO.getComponentName());
         taskContext.setComponentDisplayName(componentDTO.getDisplayName());
         taskContext.setServiceUser(serviceDTO.getServiceUser());
-        taskContext.setRoot(clusterPO.getRoot());
+        taskContext.setRootDir(clusterPO.getRootDir());
 
         Map<String, Object> properties = new HashMap<>();
         properties.put("customCommands", componentDTO.getCustomCommands());
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java
index 5167cb32..b0f21478 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java
@@ -45,9 +45,6 @@ public class HostCheckStage extends AbstractStage {
     protected void beforeCreateTasks() {
         if (stageContext.getClusterId() != null) {
             ClusterPO clusterPO = 
clusterDao.findByIdJoin(stageContext.getClusterId());
-
-            stageContext.setStackName(clusterPO.getStackName());
-            stageContext.setStackVersion(clusterPO.getStackVersion());
         }
     }
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
index dd26a7d6..ab7ee7a7 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
@@ -71,11 +71,11 @@ public class StageContext {
     private static void fromClusterCommandPayload(StageContext context, 
CommandDTO commandDTO) {
         ClusterCommandDTO clusterCommand = commandDTO.getClusterCommand();
 
-        context.setClusterName(clusterCommand.getClusterName());
-        context.setStackName(clusterCommand.getStackName());
-        context.setStackVersion(clusterCommand.getStackVersion());
-        context.setHostnames(clusterCommand.getHostnames());
-        context.setRepoInfoList(clusterCommand.getRepoInfoList());
+        context.setClusterName(clusterCommand.getName());
+        //        context.setStackName(clusterCommand.getStackName());
+        //        context.setStackVersion(clusterCommand.getStackVersion());
+        //        context.setHostnames(clusterCommand.getHostnames());
+        //        context.setRepoInfoList(clusterCommand.getRepoInfoList());
     }
 
     private static void fromHostCommandPayload(StageContext context, 
CommandDTO commandDTO) {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
index 03414e62..de70d595 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
@@ -62,7 +62,7 @@ public abstract class AbstractComponentTask extends 
AbstractTask {
         commandPayload.setStackName(taskContext.getStackName());
         commandPayload.setStackVersion(taskContext.getStackVersion());
         commandPayload.setComponentName(taskContext.getComponentName());
-        commandPayload.setRoot(taskContext.getRoot());
+        commandPayload.setRootDir(taskContext.getRootDir());
         commandPayload.setHostname(taskContext.getHostname());
 
         Map<String, Object> properties = taskContext.getProperties();
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java
index 70b969a4..2265560c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java
@@ -118,10 +118,6 @@ public class CacheFileUpdateTask extends AbstractTask {
         ClusterPO clusterPO = 
clusterDao.findByIdJoin(taskContext.getClusterId());
 
         Long clusterId = clusterPO.getId();
-        String clusterName = clusterPO.getClusterName();
-
-        String stackName = clusterPO.getStackName();
-        String stackVersion = clusterPO.getStackVersion();
 
         List<ServicePO> servicePOList = 
serviceDao.findAllByClusterId(clusterId);
         List<ServiceConfigPO> serviceConfigPOList =
@@ -132,13 +128,8 @@ public class CacheFileUpdateTask extends AbstractTask {
         List<HostPO> hostPOList = hostDao.findAllByClusterId(clusterId);
 
         clusterInfo = new ClusterInfo();
-        clusterInfo.setClusterName(clusterName);
-        clusterInfo.setStackName(stackName);
-        clusterInfo.setStackVersion(stackVersion);
         clusterInfo.setUserGroup(clusterPO.getUserGroup());
-        clusterInfo.setRepoTemplate(clusterPO.getRepoTemplate());
-        clusterInfo.setRoot(clusterPO.getRoot());
-        clusterInfo.setPackages(List.of(clusterPO.getPackages().split(",")));
+        clusterInfo.setRootDir(clusterPO.getRootDir());
 
         serviceConfigMap = new HashMap<>();
         for (ServiceConfigPO serviceConfigPO : serviceConfigPOList) {
@@ -212,9 +203,6 @@ public class CacheFileUpdateTask extends AbstractTask {
 
         repoList = RepoConverter.INSTANCE.fromDTO2Message((List<RepoDTO>) 
properties.get("repoInfoList"));
         clusterInfo = new ClusterInfo();
-        clusterInfo.setClusterName(taskContext.getClusterName());
-        clusterInfo.setStackName(taskContext.getStackName());
-        clusterInfo.setStackVersion(taskContext.getStackVersion());
 
         List<String> hostnames = (List<String>) properties.get("hostnames");
         hostMap.put(Constants.ALL_HOST_KEY, new HashSet<>(hostnames));
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java
index 02a2242c..82b8436d 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java
@@ -49,7 +49,7 @@ public class TaskContext {
 
     private String customCommand;
 
-    private String root;
+    private String rootDir;
 
     // Extra properties for specific tasks
     protected Map<String, Object> properties;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterCreateValidator.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterCreateValidator.java
index adc9dc3c..6c639582 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterCreateValidator.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterCreateValidator.java
@@ -31,7 +31,6 @@ import org.springframework.stereotype.Component;
 
 import jakarta.annotation.Resource;
 import java.util.List;
-import java.util.Optional;
 
 @Component
 public class ClusterCreateValidator implements CommandValidator {
@@ -47,12 +46,12 @@ public class ClusterCreateValidator implements 
CommandValidator {
     @Override
     public void validate(ValidatorContext context) {
         ClusterCommandDTO clusterCommand = 
context.getCommandDTO().getClusterCommand();
-        String clusterName = clusterCommand.getClusterName();
+        String clusterName = clusterCommand.getName();
 
-        Optional<ClusterPO> clusterOptional = 
clusterDao.findByClusterName(clusterName);
+        ClusterPO clusterPO = clusterDao.findByName(clusterName);
 
-        if (clusterOptional.isPresent()) {
-            throw new ApiException(ApiExceptionEnum.CLUSTER_IS_INSTALLED, 
clusterName);
+        if (clusterPO == null) {
+            throw new ApiException(ApiExceptionEnum.CLUSTER_EXISTS, 
clusterName);
         }
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterHostValidator.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterHostValidator.java
deleted file mode 100644
index d007f205..00000000
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterHostValidator.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.server.command.validator;
-
-import org.apache.bigtop.manager.common.enums.Command;
-import org.apache.bigtop.manager.dao.po.HostPO;
-import org.apache.bigtop.manager.dao.repository.HostDao;
-import org.apache.bigtop.manager.server.command.CommandIdentifier;
-import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
-import org.apache.bigtop.manager.server.enums.CommandLevel;
-import org.apache.bigtop.manager.server.exception.ApiException;
-import org.apache.bigtop.manager.server.grpc.GrpcClient;
-import org.apache.bigtop.manager.server.model.dto.command.ClusterCommandDTO;
-
-import org.apache.commons.collections4.CollectionUtils;
-
-import org.springframework.stereotype.Component;
-
-import jakarta.annotation.Resource;
-import java.util.List;
-
-@Component
-public class ClusterHostValidator implements CommandValidator {
-
-    @Resource
-    private HostDao hostDao;
-
-    @Override
-    public List<CommandIdentifier> getCommandIdentifiers() {
-        return List.of(new CommandIdentifier(CommandLevel.CLUSTER, 
Command.CREATE));
-    }
-
-    @Override
-    public void validate(ValidatorContext context) {
-        ClusterCommandDTO clusterCommand = 
context.getCommandDTO().getClusterCommand();
-        List<String> hostnames = clusterCommand.getHostnames();
-
-        List<HostPO> hostPOList = hostDao.findAllByHostnameIn(hostnames);
-        if (CollectionUtils.isNotEmpty(hostPOList)) {
-            List<String> existsHostnames =
-                    hostPOList.stream().map(HostPO::getHostname).toList();
-            throw new ApiException(ApiExceptionEnum.HOST_ASSIGNED, 
String.join(",", existsHostnames));
-        }
-
-        for (String hostname : hostnames) {
-            if (!GrpcClient.isChannelAlive(hostname)) {
-                GrpcClient.createChannel(hostname);
-            }
-        }
-    }
-}
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/HostController.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/HostController.java
index 3a67a661..e49bf435 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/HostController.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/HostController.java
@@ -47,9 +47,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import java.util.List;
 
-@Tag(name = "Cluster Host Controller")
+@Tag(name = "Host Controller")
 @RestController
-@RequestMapping("/clusters/{clusterId}/hosts")
+@RequestMapping("/hosts")
 public class HostController {
 
     @Resource
@@ -67,41 +67,39 @@ public class HostController {
                 schema = @Schema(type = "string", defaultValue = "asc"))
     })
     @GetMapping
-    public ResponseEntity<PageVO<HostVO>> list(@PathVariable Long clusterId, 
HostQuery hostQuery) {
-        return ResponseEntity.success(hostService.list(clusterId, hostQuery));
+    public ResponseEntity<PageVO<HostVO>> list(HostQuery hostQuery) {
+        return ResponseEntity.success(hostService.list(hostQuery));
     }
 
     @Operation(summary = "add", description = "Add a host")
     @PostMapping
-    public ResponseEntity<List<HostVO>> add(@PathVariable Long clusterId, 
@RequestBody @Validated HostReq hostReq) {
+    public ResponseEntity<List<HostVO>> add(@RequestBody @Validated HostReq 
hostReq) {
         HostDTO hostDTO = HostConverter.INSTANCE.fromReq2DTO(hostReq);
-        return ResponseEntity.success(hostService.add(clusterId, hostDTO));
+        return ResponseEntity.success(hostService.add(hostDTO));
     }
 
     @Operation(summary = "get", description = "Get a host")
     @GetMapping("/{id}")
-    public ResponseEntity<HostVO> get(@PathVariable Long id, @PathVariable 
Long clusterId) {
+    public ResponseEntity<HostVO> get(@PathVariable Long id) {
         return ResponseEntity.success(hostService.get(id));
     }
 
     @Operation(summary = "update", description = "Update a host")
     @PutMapping("/{id}")
-    public ResponseEntity<HostVO> update(
-            @PathVariable Long clusterId, @PathVariable Long id, @RequestBody 
@Validated HostReq hostReq) {
+    public ResponseEntity<HostVO> update(@PathVariable Long id, @RequestBody 
@Validated HostReq hostReq) {
         HostDTO hostDTO = HostConverter.INSTANCE.fromReq2DTO(hostReq);
-        return ResponseEntity.success(hostService.update(id, clusterId, 
hostDTO));
+        return ResponseEntity.success(hostService.update(id, hostDTO));
     }
 
     @Operation(summary = "delete", description = "Delete a host")
     @DeleteMapping("/{id}")
-    public ResponseEntity<Boolean> delete(@PathVariable Long clusterId, 
@PathVariable Long id) {
+    public ResponseEntity<Boolean> delete(@PathVariable Long id) {
         return ResponseEntity.success(hostService.delete(id));
     }
 
     @Operation(summary = "Check connection", description = "Check connection 
for hosts")
     @PostMapping("/check-connection")
-    public ResponseEntity<Boolean> checkConnection(
-            @PathVariable Long clusterId, @RequestBody @Validated HostReq 
hostReq) {
+    public ResponseEntity<Boolean> checkConnection(@RequestBody @Validated 
HostReq hostReq) {
         HostDTO hostDTO = HostConverter.INSTANCE.fromReq2DTO(hostReq);
         return ResponseEntity.success(hostService.checkConnection(hostDTO));
     }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
index 7b4cf545..2613fc47 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
@@ -32,7 +32,7 @@ public enum ApiExceptionEnum {
 
     // Cluster Exceptions -- 11000 ~ 11999
     CLUSTER_NOT_FOUND(11000, LocaleKeys.CLUSTER_NOT_FOUND),
-    CLUSTER_IS_INSTALLED(11001, LocaleKeys.CLUSTER_IS_INSTALLED),
+    CLUSTER_EXISTS(11001, LocaleKeys.CLUSTER_EXISTS),
 
     // Host Exceptions -- 12000 ~ 12999
     HOST_NOT_FOUND(12000, LocaleKeys.HOST_NOT_FOUND),
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/HostStatus.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/HealthyStatusEnum.java
similarity index 85%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/HostStatus.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/HealthyStatusEnum.java
index 483a8e8e..44d5a671 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/HostStatus.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/HealthyStatusEnum.java
@@ -21,7 +21,7 @@ package org.apache.bigtop.manager.server.enums;
 import lombok.Getter;
 
 @Getter
-public enum HostStatus {
+public enum HealthyStatusEnum {
     HEALTHY(1),
     UNHEALTHY(2),
     UNKNOWN(3),
@@ -29,12 +29,12 @@ public enum HostStatus {
 
     private final Integer code;
 
-    HostStatus(Integer code) {
+    HealthyStatusEnum(Integer code) {
         this.code = code;
     }
 
-    public static HostStatus fromCode(Integer code) {
-        for (HostStatus status : HostStatus.values()) {
+    public static HealthyStatusEnum fromCode(Integer code) {
+        for (HealthyStatusEnum status : HealthyStatusEnum.values()) {
             if (status.code.equals(code)) {
                 return status;
             }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
index 2589290c..94314912 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
@@ -35,7 +35,7 @@ public enum LocaleKeys {
     LOGIN_ACCOUNT_DISABLED("login.account.disabled"),
 
     CLUSTER_NOT_FOUND("cluster.not.found"),
-    CLUSTER_IS_INSTALLED("cluster.is.installed"),
+    CLUSTER_EXISTS("cluster.exists"),
 
     HOST_NOT_FOUND("host.not.found"),
     HOST_ASSIGNED("host.assigned"),
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java
index d9e86f62..c66c5134 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java
@@ -28,6 +28,8 @@ import org.apache.bigtop.manager.server.model.vo.ClusterVO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 
+import java.util.List;
+
 @Mapper(config = MapStructSharedConfig.class)
 public interface ClusterConverter {
 
@@ -41,5 +43,7 @@ public interface ClusterConverter {
 
     ClusterDTO fromPO2DTO(ClusterPO clusterPO);
 
-    ClusterVO fromEntity2VO(ClusterPO clusterPO);
+    ClusterVO fromPO2VO(ClusterPO clusterPO);
+
+    List<ClusterVO> fromPO2VO(List<ClusterPO> clusterPOList);
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ClusterDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ClusterDTO.java
index 4d335eab..651f248e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ClusterDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ClusterDTO.java
@@ -20,20 +20,16 @@ package org.apache.bigtop.manager.server.model.dto;
 
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class ClusterDTO {
 
-    private String clusterName;
-
-    private Integer clusterType;
+    private String name;
 
-    private String stackName;
+    private String desc;
 
-    private String stackVersion;
+    private Integer type;
 
-    private List<RepoDTO> repoInfoList;
+    private String userGroup;
 
-    private List<String> hostnames;
+    private String rootDir;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
index 592dc18e..945bfd39 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
@@ -26,6 +26,8 @@ import java.util.List;
 public class HostDTO {
     private List<String> hostnames;
 
+    private Long clusterId;
+
     private String sshUser;
 
     private Integer sshPort;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ClusterCommandDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ClusterCommandDTO.java
index c047007e..1a364b4c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ClusterCommandDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ClusterCommandDTO.java
@@ -18,8 +18,6 @@
  */
 package org.apache.bigtop.manager.server.model.dto.command;
 
-import org.apache.bigtop.manager.server.model.dto.RepoDTO;
-
 import lombok.Data;
 
 import java.util.List;
@@ -27,15 +25,15 @@ import java.util.List;
 @Data
 public class ClusterCommandDTO {
 
-    private String clusterName;
+    private String name;
 
-    private Integer clusterType;
+    private String desc;
 
-    private String stackName;
+    private Integer type;
 
-    private String stackVersion;
+    private String userGroup;
 
-    private List<RepoDTO> repoInfoList;
+    private String rootDir;
 
-    private List<String> hostnames;
+    private List<Long> hostIds;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ClusterReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ClusterReq.java
index a125df7f..68be9211 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ClusterReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ClusterReq.java
@@ -23,29 +23,14 @@ import lombok.Data;
 
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
-import java.util.List;
 
 @Data
 public class ClusterReq {
 
     @NotEmpty
     @Schema(example = "c1")
-    private String clusterName;
+    private String name;
 
-    @NotNull @Schema(example = "1")
-    private Integer clusterType;
-
-    @NotEmpty
-    @Schema(example = "bigtop")
-    private String stackName;
-
-    @NotEmpty
-    @Schema(example = "3.3.0")
-    private String stackVersion;
-
-    @NotEmpty
-    private List<RepoReq> repoInfoList;
-
-    @NotEmpty
-    private List<String> hostnames;
+    @NotNull @Schema(example = "description")
+    private String desc;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/HostReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/HostReq.java
index 9bf8b38b..35eb5317 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/HostReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/HostReq.java
@@ -29,6 +29,9 @@ public class HostReq {
     @Schema(example = "[host1, host2]")
     private List<String> hostnames;
 
+    @Schema(example = "1")
+    private Long clusterId;
+
     @Schema(example = "root")
     private String sshUser;
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ClusterCommandReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ClusterCommandReq.java
index 820a02d6..f0f4a3d2 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ClusterCommandReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ClusterCommandReq.java
@@ -18,8 +18,6 @@
  */
 package org.apache.bigtop.manager.server.model.req.command;
 
-import org.apache.bigtop.manager.server.model.req.RepoReq;
-
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -32,22 +30,20 @@ public class ClusterCommandReq {
 
     @NotEmpty
     @Schema(example = "c1")
-    private String clusterName;
+    private String name;
+
+    @Schema(example = "desc")
+    private String desc;
 
     @NotNull @Schema(example = "1")
-    private Integer clusterType;
+    private Integer type;
 
-    @NotEmpty
-    @Schema(example = "bigtop")
-    private String stackName;
+    @Schema(example = "hadoop")
+    private String userGroup;
 
-    @NotEmpty
-    @Schema(example = "3.3.0")
-    private String stackVersion;
+    @Schema(example = "/opt")
+    private String rootDir;
 
-    @NotEmpty
-    private List<RepoReq> repoInfoList;
-
-    @NotEmpty
-    private List<String> hostnames;
+    @Schema(example = "[1, 2]")
+    private List<Long> hostIds;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
index d9c168a4..c710fb6a 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
@@ -25,15 +25,25 @@ public class ClusterVO {
 
     private Long id;
 
-    private String clusterName;
+    private String name;
 
-    private Integer clusterType;
+    private String desc;
 
-    private String stackName;
+    private Integer type;
 
-    private String stackVersion;
+    private String userGroup;
 
-    private Boolean selected;
+    private String rootDir;
 
-    private String state;
+    private Integer status;
+
+    private String createUser;
+
+    private Long totalHost;
+
+    private Long totalProcessor;
+
+    private Long totalMemory;
+
+    private Long totalDisk;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ClusterService.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ClusterService.java
index 17cbd432..dd375b8b 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ClusterService.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ClusterService.java
@@ -32,13 +32,6 @@ public interface ClusterService {
      */
     List<ClusterVO> list();
 
-    /**
-     * Save a cluster
-     *
-     * @return Cluster
-     */
-    ClusterVO save(ClusterDTO clusterDTO);
-
     /**
      * Get a cluster
      *
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/HostService.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/HostService.java
index f4e4a5e2..4de47e85 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/HostService.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/HostService.java
@@ -32,9 +32,9 @@ public interface HostService {
      *
      * @return Hosts
      */
-    PageVO<HostVO> list(Long clusterId, HostQuery hostQuery);
+    PageVO<HostVO> list(HostQuery hostQuery);
 
-    List<HostVO> add(Long clusterId, HostDTO hostDTO);
+    List<HostVO> add(HostDTO hostDTO);
 
     /**
      * Save a host
@@ -55,7 +55,7 @@ public interface HostService {
      *
      * @return Host
      */
-    HostVO update(Long id, Long clusterId, HostDTO hostDTO);
+    HostVO update(Long id, HostDTO hostDTO);
 
     /**
      * Delete a host
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
index 6c1982ea..16ce767e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
@@ -18,26 +18,20 @@
  */
 package org.apache.bigtop.manager.server.service.impl;
 
-import org.apache.bigtop.manager.common.enums.MaintainState;
 import org.apache.bigtop.manager.dao.po.ClusterPO;
-import org.apache.bigtop.manager.dao.po.RepoPO;
 import org.apache.bigtop.manager.dao.repository.ClusterDao;
-import org.apache.bigtop.manager.dao.repository.RepoDao;
 import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
 import org.apache.bigtop.manager.server.exception.ApiException;
 import org.apache.bigtop.manager.server.model.converter.ClusterConverter;
-import org.apache.bigtop.manager.server.model.converter.RepoConverter;
 import org.apache.bigtop.manager.server.model.dto.ClusterDTO;
 import org.apache.bigtop.manager.server.model.vo.ClusterVO;
 import org.apache.bigtop.manager.server.service.ClusterService;
-import org.apache.bigtop.manager.server.service.HostService;
 
 import org.springframework.stereotype.Service;
 
 import lombok.extern.slf4j.Slf4j;
 
 import jakarta.annotation.Resource;
-import java.util.ArrayList;
 import java.util.List;
 
 @Slf4j
@@ -47,66 +41,21 @@ public class ClusterServiceImpl implements ClusterService {
     @Resource
     private ClusterDao clusterDao;
 
-    @Resource
-    private RepoDao repoDao;
-
-    @Resource
-    private HostService hostService;
-
     @Override
     public List<ClusterVO> list() {
-        List<ClusterVO> clusterVOList = new ArrayList<>();
-        clusterDao.findAllByJoin().forEach(cluster -> {
-            ClusterVO clusterVO = 
ClusterConverter.INSTANCE.fromEntity2VO(cluster);
-            clusterVOList.add(clusterVO);
-        });
-
-        return clusterVOList;
-    }
-
-    @Override
-    public ClusterVO save(ClusterDTO clusterDTO) {
-        // Save cluster
-        ClusterPO clusterPO = ClusterConverter.INSTANCE.fromDTO2PO(clusterDTO);
-        clusterPO.setSelected(clusterDao.count() == 0);
-        clusterPO.setState(MaintainState.UNINSTALLED.getName());
-
-        ClusterPO oldClusterPO =
-                
clusterDao.findByClusterName(clusterDTO.getClusterName()).orElse(new 
ClusterPO());
-        if (oldClusterPO.getId() != null) {
-            clusterPO.setId(oldClusterPO.getId());
-            clusterDao.partialUpdateById(clusterPO);
-        } else {
-            clusterDao.save(clusterPO);
-        }
-
-        hostService.batchSave(clusterPO.getId(), clusterDTO.getHostnames());
-
-        // Save repo
-        List<RepoPO> repoPOList = 
RepoConverter.INSTANCE.fromDTO2PO(clusterDTO.getRepoInfoList());
-        List<RepoPO> oldrepoPOList = 
repoDao.findAllByClusterId(clusterPO.getId());
-
-        for (RepoPO repoPO : repoPOList) {
-            for (RepoPO oldRepoPO : oldrepoPOList) {
-                if (oldRepoPO.getArch().equals(repoPO.getArch())) {
-                    repoPO.setId(oldRepoPO.getId());
-                }
-            }
-        }
-
-        repoDao.saveAll(repoPOList);
-        return ClusterConverter.INSTANCE.fromEntity2VO(clusterPO);
+        List<ClusterPO> clusterPOList = clusterDao.findAll();
+        return ClusterConverter.INSTANCE.fromPO2VO(clusterPOList);
     }
 
     @Override
     public ClusterVO get(Long id) {
-        ClusterPO clusterPO = clusterDao.findByIdJoin(id);
+        ClusterPO clusterPO = clusterDao.findDetailsById(id);
 
         if (clusterPO == null) {
             throw new ApiException(ApiExceptionEnum.CLUSTER_NOT_FOUND);
         }
 
-        return ClusterConverter.INSTANCE.fromEntity2VO(clusterPO);
+        return ClusterConverter.INSTANCE.fromPO2VO(clusterPO);
     }
 
     @Override
@@ -115,6 +64,6 @@ public class ClusterServiceImpl implements ClusterService {
         clusterPO.setId(id);
         clusterDao.partialUpdateById(clusterPO);
 
-        return ClusterConverter.INSTANCE.fromEntity2VO(clusterPO);
+        return get(id);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
index daccb46f..ebfe057c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
@@ -24,8 +24,8 @@ import org.apache.bigtop.manager.dao.query.HostQuery;
 import org.apache.bigtop.manager.dao.repository.HostComponentDao;
 import org.apache.bigtop.manager.dao.repository.HostDao;
 import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
+import org.apache.bigtop.manager.server.enums.HealthyStatusEnum;
 import org.apache.bigtop.manager.server.enums.HostAuthTypeEnum;
-import org.apache.bigtop.manager.server.enums.HostStatus;
 import org.apache.bigtop.manager.server.exception.ApiException;
 import org.apache.bigtop.manager.server.model.converter.HostConverter;
 import org.apache.bigtop.manager.server.model.dto.HostDTO;
@@ -62,7 +62,7 @@ public class HostServiceImpl implements HostService {
     private HostComponentDao hostComponentDao;
 
     @Override
-    public PageVO<HostVO> list(Long clusterId, HostQuery hostQuery) {
+    public PageVO<HostVO> list(HostQuery hostQuery) {
         PageQuery pageQuery = PageUtils.getPageQuery();
         try (Page<?> ignored =
                 PageHelper.startPage(pageQuery.getPageNum(), 
pageQuery.getPageSize(), pageQuery.getOrderBy())) {
@@ -79,11 +79,10 @@ public class HostServiceImpl implements HostService {
     }
 
     @Override
-    public List<HostVO> add(Long clusterId, HostDTO hostDTO) {
+    public List<HostVO> add(HostDTO hostDTO) {
         List<HostPO> hostPOList = 
HostConverter.INSTANCE.fromDTO2POList(hostDTO);
         for (HostPO hostPO : hostPOList) {
-            hostPO.setClusterId(clusterId);
-            hostPO.setStatus(HostStatus.UNKNOWN.getCode());
+            hostPO.setStatus(HealthyStatusEnum.UNKNOWN.getCode());
         }
 
         hostDao.saveAll(hostPOList);
@@ -102,7 +101,7 @@ public class HostServiceImpl implements HostService {
             HostPO hostPO = new HostPO();
             hostPO.setHostname(hostname);
             hostPO.setClusterId(clusterId);
-            hostPO.setStatus(HostStatus.UNKNOWN.getCode());
+            hostPO.setStatus(HealthyStatusEnum.UNKNOWN.getCode());
 
             if (hostInMap.containsKey(hostname)) {
                 hostPO.setId(hostInMap.get(hostname).getId());
@@ -127,7 +126,7 @@ public class HostServiceImpl implements HostService {
     }
 
     @Override
-    public HostVO update(Long id, Long clusterId, HostDTO hostDTO) {
+    public HostVO update(Long id, HostDTO hostDTO) {
         HostPO hostPO = 
HostConverter.INSTANCE.fromDTO2POWithoutHostname(hostDTO);
         hostPO.setId(id);
         hostDao.partialUpdateById(hostPO);
diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
index c722dc54..a03fe963 100644
--- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
@@ -70,22 +70,19 @@ CREATE TABLE `user`
 
 CREATE TABLE `cluster`
 (
-    `id`            BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
-    `cluster_name`  VARCHAR(255) DEFAULT NULL COMMENT 'Cluster Name',
-    `cluster_desc`  VARCHAR(255) DEFAULT NULL COMMENT 'Cluster Description',
-    `cluster_type`  SMALLINT UNSIGNED DEFAULT 1 COMMENT '1-Physical Machine, 
2-Kubernetes',
-    `selected`      BIT(1)       DEFAULT 1 COMMENT '0-Disable, 1-Enable',
-    `create_time`   DATETIME     DEFAULT NULL,
-    `update_time`   DATETIME     DEFAULT NULL,
-    `create_by`     BIGINT,
-    `packages`      VARCHAR(255),
-    `repo_template` VARCHAR(255),
-    `root`          VARCHAR(255),
-    `state`         VARCHAR(255),
-    `update_by`     BIGINT,
-    `user_group`    VARCHAR(255),
+    `id`                   BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+    `name`                 VARCHAR(255) DEFAULT NULL COMMENT 'Cluster Name',
+    `desc`                 VARCHAR(255) DEFAULT NULL COMMENT 'Cluster 
Description',
+    `type`                 INTEGER DEFAULT 1 COMMENT '1-Physical Machine, 
2-Kubernetes',
+    `user_group`           VARCHAR(255),
+    `root_dir`             VARCHAR(255),
+    `status`               INTEGER DEFAULT NULL COMMENT '1-healthy, 
2-unhealthy, 3-unknown',
+    `create_time`          DATETIME     DEFAULT CURRENT_TIMESTAMP,
+    `update_time`          DATETIME     DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
+    `create_by`            BIGINT,
+    `update_by`            BIGINT,
     PRIMARY KEY (`id`),
-    UNIQUE KEY `uk_cluster_name` (`cluster_name`)
+    UNIQUE KEY `uk_name` (`name`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
 CREATE TABLE `component`
diff --git 
a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
index 66219ecd..0cddc589 100644
--- a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
@@ -54,27 +54,24 @@ COMMENT ON COLUMN "user".status IS '0-Disable, 1-Enable';
 CREATE TABLE cluster
 (
     id            BIGINT CHECK (id > 0) NOT NULL GENERATED ALWAYS AS IDENTITY,
-    cluster_name  VARCHAR(255)                      DEFAULT NULL,
-    cluster_desc  VARCHAR(255)                      DEFAULT NULL,
-    cluster_type  SMALLINT CHECK (cluster_type > 0) DEFAULT 1,
-    selected      BOOLEAN                               DEFAULT TRUE,
-    create_time   TIMESTAMP(0)                      DEFAULT NULL,
-    update_time   TIMESTAMP(0)                      DEFAULT NULL,
+    name          VARCHAR(255)                      DEFAULT NULL,
+    "desc"        VARCHAR(255)                      DEFAULT NULL,
+    type          INT CHECK (cluster.type > 0) DEFAULT 1,
+    user_group    VARCHAR(255),
+    root_dir      VARCHAR(255),
+    status        INT DEFAULT NULL,
+    create_time   TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
+    update_time   TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     create_by     BIGINT,
-    packages      VARCHAR(255),
-    repo_template VARCHAR(255),
-    root          VARCHAR(255),
-    state         VARCHAR(255),
     update_by     BIGINT,
-    user_group    VARCHAR(255),
     PRIMARY KEY (id),
-    CONSTRAINT uk_cluster_name UNIQUE (cluster_name)
+    CONSTRAINT uk_name UNIQUE (name)
 );
 
-COMMENT ON COLUMN cluster.cluster_name IS 'Cluster Name';
-COMMENT ON COLUMN cluster.cluster_desc IS 'Cluster Description';
-COMMENT ON COLUMN cluster.cluster_type IS '1-Physical Machine, 2-Kubernetes';
-COMMENT ON COLUMN cluster.selected IS '0-Disable, 1-Enable';
+COMMENT ON COLUMN cluster.name IS 'Cluster Name';
+COMMENT ON COLUMN cluster."desc" IS 'Cluster Description';
+COMMENT ON COLUMN cluster.type IS '1-Physical Machine, 2-Kubernetes';
+COMMENT ON COLUMN cluster.status IS '1-healthy, 2-unhealthy, 3-unknown';
 
 DROP INDEX IF EXISTS idx_cluster_stack_id;
 
diff --git 
a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties 
b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
index df9389a3..03f44141 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
@@ -29,7 +29,7 @@ login.account.incorrect=Incorrect username or password
 login.account.disabled=User is disabled
 
 cluster.not.found=Cluster not exist
-cluster.is.installed=Cluster is installed
+cluster.exists=Cluster already exists
 
 host.not.found=Host not exist
 host.assigned=Hosts [{0}] already assigned to another cluster
diff --git 
a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties 
b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
index 9ca147d8..df922bb3 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
@@ -29,7 +29,7 @@ login.account.incorrect=用户名或密码错误
 login.account.disabled=用户已被禁用
 
 cluster.not.found=集群不存在
-cluster.is.installed=集群已创建
+cluster.exists=集群已存在
 
 host.not.found=主机不存在
 host.assigned=主机 [{0}] 已属于其他集群
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/HostControllerTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/HostControllerTest.java
index b11cba85..c5517191 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/HostControllerTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/HostControllerTest.java
@@ -69,12 +69,11 @@ class HostControllerTest {
 
     @Test
     void listReturnsAllHosts() {
-        Long clusterId = 1L;
         PageVO<HostVO> hosts = new PageVO<>();
         HostQuery hostQuery = new HostQuery();
-        when(hostService.list(clusterId, hostQuery)).thenReturn(hosts);
+        when(hostService.list(hostQuery)).thenReturn(hosts);
 
-        ResponseEntity<PageVO<HostVO>> response = 
hostController.list(clusterId, hostQuery);
+        ResponseEntity<PageVO<HostVO>> response = 
hostController.list(hostQuery);
 
         assertTrue(response.isSuccess());
         assertEquals(hosts, response.getData());
@@ -82,12 +81,11 @@ class HostControllerTest {
 
     @Test
     void getReturnsHost() {
-        Long clusterId = 1L;
         Long hostId = 1L;
         HostVO host = new HostVO();
         when(hostService.get(hostId)).thenReturn(host);
 
-        ResponseEntity<HostVO> response = hostController.get(hostId, 
clusterId);
+        ResponseEntity<HostVO> response = hostController.get(hostId);
 
         assertTrue(response.isSuccess());
         assertEquals(host, response.getData());
@@ -95,13 +93,12 @@ class HostControllerTest {
 
     @Test
     void updateReturnsUpdatedHost() {
-        Long clusterId = 1L;
         Long hostId = 1L;
         HostReq hostReq = new HostReq();
         HostVO updatedHost = new HostVO();
-        when(hostService.update(anyLong(), anyLong(), 
any(HostDTO.class))).thenReturn(updatedHost);
+        when(hostService.update(anyLong(), 
any(HostDTO.class))).thenReturn(updatedHost);
 
-        ResponseEntity<HostVO> response = hostController.update(clusterId, 
hostId, hostReq);
+        ResponseEntity<HostVO> response = hostController.update(hostId, 
hostReq);
 
         assertTrue(response.isSuccess());
         assertEquals(updatedHost, response.getData());
@@ -109,11 +106,10 @@ class HostControllerTest {
 
     @Test
     void deleteReturnsSuccess() {
-        Long clusterId = 1L;
         Long hostId = 1L;
         when(hostService.delete(hostId)).thenReturn(true);
 
-        ResponseEntity<Boolean> response = hostController.delete(clusterId, 
hostId);
+        ResponseEntity<Boolean> response = hostController.delete(hostId);
 
         assertTrue(response.isSuccess());
         assertTrue(response.getData());
@@ -121,11 +117,10 @@ class HostControllerTest {
 
     @Test
     void checkConnectionReturnsSuccess() {
-        Long clusterId = 1L;
         HostReq hostReq = new HostReq();
         when(hostService.checkConnection(any(HostDTO.class))).thenReturn(true);
 
-        ResponseEntity<Boolean> response = 
hostController.checkConnection(clusterId, hostReq);
+        ResponseEntity<Boolean> response = 
hostController.checkConnection(hostReq);
 
         assertTrue(response.isSuccess());
         assertTrue(response.getData());
@@ -133,11 +128,10 @@ class HostControllerTest {
 
     @Test
     void listReturnsEmptyForInvalidClusterId() {
-        Long clusterId = 999L;
         HostQuery hostQuery = new HostQuery();
-        when(hostService.list(clusterId, hostQuery)).thenReturn(new 
PageVO<>());
+        when(hostService.list(hostQuery)).thenReturn(new PageVO<>());
 
-        ResponseEntity<PageVO<HostVO>> response = 
hostController.list(clusterId, hostQuery);
+        ResponseEntity<PageVO<HostVO>> response = 
hostController.list(hostQuery);
 
         assertTrue(response.isSuccess());
         assertNull(response.getData().getContent());
@@ -145,11 +139,10 @@ class HostControllerTest {
 
     @Test
     void getReturnsNullForInvalidHostId() {
-        Long clusterId = 1L;
         Long hostId = 999L;
         when(hostService.get(hostId)).thenReturn(null);
 
-        ResponseEntity<HostVO> response = hostController.get(hostId, 
clusterId);
+        ResponseEntity<HostVO> response = hostController.get(hostId);
 
         assertTrue(response.isSuccess());
         assertNull(response.getData());
@@ -157,12 +150,11 @@ class HostControllerTest {
 
     @Test
     void updateReturnsNullForInvalidHostId() {
-        Long clusterId = 1L;
         Long hostId = 999L;
         HostReq hostReq = new HostReq();
-        when(hostService.update(anyLong(), anyLong(), 
any(HostDTO.class))).thenReturn(null);
+        when(hostService.update(anyLong(), 
any(HostDTO.class))).thenReturn(null);
 
-        ResponseEntity<HostVO> response = hostController.update(clusterId, 
hostId, hostReq);
+        ResponseEntity<HostVO> response = hostController.update(hostId, 
hostReq);
 
         assertTrue(response.isSuccess());
         assertNull(response.getData());
@@ -170,11 +162,10 @@ class HostControllerTest {
 
     @Test
     void deleteReturnsFalseForInvalidHostId() {
-        Long clusterId = 1L;
         Long hostId = 999L;
         when(hostService.delete(hostId)).thenReturn(false);
 
-        ResponseEntity<Boolean> response = hostController.delete(clusterId, 
hostId);
+        ResponseEntity<Boolean> response = hostController.delete(hostId);
 
         assertTrue(response.isSuccess());
         assertFalse(response.getData());
@@ -182,11 +173,10 @@ class HostControllerTest {
 
     @Test
     void checkConnectionReturnsFalseForInvalidHostnames() {
-        Long clusterId = 1L;
         HostReq hostReq = new HostReq();
         
when(hostService.checkConnection(any(HostDTO.class))).thenReturn(false);
 
-        ResponseEntity<Boolean> response = 
hostController.checkConnection(clusterId, hostReq);
+        ResponseEntity<Boolean> response = 
hostController.checkConnection(hostReq);
 
         assertTrue(response.isSuccess());
         assertFalse(response.getData());
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/service/ClusterServiceTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/service/ClusterServiceTest.java
index 7abda725..6bd070dd 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/service/ClusterServiceTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/service/ClusterServiceTest.java
@@ -25,13 +25,8 @@ import org.apache.bigtop.manager.dao.repository.RepoDao;
 import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
 import org.apache.bigtop.manager.server.exception.ApiException;
 import org.apache.bigtop.manager.server.model.dto.ClusterDTO;
-import org.apache.bigtop.manager.server.model.dto.RepoDTO;
-import org.apache.bigtop.manager.server.model.dto.ServiceDTO;
-import org.apache.bigtop.manager.server.model.dto.StackDTO;
 import org.apache.bigtop.manager.server.service.impl.ClusterServiceImpl;
 
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -39,9 +34,7 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -61,44 +54,29 @@ public class ClusterServiceTest {
     @InjectMocks
     private ClusterService clusterService = new ClusterServiceImpl();
 
-    @Mock
-    private HostService hostService;
-
     private ClusterPO clusterPO;
-    private ClusterDTO clusterDTO;
-    Map<String, ImmutablePair<StackDTO, List<ServiceDTO>>> mockStackKeyMap = 
new HashMap<>();
 
     @BeforeEach
     public void setup() {
         clusterPO = new ClusterPO();
         clusterPO.setId(1L);
-        clusterPO.setClusterName(CLUSTER_NAME);
-
-        clusterDTO = new ClusterDTO();
-        clusterDTO.setClusterName(CLUSTER_NAME);
-        clusterDTO.setStackName("TestStack");
-        clusterDTO.setStackVersion("1.0.0");
-        RepoDTO repoDTO = new RepoDTO();
-        repoDTO.setArch("x86_64");
-        clusterDTO.setRepoInfoList(List.of(repoDTO));
-        StackDTO stackDTO = new StackDTO(clusterDTO.getStackName(), 
clusterDTO.getStackVersion());
-        stackDTO.setStackName("TestStack");
+        clusterPO.setName(CLUSTER_NAME);
     }
 
     @Test
     public void testListAndGetAndUpdate() {
-        when(clusterDao.findAllByJoin()).thenReturn(List.of(clusterPO));
+        when(clusterDao.findAll()).thenReturn(List.of(clusterPO));
         assert clusterService.list().size() == 1;
 
         assertEquals(
                 ApiExceptionEnum.CLUSTER_NOT_FOUND,
                 assertThrows(ApiException.class, () -> 
clusterService.get(1L)).getEx());
 
-        when(clusterDao.findByIdJoin(any())).thenReturn(clusterPO);
-        assert clusterService.get(1L).getClusterName().equals(CLUSTER_NAME);
+        when(clusterDao.findDetailsById(any())).thenReturn(clusterPO);
+        assert clusterService.get(1L).getName().equals(CLUSTER_NAME);
 
         ClusterDTO clusterDTO = new ClusterDTO();
-        clusterDTO.setClusterName(CLUSTER_NAME);
-        assert clusterService.update(1L, 
clusterDTO).getClusterName().equals(CLUSTER_NAME);
+        clusterDTO.setName(CLUSTER_NAME);
+        assert clusterService.update(1L, 
clusterDTO).getName().equals(CLUSTER_NAME);
     }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/param/BigtopParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/param/BigtopParams.java
index 8ffe6946..41a11d5e 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/param/BigtopParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/param/BigtopParams.java
@@ -32,14 +32,14 @@ public abstract class BigtopParams extends BaseParams {
     public String stackBinDir() {
         String stackName = this.commandPayload.getStackName();
         String stackVersion = this.commandPayload.getStackVersion();
-        String root = this.commandPayload.getRoot();
+        String root = this.commandPayload.getRootDir();
         return MessageFormat.format("{0}/{1}/{2}/usr/bin", root, 
stackName.toLowerCase(), stackVersion);
     }
 
     public String stackLibDir() {
         String stackName = this.commandPayload.getStackName();
         String stackVersion = this.commandPayload.getStackVersion();
-        String root = this.commandPayload.getRoot();
+        String root = this.commandPayload.getRootDir();
         return MessageFormat.format("{0}/{1}/{2}/usr/lib", root, 
stackName.toLowerCase(), stackVersion);
     }
 
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
index e17f47de..51207e9b 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
@@ -133,7 +133,7 @@ public abstract class BaseParams implements Params {
     public String stackHome() {
         String stackName = this.commandPayload.getStackName();
         String stackVersion = this.commandPayload.getStackVersion();
-        String root = this.commandPayload.getRoot();
+        String root = this.commandPayload.getRootDir();
         return MessageFormat.format("{0}/{1}/{2}", root, 
stackName.toLowerCase(), stackVersion);
     }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
index 19746fc6..4273cf09 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
@@ -32,7 +32,6 @@ import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 
 @Slf4j
 public class LocalSettings {
@@ -97,8 +96,7 @@ public class LocalSettings {
     }
 
     public static List<String> packages() {
-        ClusterInfo cluster = cluster();
-        return Optional.ofNullable(cluster.getPackages()).orElse(List.of());
+        return List.of();
     }
 
     public static List<RepoInfo> repos() {

Reply via email to