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 9d152b5e BIGTOP-4277: Adjust Service Add Command (#109)
9d152b5e is described below

commit 9d152b5eec1a26ef902df8c1a5f9915284152787
Author: Zhiguo Wu <[email protected]>
AuthorDate: Tue Nov 26 09:19:07 2024 +0800

    BIGTOP-4277: Adjust Service Add Command (#109)
---
 .../bigtop/manager/common/enums/Command.java       |   6 +-
 .../bigtop/manager/dao/repository/ClusterDao.java  |   2 -
 .../bigtop/manager/dao/repository/HostDao.java     |   2 +-
 .../bigtop/manager/dao/repository/RepoDao.java     |  12 +-
 .../bigtop/manager/dao/repository/ServiceDao.java  |   6 +-
 .../bigtop/manager/dao/repository/StageDao.java    |   2 -
 .../bigtop/manager/dao/repository/TaskDao.java     |   2 -
 .../main/resources/mapper/mysql/ClusterMapper.xml  |  18 ---
 .../src/main/resources/mapper/mysql/HostMapper.xml |   6 +-
 .../src/main/resources/mapper/mysql/RepoMapper.xml |  29 +---
 .../main/resources/mapper/mysql/ServiceMapper.xml  |  20 +--
 .../main/resources/mapper/mysql/StageMapper.xml    |  14 --
 .../src/main/resources/mapper/mysql/TaskMapper.xml |  14 --
 .../resources/mapper/postgresql/ClusterMapper.xml  |  18 ---
 .../resources/mapper/postgresql/HostMapper.xml     |   6 +-
 .../resources/mapper/postgresql/RepoMapper.xml     |  29 +---
 .../resources/mapper/postgresql/ServiceMapper.xml  |  20 +--
 .../resources/mapper/postgresql/StageMapper.xml    |  14 --
 .../resources/mapper/postgresql/TaskMapper.xml     |  14 --
 ...teJobFactory.java => ClusterAddJobFactory.java} |   8 +-
 ...JobFactory.java => ComponentAddJobFactory.java} |   4 +-
 ...llJobFactory.java => ServiceAddJobFactory.java} |   8 +-
 .../manager/server/command/job/AbstractJob.java    |   4 +-
 .../server/command/job/AbstractServiceJob.java     |  78 +++++------
 .../{ClusterCreateJob.java => ClusterAddJob.java}  |  16 +--
 .../manager/server/command/job/HostAddJob.java     |  69 ----------
 .../manager/server/command/job/JobContext.java     |   2 +
 .../{ServiceInstallJob.java => ServiceAddJob.java} | 150 +++++++++++----------
 ...entInstallStage.java => ComponentAddStage.java} |  10 +-
 .../server/command/task/CacheFileUpdateTask.java   |   4 +-
 ...onentInstallTask.java => ComponentAddTask.java} |  22 ++-
 ...eateValidator.java => ClusterAddValidator.java} |   4 +-
 .../server/command/validator/HostAddValidator.java |   4 +-
 .../validator/RequiredServicesValidator.java       |   4 +-
 .../command/validator/ServiceHostValidator.java    |  65 ---------
 .../config/CommandGroupSequenceProvider.java       |   2 +-
 .../model/converter/ServiceConfigConverter.java    |   5 +
 .../manager/server/model/dto/ComponentHostDTO.java |   2 +-
 .../model/dto/command/ServiceCommandDTO.java       |   6 -
 .../manager/server/model/req/ComponentHostReq.java |   4 +-
 .../model/req/command/ServiceCommandReq.java       |   9 --
 .../bigtop/manager/server/model/vo/JobVO.java      |   4 -
 .../bigtop/manager/server/model/vo/ServiceVO.java  |  12 +-
 .../server/service/impl/CommandServiceImpl.java    |   1 +
 .../server/service/impl/HostServiceImpl.java       |   2 +-
 .../server/service/impl/JobServiceImpl.java        |   1 +
 .../ComponentStatusTimer.java}                     |  20 +--
 .../HostInfoTimer.java}                            |  13 +-
 .../bigtop/manager/server/utils/StackUtils.java    |  19 +++
 .../stacks/bigtop/3.3.0/services/kafka/order.json  |   4 +-
 .../manager/stack/bigtop/param/BigtopParams.java   |  15 +--
 .../manager/stack/core/param/BaseParams.java       |   2 +-
 .../stack/core/spi/script/AbstractScript.java      |   6 +-
 .../manager/stack/core/spi/script/Script.java      |   7 +-
 .../v1_0_0/prometheus/PrometheusServerScript.java  |   4 +-
 55 files changed, 277 insertions(+), 547 deletions(-)

diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/enums/Command.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/enums/Command.java
index a379fcaa..4af14bc5 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/enums/Command.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/enums/Command.java
@@ -28,11 +28,9 @@ import lombok.Getter;
 @AllArgsConstructor
 @Getter
 public enum Command {
-    CREATE("create", "Create"),
+    ADD("add", "Add"),
 
-    INSTALL("install", "Install"),
-
-    UNINSTALL("uninstall", "Uninstall"),
+    REMOVE("remove", "Remove"),
 
     START("start", "Start"),
 
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 af60ee87..3ee62d96 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
@@ -30,6 +30,4 @@ public interface ClusterDao extends BaseDao<ClusterPO> {
     ClusterPO findByName(@Param("name") String name);
 
     Integer count();
-
-    ClusterPO findByIdJoin(@Param("clusterId") Long clusterId);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
index 87bd92a9..b2fc7c17 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
@@ -35,7 +35,7 @@ public interface HostDao extends BaseDao<HostPO> {
 
     HostPO findByHostname(@Param("hostname") String hostname);
 
-    List<HostPO> findAllByHostnameIn(@Param("hostnames") Collection<String> 
hostnames);
+    List<HostPO> findAllByHostnames(@Param("hostnames") Collection<String> 
hostnames);
 
     List<HostPO> findAllByClusterId(@Param("clusterId") Long clusterId);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
index 3c8d3021..32e4cb08 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
@@ -21,14 +21,4 @@ package org.apache.bigtop.manager.dao.repository;
 
 import org.apache.bigtop.manager.dao.po.RepoPO;
 
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface RepoDao extends BaseDao<RepoPO> {
-
-    Optional<RepoPO> findByRepoName(@Param("repoName") String clusterName);
-
-    List<RepoPO> findAllByClusterId(@Param("clusterId") Long clusterId);
-}
+public interface RepoDao extends BaseDao<RepoPO> {}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ServiceDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ServiceDao.java
index 8901b882..7a24a3e6 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ServiceDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ServiceDao.java
@@ -32,9 +32,7 @@ public interface ServiceDao extends BaseDao<ServicePO> {
 
     List<ServicePO> findByClusterId(@Param("clusterId") Long clusterId);
 
-    ServicePO findByClusterIdAndServiceName(
-            @Param("clusterId") Long clusterId, @Param("serviceName") String 
serviceName);
+    ServicePO findByClusterIdAndName(@Param("clusterId") Long clusterId, 
@Param("name") String name);
 
-    List<ServicePO> findByClusterIdAndServiceNameIn(
-            @Param("clusterId") Long clusterId, @Param("serviceNames") 
List<String> serviceNames);
+    List<ServicePO> findByClusterIdAndNames(@Param("clusterId") Long 
clusterId, @Param("name") List<String> names);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/StageDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/StageDao.java
index 993c57dc..5d355ea4 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/StageDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/StageDao.java
@@ -28,6 +28,4 @@ import java.util.List;
 public interface StageDao extends BaseDao<StagePO> {
 
     List<StagePO> findByJobId(@Param("jobId") Long jobId);
-
-    void updateStateByIds(@Param("stages") List<StagePO> stages);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/TaskDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/TaskDao.java
index fcf32c3a..d4c93d58 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/TaskDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/TaskDao.java
@@ -28,6 +28,4 @@ import java.util.List;
 public interface TaskDao extends BaseDao<TaskPO> {
 
     List<TaskPO> findByStageId(@Param("stageId") Long stageId);
-
-    void updateStateByIds(@Param("tasks") List<TaskPO> tasks);
 }
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 921380b2..cd8e6df2 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml
@@ -57,22 +57,4 @@
     <select id="count" resultType="java.lang.Integer">
         select count(*) from cluster
     </select>
-
-    <select id="findByIdJoin"
-            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
-        <where>
-            <if test="clusterId!=0">
-                r.id=#{clusterId}
-            </if>
-        </where>
-    </select>
 </mapper>
\ No newline at end of file
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 3548f4f3..9fa1a41f 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
@@ -58,7 +58,7 @@
                 and h.status = #{query.status}
             </if>
         </where>
-        group by h.id
+        group by h.id, c.name
     </select>
 
     <select id="findDetailsById" 
resultType="org.apache.bigtop.manager.dao.po.HostPO">
@@ -70,7 +70,7 @@
         left join cluster c on h.cluster_id = c.id
         left join component comp on h.id = comp.host_id
         where h.id = #{id}
-        group by h.id
+        group by h.id, c.name
         limit 1
     </select>
 
@@ -107,7 +107,7 @@
         on h.cluster_id = clus.id
     </select>
 
-    <select id="findAllByHostnameIn"
+    <select id="findAllByHostnames"
             resultType="org.apache.bigtop.manager.dao.po.HostPO">
         select
         <include refid="baseColumns"/>
diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
index d1f0d358..fe0670ea 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
@@ -24,33 +24,6 @@
 <mapper namespace="org.apache.bigtop.manager.dao.repository.RepoDao">
 
     <sql id="baseColumns">
-        id, base_url, os, arch, repo_id, repo_name, repo_type, cluster_id
+        id, name, arch, base_url, type
     </sql>
-
-    <select id="findByRepoName" 
resultType="org.apache.bigtop.manager.dao.po.RepoPO">
-        select
-        <include refid="baseColumns"/>
-        from
-        repo
-        <where>
-            <if test="repoName!=null">
-                repo_name=#{repoName}
-            </if>
-        </where>
-        limit 1
-    </select>
-
-    <select id="findAllByClusterId" parameterType="java.lang.Long"
-            resultType="org.apache.bigtop.manager.dao.po.RepoPO">
-        select
-        <include refid="baseColumns"/>
-        from
-        repo
-        <where>
-            <if test="clusterId != 0">
-                cluster_id = #{clusterId}
-            </if>
-        </where>
-    </select>
-
 </mapper>
\ No newline at end of file
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 70cbe85d..4d1f0393 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
@@ -60,36 +60,36 @@
         cluster_id = #{clusterId}
     </select>
 
-    <select id="findByClusterIdAndServiceName"
+    <select id="findByClusterIdAndName"
             resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
         <include refid="baseColumns"/>
         from
         service
         <where>
-            <if test="clusterId != 0">
+            <if test="clusterId != null">
                 cluster_id = #{clusterId}
             </if>
-            <if test="serviceName != null">
-                and service_name = #{serviceName}
+            <if test="name != null and name != ''">
+                and name = #{name}
             </if>
         </where>
     </select>
 
-    <select id="findByClusterIdAndServiceNameIn"
+    <select id="findByClusterIdAndNames"
             resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
         <include refid="baseColumns"/>
         from
         service
         <where>
-            <if test="clusterId != 0">
+            <if test="clusterId != null">
                 cluster_id = #{clusterId}
             </if>
-            <if test="serviceNames != null and serviceNames.size() > 0">
-                and service_name in
-                <foreach collection="serviceNames" item="serviceName" 
index="index" open="(" close=")" separator=", ">
-                    #{serviceName}
+            <if test="names != null and names.size() > 0">
+                and name in
+                <foreach collection="names" item="name" index="index" open="(" 
close=")" separator=", ">
+                    #{name}
                 </foreach>
             </if>
         </where>
diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/StageMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/StageMapper.xml
index 203d9bed..5f183f0a 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/StageMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/StageMapper.xml
@@ -29,18 +29,4 @@
         WHERE job_id = #{jobId}
         ORDER BY `order` asc
     </select>
-
-    <update id="updateStateByIds" parameterType="java.util.List">
-        UPDATE stage
-        SET `state` = CASE
-        <foreach collection="stages" item="item" index="index">
-            WHEN id = #{item.id} THEN #{item.state}
-        </foreach>
-        END
-        WHERE id IN
-        <foreach collection="stages" index="index" item="item" open="(" 
separator="," close=")">
-            #{item.id}
-        </foreach>
-    </update>
-
 </mapper>
\ No newline at end of file
diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/TaskMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/TaskMapper.xml
index 0e6dcf47..4b6e3f53 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/TaskMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/TaskMapper.xml
@@ -29,18 +29,4 @@
         WHERE stage_id = #{stageId}
         ORDER BY id asc
     </select>
-
-    <update id="updateStateByIds" parameterType="java.util.List">
-        UPDATE task
-        SET `state` = CASE
-        <foreach collection="tasks" item="item" index="index">
-            WHEN id = #{item.id} THEN #{item.state}
-        </foreach>
-        END
-        WHERE id IN
-        <foreach collection="tasks" index="index" item="item" open="(" 
separator="," close=")">
-            #{item.id}
-        </foreach>
-    </update>
-
 </mapper>
\ No newline at end of file
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 f2334e0c..7d72590c 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml
@@ -57,22 +57,4 @@
     <select id="count" resultType="java.lang.Integer">
         select count(*) from cluster
     </select>
-
-    <select id="findByIdJoin"
-            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
-        <where>
-            <if test="clusterId!=0">
-                r.id=#{clusterId}
-            </if>
-        </where>
-    </select>
 </mapper>
\ No newline at end of file
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 280f118e..af92a20f 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
@@ -58,7 +58,7 @@
                 and h.status = #{query.status}
             </if>
         </where>
-        group by h.id
+        group by h.id, c.name
     </select>
 
     <select id="findDetailsById" 
resultType="org.apache.bigtop.manager.dao.po.HostPO">
@@ -70,7 +70,7 @@
         left join cluster c on h.cluster_id = c.id
         left join component comp on h.id = comp.host_id
         where h.id = #{id}
-        group by h.id
+        group by h.id, c.name
         limit 1
     </select>
 
@@ -100,7 +100,7 @@
         on h.cluster_id = clus.id
     </select>
 
-    <select id="findAllByHostnameIn"
+    <select id="findAllByHostnames"
             resultType="org.apache.bigtop.manager.dao.po.HostPO">
         select
         <include refid="baseColumns"/>
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml
index d1f0d358..fe0670ea 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml
@@ -24,33 +24,6 @@
 <mapper namespace="org.apache.bigtop.manager.dao.repository.RepoDao">
 
     <sql id="baseColumns">
-        id, base_url, os, arch, repo_id, repo_name, repo_type, cluster_id
+        id, name, arch, base_url, type
     </sql>
-
-    <select id="findByRepoName" 
resultType="org.apache.bigtop.manager.dao.po.RepoPO">
-        select
-        <include refid="baseColumns"/>
-        from
-        repo
-        <where>
-            <if test="repoName!=null">
-                repo_name=#{repoName}
-            </if>
-        </where>
-        limit 1
-    </select>
-
-    <select id="findAllByClusterId" parameterType="java.lang.Long"
-            resultType="org.apache.bigtop.manager.dao.po.RepoPO">
-        select
-        <include refid="baseColumns"/>
-        from
-        repo
-        <where>
-            <if test="clusterId != 0">
-                cluster_id = #{clusterId}
-            </if>
-        </where>
-    </select>
-
 </mapper>
\ No newline at end of file
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 d540e82d..630e7026 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
@@ -60,36 +60,36 @@
         cluster_id = #{clusterId}
     </select>
 
-    <select id="findByClusterIdAndServiceName"
+    <select id="findByClusterIdAndName"
             resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
         <include refid="baseColumns"/>
         from
         service
         <where>
-            <if test="clusterId != 0">
+            <if test="clusterId != null">
                 cluster_id = #{clusterId}
             </if>
-            <if test="serviceName != null">
-                and service_name = #{serviceName}
+            <if test="name != null and name != ''">
+                and name = #{name}
             </if>
         </where>
     </select>
 
-    <select id="findByClusterIdAndServiceNameIn"
+    <select id="findByClusterIdAndNames"
             resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
         <include refid="baseColumns"/>
         from
         service
         <where>
-            <if test="clusterId != 0">
+            <if test="clusterId != null">
                 cluster_id = #{clusterId}
             </if>
-            <if test="serviceNames != null and serviceNames.size() > 0">
-                and service_name in
-                <foreach collection="serviceNames" item="serviceName" 
index="index" open="(" close=")" separator=", ">
-                    #{serviceName}
+            <if test="names != null and names.size() > 0">
+                and name in
+                <foreach collection="names" item="name" index="index" open="(" 
close=")" separator=", ">
+                    #{name}
                 </foreach>
             </if>
         </where>
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/StageMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/StageMapper.xml
index a4b3889c..5648da0a 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/StageMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/StageMapper.xml
@@ -29,18 +29,4 @@
         WHERE job_id = #{jobId}
         ORDER BY "order" ASC
     </select>
-
-    <update id="updateStateByIds" parameterType="java.util.List">
-        UPDATE "stage"
-        SET "state" = CASE
-        <foreach collection="stages" item="item" index="index">
-            WHEN id = #{item.id} THEN #{item.state}
-        </foreach>
-        END
-        WHERE "id" IN
-        <foreach collection="stages" index="index" item="item" open="(" 
separator="," close=")">
-            #{item.id}
-        </foreach>
-    </update>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/TaskMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/TaskMapper.xml
index 10dbc8c3..4b6e3f53 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/TaskMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/TaskMapper.xml
@@ -29,18 +29,4 @@
         WHERE stage_id = #{stageId}
         ORDER BY id asc
     </select>
-
-    <update id="updateStateByIds" parameterType="java.util.List">
-        UPDATE task
-        SET "state" = CASE
-        <foreach collection="tasks" item="item" index="index">
-            WHEN id = #{item.id} THEN #{item.state}
-        </foreach>
-        END
-        WHERE id IN
-        <foreach collection="tasks" index="index" item="item" open="(" 
separator="," close=")">
-            #{item.id}
-        </foreach>
-    </update>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/cluster/ClusterCreateJobFactory.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/cluster/ClusterAddJobFactory.java
similarity index 89%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/cluster/ClusterCreateJobFactory.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/cluster/ClusterAddJobFactory.java
index ef9f5adf..640df20d 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/cluster/ClusterCreateJobFactory.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/cluster/ClusterAddJobFactory.java
@@ -20,7 +20,7 @@ package 
org.apache.bigtop.manager.server.command.factory.cluster;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.server.command.CommandIdentifier;
-import org.apache.bigtop.manager.server.command.job.ClusterCreateJob;
+import org.apache.bigtop.manager.server.command.job.ClusterAddJob;
 import org.apache.bigtop.manager.server.command.job.Job;
 import org.apache.bigtop.manager.server.command.job.JobContext;
 import org.apache.bigtop.manager.server.enums.CommandLevel;
@@ -34,15 +34,15 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class ClusterCreateJobFactory extends AbstractClusterJobFactory {
+public class ClusterAddJobFactory extends AbstractClusterJobFactory {
 
     @Override
     public CommandIdentifier getCommandIdentifier() {
-        return new CommandIdentifier(CommandLevel.CLUSTER, Command.CREATE);
+        return new CommandIdentifier(CommandLevel.CLUSTER, Command.ADD);
     }
 
     @Override
     public Job createJob(JobContext jobContext) {
-        return new ClusterCreateJob(jobContext);
+        return new ClusterAddJob(jobContext);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/component/ComponentInstallJobFactory.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/component/ComponentAddJobFactory.java
similarity index 94%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/component/ComponentInstallJobFactory.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/component/ComponentAddJobFactory.java
index 74308ec5..8f39dce3 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/component/ComponentInstallJobFactory.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/component/ComponentAddJobFactory.java
@@ -33,11 +33,11 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class ComponentInstallJobFactory extends AbstractComponentJobFactory {
+public class ComponentAddJobFactory extends AbstractComponentJobFactory {
 
     @Override
     public CommandIdentifier getCommandIdentifier() {
-        return new CommandIdentifier(CommandLevel.COMPONENT, Command.INSTALL);
+        return new CommandIdentifier(CommandLevel.COMPONENT, Command.ADD);
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/service/ServiceInstallJobFactory.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/service/ServiceAddJobFactory.java
similarity index 88%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/service/ServiceInstallJobFactory.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/service/ServiceAddJobFactory.java
index 4b0f9d79..3d0d4f11 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/service/ServiceInstallJobFactory.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/service/ServiceAddJobFactory.java
@@ -22,7 +22,7 @@ import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.server.command.CommandIdentifier;
 import org.apache.bigtop.manager.server.command.job.Job;
 import org.apache.bigtop.manager.server.command.job.JobContext;
-import org.apache.bigtop.manager.server.command.job.ServiceInstallJob;
+import org.apache.bigtop.manager.server.command.job.ServiceAddJob;
 import org.apache.bigtop.manager.server.enums.CommandLevel;
 
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@@ -34,15 +34,15 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class ServiceInstallJobFactory extends AbstractServiceJobFactory {
+public class ServiceAddJobFactory extends AbstractServiceJobFactory {
 
     @Override
     public CommandIdentifier getCommandIdentifier() {
-        return new CommandIdentifier(CommandLevel.SERVICE, Command.INSTALL);
+        return new CommandIdentifier(CommandLevel.SERVICE, Command.ADD);
     }
 
     @Override
     public Job createJob(JobContext jobContext) {
-        return new ServiceInstallJob(jobContext);
+        return new ServiceAddJob(jobContext);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
index bf5d3475..635d5590 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
@@ -146,10 +146,10 @@ public abstract class AbstractJob implements Job {
             }
         }
         if (!taskPOList.isEmpty()) {
-            taskDao.updateStateByIds(taskPOList);
+            taskDao.partialUpdateByIds(taskPOList);
         }
         if (!stagePOList.isEmpty()) {
-            stageDao.updateStateByIds(stagePOList);
+            stageDao.partialUpdateByIds(stagePOList);
         }
         jobDao.partialUpdateById(jobPO);
     }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
index 6eaee595..6b73c848 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
@@ -25,10 +25,13 @@ import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.query.ComponentQuery;
 import org.apache.bigtop.manager.dao.repository.ComponentDao;
 import org.apache.bigtop.manager.dao.repository.HostDao;
+import org.apache.bigtop.manager.dao.repository.ServiceConfigDao;
+import org.apache.bigtop.manager.dao.repository.ServiceConfigSnapshotDao;
+import org.apache.bigtop.manager.dao.repository.ServiceDao;
 import org.apache.bigtop.manager.server.command.stage.CacheFileUpdateStage;
+import org.apache.bigtop.manager.server.command.stage.ComponentAddStage;
 import org.apache.bigtop.manager.server.command.stage.ComponentCheckStage;
 import org.apache.bigtop.manager.server.command.stage.ComponentConfigureStage;
-import org.apache.bigtop.manager.server.command.stage.ComponentInstallStage;
 import org.apache.bigtop.manager.server.command.stage.ComponentStartStage;
 import org.apache.bigtop.manager.server.command.stage.ComponentStopStage;
 import org.apache.bigtop.manager.server.command.stage.StageContext;
@@ -37,11 +40,7 @@ import 
org.apache.bigtop.manager.server.holder.SpringContextHolder;
 import org.apache.bigtop.manager.server.model.dto.ComponentDTO;
 import org.apache.bigtop.manager.server.model.dto.ComponentHostDTO;
 import org.apache.bigtop.manager.server.model.dto.ServiceDTO;
-import org.apache.bigtop.manager.server.model.dto.StackDTO;
 import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO;
-import org.apache.bigtop.manager.server.stack.dag.ComponentCommandWrapper;
-import org.apache.bigtop.manager.server.stack.dag.DAG;
-import org.apache.bigtop.manager.server.stack.dag.DagGraphEdge;
 import org.apache.bigtop.manager.server.utils.StackUtils;
 
 import org.apache.commons.collections4.CollectionUtils;
@@ -51,14 +50,12 @@ import java.util.List;
 
 public abstract class AbstractServiceJob extends AbstractJob {
 
+    protected ServiceDao serviceDao;
+    protected ServiceConfigDao serviceConfigDao;
+    protected ServiceConfigSnapshotDao serviceConfigSnapshotDao;
     protected ComponentDao componentDao;
     protected HostDao hostDao;
 
-    // TODO: temp code
-    protected String stackName = "bigtop";
-    protected String stackVersion = "3.3.0";
-    protected DAG<String, ComponentCommandWrapper, DagGraphEdge> dag = 
StackUtils.DAG;
-
     public AbstractServiceJob(JobContext jobContext) {
         super(jobContext);
     }
@@ -67,6 +64,9 @@ public abstract class AbstractServiceJob extends AbstractJob {
     protected void injectBeans() {
         super.injectBeans();
 
+        this.serviceDao = SpringContextHolder.getBean(ServiceDao.class);
+        this.serviceConfigDao = 
SpringContextHolder.getBean(ServiceConfigDao.class);
+        this.serviceConfigSnapshotDao = 
SpringContextHolder.getBean(ServiceConfigSnapshotDao.class);
         this.componentDao = SpringContextHolder.getBean(ComponentDao.class);
         this.hostDao = SpringContextHolder.getBean(HostDao.class);
     }
@@ -76,12 +76,13 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
         super.beforeCreateStages();
     }
 
-    protected StageContext createStageContext(String serviceName, String 
componentName, List<String> hostnames) {
+    protected StageContext createStageContext(String serviceName, String 
componentName, List<Long> hostIds) {
         StageContext stageContext = 
StageContext.fromCommandDTO(jobContext.getCommandDTO());
 
         ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName);
         ComponentDTO componentDTO = StackUtils.getComponentDTO(componentName);
 
+        stageContext.setHostIds(hostIds);
         stageContext.setServiceDTO(serviceDTO);
         stageContext.setComponentDTO(componentDTO);
 
@@ -90,7 +91,8 @@ public abstract class AbstractServiceJob extends AbstractJob {
 
     protected List<String> getTodoListForCommand(Command command) {
         try {
-            List<String> orderedList = dag.getAllNodesList().isEmpty() ? new 
ArrayList<>() : dag.topologicalSort();
+            List<String> orderedList =
+                    StackUtils.DAG.getAllNodesList().isEmpty() ? new 
ArrayList<>() : StackUtils.DAG.topologicalSort();
             List<String> componentNames = getComponentNames();
             List<String> componentCommandNames = new 
ArrayList<>(componentNames.stream()
                     .map(x -> x + "-" + command.name().toUpperCase())
@@ -118,15 +120,7 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
     }
 
     protected String findServiceNameByComponentName(String componentName) {
-        for (ServiceDTO serviceDTO : StackUtils.getServiceDTOList(new 
StackDTO(stackName, stackVersion))) {
-            for (ComponentDTO componentDTO : serviceDTO.getComponents()) {
-                if (componentDTO.getName().equals(componentName)) {
-                    return serviceDTO.getName();
-                }
-            }
-        }
-
-        return null;
+        return 
StackUtils.getServiceDTOByComponentName(componentName).getName();
     }
 
     protected Boolean isMasterComponent(String componentName) {
@@ -144,7 +138,7 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
         return 
componentDTO.getCategory().equalsIgnoreCase(ComponentCategories.CLIENT);
     }
 
-    protected List<String> findHostnamesByComponentName(String componentName) {
+    protected List<Long> findHostIdsByComponentName(String componentName) {
         ComponentQuery componentQuery = ComponentQuery.builder()
                 .clusterId(clusterPO.getId())
                 .name(componentName)
@@ -153,7 +147,7 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
         if (componentPOList == null) {
             return new ArrayList<>();
         } else {
-            return 
componentPOList.stream().map(ComponentPO::getHostname).toList();
+            return 
componentPOList.stream().map(ComponentPO::getHostId).toList();
         }
     }
 
@@ -162,35 +156,31 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
         stages.add(new CacheFileUpdateStage(stageContext));
     }
 
-    protected void createInstallStages() {
-        List<String> todoList = getTodoListForCommand(Command.INSTALL);
+    protected void createAddStages() {
+        List<String> todoList = getTodoListForCommand(Command.ADD);
 
         for (String componentCommand : todoList) {
             String[] split = componentCommand.split("-");
             String componentName = split[0];
             String serviceName = findServiceNameByComponentName(componentName);
-            List<String> hostnames = 
findHostnamesByComponentName(componentName);
-            if (CollectionUtils.isEmpty(hostnames)) {
+            List<Long> hostIds = findHostIdsByComponentName(componentName);
+            if (CollectionUtils.isEmpty(hostIds)) {
                 continue;
             }
 
-            StageContext stageContext = createStageContext(serviceName, 
componentName, hostnames);
-            stages.add(new ComponentInstallStage(stageContext));
+            StageContext stageContext = createStageContext(serviceName, 
componentName, hostIds);
+            stages.add(new ComponentAddStage(stageContext));
         }
     }
 
     protected void createConfigureStages() {
         for (ServiceCommandDTO serviceCommand : 
jobContext.getCommandDTO().getServiceCommands()) {
-            if (serviceCommand.getInstalled()) {
-                continue;
-            }
-
             for (ComponentHostDTO componentHost : 
serviceCommand.getComponentHosts()) {
                 String serviceName = serviceCommand.getServiceName();
                 String componentName = componentHost.getComponentName();
-                List<String> hostnames = componentHost.getHostnames();
+                List<Long> hostIds = componentHost.getHostIds();
 
-                StageContext stageContext = createStageContext(serviceName, 
componentName, hostnames);
+                StageContext stageContext = createStageContext(serviceName, 
componentName, hostIds);
                 stages.add(new ComponentConfigureStage(stageContext));
             }
         }
@@ -208,12 +198,12 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
                 continue;
             }
 
-            List<String> hostnames = 
findHostnamesByComponentName(componentName);
-            if (CollectionUtils.isEmpty(hostnames)) {
+            List<Long> hostIds = findHostIdsByComponentName(componentName);
+            if (CollectionUtils.isEmpty(hostIds)) {
                 continue;
             }
 
-            StageContext stageContext = createStageContext(serviceName, 
componentName, hostnames);
+            StageContext stageContext = createStageContext(serviceName, 
componentName, hostIds);
             stages.add(new ComponentStartStage(stageContext));
         }
     }
@@ -230,12 +220,12 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
                 continue;
             }
 
-            List<String> hostnames = 
findHostnamesByComponentName(componentName);
-            if (CollectionUtils.isEmpty(hostnames)) {
+            List<Long> hostIds = findHostIdsByComponentName(componentName);
+            if (CollectionUtils.isEmpty(hostIds)) {
                 continue;
             }
 
-            StageContext stageContext = createStageContext(serviceName, 
componentName, hostnames);
+            StageContext stageContext = createStageContext(serviceName, 
componentName, hostIds);
             stages.add(new ComponentStopStage(stageContext));
         }
     }
@@ -252,12 +242,12 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
                 continue;
             }
 
-            List<String> hostnames = 
findHostnamesByComponentName(componentName);
-            if (CollectionUtils.isEmpty(hostnames)) {
+            List<Long> hostIds = findHostIdsByComponentName(componentName);
+            if (CollectionUtils.isEmpty(hostIds)) {
                 continue;
             }
 
-            StageContext stageContext = createStageContext(serviceName, 
componentName, List.of(hostnames.get(0)));
+            StageContext stageContext = createStageContext(serviceName, 
componentName, List.of(hostIds.get(0)));
             stages.add(new ComponentCheckStage(stageContext));
         }
     }
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/ClusterAddJob.java
similarity index 96%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterAddJob.java
index ebf67db4..99f1e55b 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/ClusterAddJob.java
@@ -37,11 +37,11 @@ import 
org.apache.bigtop.manager.server.model.dto.CommandDTO;
 import java.util.ArrayList;
 import java.util.List;
 
-public class ClusterCreateJob extends AbstractJob {
+public class ClusterAddJob extends AbstractJob {
 
     private HostDao hostDao;
 
-    public ClusterCreateJob(JobContext jobContext) {
+    public ClusterAddJob(JobContext jobContext) {
         super(jobContext);
     }
 
@@ -62,6 +62,11 @@ public class ClusterCreateJob extends AbstractJob {
     @Override
     public void beforeRun() {
         super.beforeRun();
+    }
+
+    @Override
+    public void onSuccess() {
+        super.onSuccess();
 
         saveCluster();
 
@@ -70,14 +75,9 @@ public class ClusterCreateJob extends AbstractJob {
         linkJobToCluster();
     }
 
-    @Override
-    public void onSuccess() {
-        super.onSuccess();
-    }
-
     @Override
     public String getName() {
-        return "Create cluster";
+        return "Add cluster";
     }
 
     private void saveCluster() {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostAddJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostAddJob.java
deleted file mode 100644
index 553787a8..00000000
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostAddJob.java
+++ /dev/null
@@ -1,69 +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.job;
-
-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.StageContext;
-import org.apache.bigtop.manager.server.holder.SpringContextHolder;
-import org.apache.bigtop.manager.server.model.dto.CommandDTO;
-import org.apache.bigtop.manager.server.model.dto.command.HostCommandDTO;
-import org.apache.bigtop.manager.server.service.HostService;
-
-import java.util.List;
-
-public class HostAddJob extends AbstractJob {
-
-    private HostService hostService;
-
-    public HostAddJob(JobContext jobContext) {
-        super(jobContext);
-    }
-
-    @Override
-    protected void injectBeans() {
-        super.injectBeans();
-
-        this.hostService = SpringContextHolder.getBean(HostService.class);
-    }
-
-    @Override
-    protected void createStages() {
-        StageContext stageContext = 
StageContext.fromCommandDTO(jobContext.getCommandDTO());
-        stages.add(new HostCheckStage(stageContext));
-        stages.add(new CacheFileUpdateStage(stageContext));
-    }
-
-    @Override
-    public void onSuccess() {
-        super.onSuccess();
-
-        CommandDTO commandDTO = jobContext.getCommandDTO();
-        List<HostCommandDTO> hostCommands = commandDTO.getHostCommands();
-
-        List<String> hostnames =
-                
hostCommands.stream().map(HostCommandDTO::getHostname).toList();
-        hostService.batchSave(commandDTO.getClusterId(), hostnames);
-    }
-
-    @Override
-    public String getName() {
-        return "Add host";
-    }
-}
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/JobContext.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/JobContext.java
index 5b9206d3..63280cc9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/JobContext.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/JobContext.java
@@ -26,4 +26,6 @@ import lombok.Data;
 public class JobContext {
 
     private CommandDTO commandDTO;
+
+    private Boolean retryFlag;
 }
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/ServiceAddJob.java
similarity index 51%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceAddJob.java
index 4b61a5c1..2d6d8907 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/ServiceAddJob.java
@@ -18,49 +18,45 @@
  */
 package org.apache.bigtop.manager.server.command.job;
 
-import org.apache.bigtop.manager.dao.po.ClusterPO;
+import org.apache.bigtop.manager.common.utils.JsonUtils;
 import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.po.HostPO;
+import org.apache.bigtop.manager.dao.po.ServiceConfigPO;
+import org.apache.bigtop.manager.dao.po.ServiceConfigSnapshotPO;
 import org.apache.bigtop.manager.dao.po.ServicePO;
-import org.apache.bigtop.manager.dao.query.ComponentQuery;
-import org.apache.bigtop.manager.dao.repository.HostDao;
-import org.apache.bigtop.manager.dao.repository.ServiceDao;
-import org.apache.bigtop.manager.server.holder.SpringContextHolder;
+import org.apache.bigtop.manager.server.enums.HealthyStatusEnum;
 import org.apache.bigtop.manager.server.model.converter.ComponentConverter;
+import org.apache.bigtop.manager.server.model.converter.ServiceConfigConverter;
 import org.apache.bigtop.manager.server.model.converter.ServiceConverter;
 import org.apache.bigtop.manager.server.model.dto.CommandDTO;
 import org.apache.bigtop.manager.server.model.dto.ComponentDTO;
 import org.apache.bigtop.manager.server.model.dto.ComponentHostDTO;
+import org.apache.bigtop.manager.server.model.dto.ServiceConfigDTO;
 import org.apache.bigtop.manager.server.model.dto.ServiceDTO;
+import org.apache.bigtop.manager.server.model.dto.StackDTO;
 import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO;
 import org.apache.bigtop.manager.server.utils.StackUtils;
 
-import org.apache.commons.collections4.CollectionUtils;
-
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
-public class ServiceInstallJob extends AbstractServiceJob {
-
-    private ServiceDao serviceDao;
-    private HostDao hostDao;
+public class ServiceAddJob extends AbstractServiceJob {
 
-    public ServiceInstallJob(JobContext jobContext) {
+    public ServiceAddJob(JobContext jobContext) {
         super(jobContext);
     }
 
     @Override
     protected void injectBeans() {
         super.injectBeans();
-
-        this.serviceDao = SpringContextHolder.getBean(ServiceDao.class);
-        this.hostDao = SpringContextHolder.getBean(HostDao.class);
     }
 
     @Override
     protected void createStages() {
         // Install components
-        super.createInstallStages();
+        super.createAddStages();
 
         // Update cache files after installed
         super.createCacheStage();
@@ -90,25 +86,12 @@ public class ServiceInstallJob extends AbstractServiceJob {
     }
 
     @Override
-    protected List<String> findHostnamesByComponentName(String componentName) {
+    protected List<Long> findHostIdsByComponentName(String componentName) {
         for (ServiceCommandDTO serviceCommand : 
jobContext.getCommandDTO().getServiceCommands()) {
             List<ComponentHostDTO> componentHosts = 
serviceCommand.getComponentHosts();
             for (ComponentHostDTO componentHost : componentHosts) {
                 if (componentHost.getComponentName().equals(componentName)) {
-                    List<String> hostnames = new 
ArrayList<>(componentHost.getHostnames());
-                    if (serviceCommand.getInstalled()) {
-                        ComponentQuery componentQuery = 
ComponentQuery.builder()
-                                .clusterId(clusterPO.getId())
-                                .name(componentName)
-                                .build();
-                        List<String> existHostnames = 
componentDao.findByQuery(componentQuery).stream()
-                                .map(ComponentPO::getHostname)
-                                .toList();
-
-                        hostnames.removeAll(existHostnames);
-                    }
-
-                    return hostnames;
+                    return componentHost.getHostIds();
                 }
             }
         }
@@ -120,61 +103,92 @@ public class ServiceInstallJob extends AbstractServiceJob 
{
     public void beforeRun() {
         super.beforeRun();
 
+        // Skip persistent if it's a retry job
+        if (jobContext.getRetryFlag()) {
+            return;
+        }
+
         CommandDTO commandDTO = jobContext.getCommandDTO();
         List<ServiceCommandDTO> serviceCommands = 
commandDTO.getServiceCommands();
-        Long clusterId = commandDTO.getClusterId();
+        for (ServiceCommandDTO serviceCommand : serviceCommands) {
+            saveService(serviceCommand);
+        }
+    }
+
+    @Override
+    public void onSuccess() {
+        super.onSuccess();
 
-        // Persist service, component and hostComponent metadata to database
+        List<ServicePO> servicePOList = new ArrayList<>();
+        CommandDTO commandDTO = jobContext.getCommandDTO();
+        Long clusterId = commandDTO.getClusterId();
+        List<ServiceCommandDTO> serviceCommands = 
commandDTO.getServiceCommands();
         for (ServiceCommandDTO serviceCommand : serviceCommands) {
             String serviceName = serviceCommand.getServiceName();
-            ServicePO servicePO = 
serviceDao.findByClusterIdAndServiceName(clusterId, serviceName);
-            upsertService(servicePO, serviceCommand);
+            ServicePO servicePO = serviceDao.findByClusterIdAndName(clusterId, 
serviceName);
+            servicePO.setStatus(HealthyStatusEnum.HEALTHY.getCode());
+            servicePOList.add(servicePO);
         }
+
+        serviceDao.partialUpdateByIds(servicePOList);
     }
 
-    private void upsertService(ServicePO servicePO, ServiceCommandDTO 
serviceCommand) {
+    @Override
+    public String getName() {
+        return "Add services";
+    }
+
+    private void saveService(ServiceCommandDTO serviceCommand) {
         CommandDTO commandDTO = jobContext.getCommandDTO();
         Long clusterId = commandDTO.getClusterId();
         String serviceName = serviceCommand.getServiceName();
-        ClusterPO clusterPO = clusterDao.findByIdJoin(clusterId);
-
-        // 1. Persist service and components
-        if (servicePO == null) {
-            ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName);
-            servicePO = ServiceConverter.INSTANCE.fromDTO2PO(serviceDTO);
-            servicePO.setClusterId(clusterId);
-            serviceDao.save(servicePO);
-        }
-
-        // TODO 2. Update configs
 
+        // 1. Persist service
+        StackDTO stackDTO = StackUtils.getServiceStack(serviceName);
+        ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName);
+        ServicePO servicePO = ServiceConverter.INSTANCE.fromDTO2PO(serviceDTO);
+        servicePO.setClusterId(clusterId);
+        servicePO.setStack(StackUtils.getFullStackName(stackDTO));
+        servicePO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
+        serviceDao.save(servicePO);
+
+        // 2. Persist components
+        List<ComponentPO> componentPOList = new ArrayList<>();
         for (ComponentHostDTO componentHostDTO : 
serviceCommand.getComponentHosts()) {
             String componentName = componentHostDTO.getComponentName();
-            List<String> hostnames = componentHostDTO.getHostnames();
-            List<HostPO> hostPOList = hostDao.findAllByHostnameIn(hostnames);
+            List<HostPO> hostPOList = 
hostDao.findByIds(componentHostDTO.getHostIds());
 
-            // 3. Persist components
             for (HostPO hostPO : hostPOList) {
-                ComponentQuery componentQuery = ComponentQuery.builder()
-                        .clusterId(clusterPO.getId())
-                        .hostId(hostPO.getId())
-                        .name(componentName)
-                        .build();
-                List<ComponentPO> componentPOList = 
componentDao.findByQuery(componentQuery);
-                if (CollectionUtils.isEmpty(componentPOList)) {
-                    ComponentDTO componentDTO = 
StackUtils.getComponentDTO(componentName);
-                    ComponentPO componentPO = 
ComponentConverter.INSTANCE.fromDTO2PO(componentDTO);
-                    componentPO.setClusterId(clusterPO.getId());
-                    componentPO.setHostId(hostPO.getId());
-                    componentPO.setServiceId(servicePO.getId());
-                    componentDao.save(componentPO);
-                }
+                ComponentDTO componentDTO = 
StackUtils.getComponentDTO(componentName);
+                ComponentPO componentPO = 
ComponentConverter.INSTANCE.fromDTO2PO(componentDTO);
+                componentPO.setClusterId(clusterId);
+                componentPO.setHostId(hostPO.getId());
+                componentPO.setServiceId(servicePO.getId());
+                componentPO.setStatus(HealthyStatusEnum.UNKNOWN.getCode());
+                componentPOList.add(componentPO);
             }
         }
-    }
 
-    @Override
-    public String getName() {
-        return "Install services";
+        componentDao.saveAll(componentPOList);
+
+        // 3. Persist current configs
+        Map<String, String> confMap = new HashMap<>();
+        List<ServiceConfigDTO> configs = serviceCommand.getConfigs();
+        List<ServiceConfigPO> serviceConfigPOList = 
ServiceConfigConverter.INSTANCE.fromDTO2PO(configs);
+        for (ServiceConfigPO serviceConfigPO : serviceConfigPOList) {
+            serviceConfigPO.setClusterId(clusterId);
+            serviceConfigPO.setServiceId(servicePO.getId());
+            confMap.put(serviceConfigPO.getName(), 
serviceConfigPO.getPropertiesJson());
+        }
+
+        serviceConfigDao.saveAll(serviceConfigPOList);
+
+        // 4. Create initial config snapshot
+        ServiceConfigSnapshotPO serviceConfigSnapshotPO = new 
ServiceConfigSnapshotPO();
+        serviceConfigSnapshotPO.setName("initial");
+        serviceConfigSnapshotPO.setDesc("Initial config snapshot");
+        
serviceConfigSnapshotPO.setConfigJson(JsonUtils.writeAsString(confMap));
+        serviceConfigSnapshotPO.setServiceId(servicePO.getId());
+        serviceConfigSnapshotDao.save(serviceConfigSnapshotPO);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentInstallStage.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentAddStage.java
similarity index 76%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentInstallStage.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentAddStage.java
index 512420bd..6afefea1 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentInstallStage.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentAddStage.java
@@ -18,23 +18,23 @@
  */
 package org.apache.bigtop.manager.server.command.stage;
 
-import org.apache.bigtop.manager.server.command.task.ComponentInstallTask;
+import org.apache.bigtop.manager.server.command.task.ComponentAddTask;
 import org.apache.bigtop.manager.server.command.task.Task;
 import org.apache.bigtop.manager.server.model.dto.HostDTO;
 
-public class ComponentInstallStage extends AbstractComponentStage {
+public class ComponentAddStage extends AbstractComponentStage {
 
-    public ComponentInstallStage(StageContext stageContext) {
+    public ComponentAddStage(StageContext stageContext) {
         super(stageContext);
     }
 
     @Override
     protected Task createTask(HostDTO hostDTO) {
-        return new ComponentInstallTask(createTaskContext(hostDTO));
+        return new ComponentAddTask(createTaskContext(hostDTO));
     }
 
     @Override
     public String getName() {
-        return "Install " + stageContext.getComponentDTO().getDisplayName();
+        return "Add " + stageContext.getComponentDTO().getDisplayName();
     }
 }
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 da459398..cbd45153 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
@@ -105,7 +105,7 @@ public class CacheFileUpdateTask extends AbstractTask {
     }
 
     private void genFullCaches() {
-        ClusterPO clusterPO = 
clusterDao.findByIdJoin(taskContext.getClusterId());
+        ClusterPO clusterPO = clusterDao.findById(taskContext.getClusterId());
 
         Long clusterId = clusterPO.getId();
 
@@ -115,7 +115,7 @@ public class CacheFileUpdateTask extends AbstractTask {
         List<ServicePO> servicePOList = serviceDao.findByClusterId(clusterId);
         List<ServiceConfigPO> serviceConfigPOList = 
serviceConfigDao.findByClusterId(clusterPO.getId());
         List<ComponentPO> componentPOList = 
componentDao.findByQuery(componentQuery);
-        List<RepoPO> repoPOList = 
repoDao.findAllByClusterId(clusterPO.getId());
+        List<RepoPO> repoPOList = repoDao.findAll();
         Iterable<SettingPO> settings = settingDao.findAll();
         List<HostPO> hostPOList = hostDao.findAllByClusterId(clusterId);
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentAddTask.java
similarity index 66%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentAddTask.java
index a0b937e3..fc50700e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentAddTask.java
@@ -18,20 +18,23 @@
  */
 package org.apache.bigtop.manager.server.command.task;
 
+import org.apache.bigtop.manager.common.constants.ComponentCategories;
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.query.ComponentQuery;
 import org.apache.bigtop.manager.server.enums.HealthyStatusEnum;
+import org.apache.bigtop.manager.server.model.dto.ComponentDTO;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
-public class ComponentInstallTask extends AbstractComponentTask {
+public class ComponentAddTask extends AbstractComponentTask {
 
-    public ComponentInstallTask(TaskContext taskContext) {
+    public ComponentAddTask(TaskContext taskContext) {
         super(taskContext);
     }
 
     @Override
     protected Command getCommand() {
-        return Command.INSTALL;
+        return Command.ADD;
     }
 
     @Override
@@ -43,13 +46,22 @@ public class ComponentInstallTask extends 
AbstractComponentTask {
         ComponentQuery componentQuery =
                 
ComponentQuery.builder().hostname(hostname).name(componentName).build();
         ComponentPO componentPO = 
componentDao.findByQuery(componentQuery).get(0);
-        componentPO.setStatus(HealthyStatusEnum.UNKNOWN.getCode());
+
+        ComponentDTO componentDTO = StackUtils.getComponentDTO(componentName);
+        if 
(componentDTO.getCategory().equalsIgnoreCase(ComponentCategories.CLIENT)) {
+            // Client components should always be healthy after added
+            componentPO.setStatus(HealthyStatusEnum.HEALTHY.getCode());
+        } else {
+            // Master/Slave components need to start before being healthy
+            componentPO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
+        }
+
         componentDao.partialUpdateById(componentPO);
     }
 
     @Override
     public String getName() {
-        return "Install " + taskContext.getComponentDisplayName() + " on "
+        return "Add " + taskContext.getComponentDisplayName() + " on "
                 + taskContext.getHostDTO().getHostname();
     }
 }
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/ClusterAddValidator.java
similarity index 96%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterCreateValidator.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ClusterAddValidator.java
index ab255f20..a00a38f5 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/ClusterAddValidator.java
@@ -33,14 +33,14 @@ import jakarta.annotation.Resource;
 import java.util.List;
 
 @Component
-public class ClusterCreateValidator implements CommandValidator {
+public class ClusterAddValidator implements CommandValidator {
 
     @Resource
     private ClusterDao clusterDao;
 
     @Override
     public List<CommandIdentifier> getCommandIdentifiers() {
-        return List.of(new CommandIdentifier(CommandLevel.CLUSTER, 
Command.CREATE));
+        return List.of(new CommandIdentifier(CommandLevel.CLUSTER, 
Command.ADD));
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/HostAddValidator.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/HostAddValidator.java
index 1003f840..ae20aa7d 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/HostAddValidator.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/HostAddValidator.java
@@ -42,7 +42,7 @@ public class HostAddValidator implements CommandValidator {
 
     @Override
     public List<CommandIdentifier> getCommandIdentifiers() {
-        return List.of(new CommandIdentifier(CommandLevel.HOST, 
Command.INSTALL));
+        return List.of(new CommandIdentifier(CommandLevel.HOST, Command.ADD));
     }
 
     @Override
@@ -51,7 +51,7 @@ public class HostAddValidator implements CommandValidator {
                 .map(HostCommandDTO::getHostname)
                 .toList();
 
-        List<HostPO> hostPOList = hostDao.findAllByHostnameIn(hostnames);
+        List<HostPO> hostPOList = hostDao.findAllByHostnames(hostnames);
         if (CollectionUtils.isNotEmpty(hostPOList)) {
             List<String> existsHostnames =
                     hostPOList.stream().map(HostPO::getHostname).toList();
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
index 17e7723c..81e8c34f 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
@@ -50,7 +50,7 @@ public class RequiredServicesValidator implements 
CommandValidator {
 
     @Override
     public List<CommandIdentifier> getCommandIdentifiers() {
-        return List.of(new CommandIdentifier(CommandLevel.SERVICE, 
Command.INSTALL));
+        return List.of(new CommandIdentifier(CommandLevel.SERVICE, 
Command.ADD));
     }
 
     @Override
@@ -70,7 +70,7 @@ public class RequiredServicesValidator implements 
CommandValidator {
                 return;
             }
 
-            List<ServicePO> servicePOList = 
serviceDao.findByClusterIdAndServiceNameIn(clusterId, requiredServices);
+            List<ServicePO> servicePOList = 
serviceDao.findByClusterIdAndNames(clusterId, requiredServices);
             List<String> list = 
servicePOList.stream().map(ServicePO::getName).toList();
 
             requiredServices.removeAll(list);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ServiceHostValidator.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ServiceHostValidator.java
deleted file mode 100644
index 73b09242..00000000
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/ServiceHostValidator.java
+++ /dev/null
@@ -1,65 +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.model.dto.CommandDTO;
-import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO;
-
-import org.springframework.stereotype.Component;
-
-import jakarta.annotation.Resource;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-@Component
-public class ServiceHostValidator implements CommandValidator {
-
-    @Resource
-    private HostDao hostDao;
-
-    @Override
-    public List<CommandIdentifier> getCommandIdentifiers() {
-        return List.of(new CommandIdentifier(CommandLevel.SERVICE, 
Command.INSTALL));
-    }
-
-    @Override
-    public void validate(ValidatorContext context) {
-        CommandDTO commandDTO = context.getCommandDTO();
-        List<ServiceCommandDTO> serviceCommands = 
commandDTO.getServiceCommands();
-
-        Set<String> hostnameSet = serviceCommands.stream()
-                .flatMap(x -> x.getComponentHosts().stream())
-                .flatMap(x -> x.getHostnames().stream())
-                .collect(Collectors.toSet());
-
-        List<HostPO> hostnames = hostDao.findAllByHostnameIn(hostnameSet);
-
-        if (hostnames.size() != hostnameSet.size()) {
-            throw new ApiException(ApiExceptionEnum.HOST_NOT_FOUND);
-        }
-    }
-}
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/config/CommandGroupSequenceProvider.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/config/CommandGroupSequenceProvider.java
index 650a228f..f05b9c2c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/config/CommandGroupSequenceProvider.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/config/CommandGroupSequenceProvider.java
@@ -39,7 +39,7 @@ public class CommandGroupSequenceProvider implements 
DefaultGroupSequenceProvide
 
             switch (commandLevel) {
                 case SERVICE:
-                    if (bean.getCommand() == Command.INSTALL) {
+                    if (bean.getCommand() == Command.ADD) {
                         
defaultGroupSequence.add(ServiceInstallCommandGroup.class);
                     } else {
                         defaultGroupSequence.add(ServiceCommandGroup.class);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConfigConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConfigConverter.java
index 37d2574d..a3481239 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConfigConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConfigConverter.java
@@ -41,6 +41,11 @@ public interface ServiceConfigConverter {
 
     List<ServiceConfigDTO> fromPO2DTO(List<ServiceConfigPO> 
serviceConfigPOList);
 
+    @Mapping(target = "propertiesJson", source = "properties", qualifiedByName 
= "obj2Json")
+    ServiceConfigPO fromDTO2PO(ServiceConfigDTO serviceConfigDTO);
+
+    List<ServiceConfigPO> fromDTO2PO(List<ServiceConfigDTO> 
serviceConfigDTOList);
+
     @Mapping(target = "properties", source = "propertiesJson", qualifiedByName 
= "json2PropertyVOList")
     ServiceConfigVO fromPO2VO(ServiceConfigPO serviceConfigPO);
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentHostDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentHostDTO.java
index d2b4f8d9..3d6f27aa 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentHostDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentHostDTO.java
@@ -30,5 +30,5 @@ public class ComponentHostDTO implements Serializable {
     private String componentName;
 
     @NotEmpty
-    private List<String> hostnames;
+    private List<Long> hostIds;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ServiceCommandDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ServiceCommandDTO.java
index bce58fa9..c306a717 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ServiceCommandDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/command/ServiceCommandDTO.java
@@ -31,12 +31,6 @@ public class ServiceCommandDTO implements Serializable {
 
     private String serviceName;
 
-    private Boolean installed;
-
-    private String configDesc;
-
-    private Integer version;
-
     private List<ComponentHostDTO> componentHosts;
 
     private List<ServiceConfigDTO> configs;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ComponentHostReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ComponentHostReq.java
index 515e6249..1d3b9e86 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ComponentHostReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ComponentHostReq.java
@@ -32,6 +32,6 @@ public class ComponentHostReq {
     private String componentName;
 
     @NotEmpty
-    @Schema(description = "Hostnames for component", example = "[\"node1\"]")
-    private List<String> hostnames;
+    @Schema(description = "Host IDs for component", example = "[1]")
+    private List<Long> hostIds;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ServiceCommandReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ServiceCommandReq.java
index bbd01b6c..dd645ad5 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ServiceCommandReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/command/ServiceCommandReq.java
@@ -36,15 +36,6 @@ public class ServiceCommandReq {
     @NotNull @Schema(description = "Service name", example = "zookeeper")
     private String serviceName;
 
-    @Schema(description = "If service installed", example = "true")
-    private Boolean installed;
-
-    @Schema(description = "Config Description", example = "Initial config for 
zookeeper")
-    private String configDesc;
-
-    @Schema(description = "Config version", example = "1")
-    private Integer version;
-
     @NotEmpty(groups = 
{CommandGroupSequenceProvider.ServiceInstallCommandGroup.class})
     @Schema(description = "Components for service on each hosts")
     private List<@Valid ComponentHostReq> componentHosts;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/JobVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/JobVO.java
index d36ed3a0..38e04fbe 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/JobVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/JobVO.java
@@ -20,15 +20,11 @@ package org.apache.bigtop.manager.server.model.vo;
 
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class JobVO {
 
     private Long id;
 
-    private List<StageVO> stages;
-
     private String state;
 
     private String name;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
index 20821951..14df0c08 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
@@ -20,6 +20,8 @@ package org.apache.bigtop.manager.server.model.vo;
 
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class ServiceVO {
 
@@ -31,13 +33,19 @@ public class ServiceVO {
 
     private String desc;
 
-    private String user;
-
     private String version;
 
+    private String user;
+
     private String stack;
 
     private Boolean needRestart;
 
     private Integer status;
+
+    private List<ComponentVO> components;
+
+    private List<ServiceConfigVO> configs;
+
+    private List<String> requiredServices;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java
index 016c37bf..3070e92a 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java
@@ -75,6 +75,7 @@ public class CommandServiceImpl implements CommandService {
         // Create job
         JobContext jobContext = new JobContext();
         jobContext.setCommandDTO(commandDTO);
+        jobContext.setRetryFlag(false);
         JobFactory jobFactory = JobFactories.getJobFactory(commandIdentifier);
         Job job = jobFactory.createJob(jobContext);
 
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 0eac3bfc..30de0974 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
@@ -85,7 +85,7 @@ public class HostServiceImpl implements HostService {
 
     @Override
     public List<HostVO> batchSave(Long clusterId, List<String> hostnames) {
-        List<HostPO> hostnameIn = hostDao.findAllByHostnameIn(hostnames);
+        List<HostPO> hostnameIn = hostDao.findAllByHostnames(hostnames);
         List<HostPO> hostPOList = new ArrayList<>();
 
         Map<String, HostPO> hostInMap =
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
index d74ff7e4..d316df5a 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
@@ -139,6 +139,7 @@ public class JobServiceImpl implements JobService {
 
     private Job recreateJob(JobPO jobPO) {
         JobContext jobContext = JsonUtils.readFromString(jobPO.getContext(), 
JobContext.class);
+        jobContext.setRetryFlag(true);
         CommandIdentifier commandIdentifier = new CommandIdentifier(
                 jobContext.getCommandDTO().getCommandLevel(),
                 jobContext.getCommandDTO().getCommand());
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/ComponentStatusTimer.java
similarity index 86%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/ComponentStatusTimer.java
index 28299485..43f47da9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/ComponentStatusTimer.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.scheduler;
+package org.apache.bigtop.manager.server.timer;
 
 import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.po.HostPO;
@@ -28,28 +28,22 @@ import 
org.apache.bigtop.manager.grpc.generated.ComponentStatusServiceGrpc;
 import org.apache.bigtop.manager.server.enums.HealthyStatusEnum;
 import org.apache.bigtop.manager.server.grpc.GrpcClient;
 
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
 import lombok.extern.slf4j.Slf4j;
 
-import jakarta.annotation.Resource;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 @Slf4j
-@Component
-public class ComponentStatusScheduler {
+// @Component
+public class ComponentStatusTimer {
 
-    @Resource
+    //    @Resource
     private ComponentDao componentDao;
 
-    @Resource
+    //    @Resource
     private HostDao hostDao;
 
-    @Async
-    @Scheduled(fixedDelay = 30, timeUnit = TimeUnit.SECONDS)
+    //    @Async
+    //    @Scheduled(fixedDelay = 30, timeUnit = TimeUnit.SECONDS)
     public void execute() {
         List<ComponentPO> componentPOList = componentDao.findAll();
         for (ComponentPO componentPO : componentPOList) {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/HostInfoScheduler.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/HostInfoTimer.java
similarity index 85%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/HostInfoScheduler.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/HostInfoTimer.java
index 32dbccd0..0868a962 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/HostInfoScheduler.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/HostInfoTimer.java
@@ -16,14 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.scheduler;
+package org.apache.bigtop.manager.server.timer;
 
 import org.apache.bigtop.manager.dao.po.HostPO;
 import org.apache.bigtop.manager.dao.repository.HostDao;
 import org.apache.bigtop.manager.grpc.generated.HostInfoReply;
 import org.apache.bigtop.manager.grpc.generated.HostInfoRequest;
 import org.apache.bigtop.manager.grpc.generated.HostInfoServiceGrpc;
+import org.apache.bigtop.manager.server.enums.HealthyStatusEnum;
 import org.apache.bigtop.manager.server.grpc.GrpcClient;
+import org.apache.bigtop.manager.server.utils.ClusterUtils;
 
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -37,7 +39,7 @@ import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Component
-public class HostInfoScheduler {
+public class HostInfoTimer {
 
     @Resource
     private HostDao hostDao;
@@ -52,6 +54,10 @@ public class HostInfoScheduler {
     }
 
     private void getHostInfo(HostPO hostPO) {
+        if (ClusterUtils.isNoneCluster(hostPO.getClusterId())) {
+            return;
+        }
+
         String hostname = hostPO.getHostname();
         Integer grpcPort = hostPO.getGrpcPort();
         try {
@@ -68,7 +74,10 @@ public class HostInfoScheduler {
             hostPO.setTotalMemorySize(reply.getTotalMemorySize());
             hostPO.setFreeDisk(reply.getFreeDisk());
             hostPO.setTotalDisk(reply.getTotalDisk());
+            hostPO.setStatus(HealthyStatusEnum.HEALTHY.getCode());
         } catch (Exception e) {
+            hostPO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
+            hostPO.setErrInfo(e.toString());
             log.error("Error getting host info for {}", hostname, e);
         }
 
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 641121fd..3502b899 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
@@ -19,6 +19,7 @@
 package org.apache.bigtop.manager.server.utils;
 
 import org.apache.bigtop.manager.common.enums.Command;
+import org.apache.bigtop.manager.common.utils.CaseUtils;
 import org.apache.bigtop.manager.common.utils.JsonUtils;
 import org.apache.bigtop.manager.server.exception.ApiException;
 import org.apache.bigtop.manager.server.exception.ServerException;
@@ -208,6 +209,10 @@ public class StackUtils {
         return file;
     }
 
+    public static String getFullStackName(StackDTO stackDTO) {
+        return CaseUtils.toCamelCase(stackDTO.getStackName()) + "-" + 
stackDTO.getStackVersion();
+    }
+
     public static StackDTO getServiceStack(String serviceName) {
         for (Map.Entry<StackDTO, List<ServiceDTO>> entry : 
STACK_SERVICE_MAP.entrySet()) {
             for (ServiceDTO serviceDTO : entry.getValue()) {
@@ -254,4 +259,18 @@ public class StackUtils {
 
         throw new ServerException("Component not found: " + componentName);
     }
+
+    public static ServiceDTO getServiceDTOByComponentName(String 
componentName) {
+        for (Map.Entry<StackDTO, List<ServiceDTO>> entry : 
STACK_SERVICE_MAP.entrySet()) {
+            for (ServiceDTO serviceDTO : entry.getValue()) {
+                for (ComponentDTO componentDTO : serviceDTO.getComponents()) {
+                    if (componentDTO.getName().equals(componentName)) {
+                        return serviceDTO;
+                    }
+                }
+            }
+        }
+
+        throw new ServerException("Service not found by component name: " + 
componentName);
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json
index 09585eb1..6591b238 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json
@@ -1,6 +1,6 @@
 {
-  "KAFKA_BROKER-INSTALL": [
-    "ZOOKEEPER_SERVER-INSTALL"
+  "KAFKA_BROKER-ADD": [
+    "ZOOKEEPER_SERVER-ADD"
   ],
   "KAFKA_BROKER-START": [
     "ZOOKEEPER_SERVER-START"
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 41a11d5e..b79bb0a0 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
@@ -21,8 +21,6 @@ package org.apache.bigtop.manager.stack.bigtop.param;
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
 import org.apache.bigtop.manager.stack.core.param.BaseParams;
 
-import java.text.MessageFormat;
-
 public abstract class BigtopParams extends BaseParams {
 
     protected BigtopParams(CommandPayload commandPayload) {
@@ -30,17 +28,11 @@ public abstract class BigtopParams extends BaseParams {
     }
 
     public String stackBinDir() {
-        String stackName = this.commandPayload.getStackName();
-        String stackVersion = this.commandPayload.getStackVersion();
-        String root = this.commandPayload.getRootDir();
-        return MessageFormat.format("{0}/{1}/{2}/usr/bin", root, 
stackName.toLowerCase(), stackVersion);
+        return "";
     }
 
     public String stackLibDir() {
-        String stackName = this.commandPayload.getStackName();
-        String stackVersion = this.commandPayload.getStackVersion();
-        String root = this.commandPayload.getRootDir();
-        return MessageFormat.format("{0}/{1}/{2}/usr/lib", root, 
stackName.toLowerCase(), stackVersion);
+        return "";
     }
 
     /**
@@ -48,7 +40,8 @@ public abstract class BigtopParams extends BaseParams {
      */
     @Override
     public String serviceHome() {
+        String rootDir = this.commandPayload.getRootDir();
         String service = this.commandPayload.getServiceName();
-        return stackLibDir() + "/" + service.toLowerCase();
+        return rootDir + "/" + service.toLowerCase();
     }
 }
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 51207e9b..514ae5fb 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
@@ -58,7 +58,7 @@ public abstract class BaseParams implements Params {
         this.commandPayload = commandPayload;
 
         Command command = commandPayload.getCommand();
-        if (command == Command.INSTALL) {
+        if (command == Command.ADD) {
             return;
         }
         // Global Parameters Injection
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
index 94733d4b..f0554857 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
@@ -37,11 +37,11 @@ public abstract class AbstractScript implements Script {
     public static final String PROPERTY_KEY_SKIP_LEVELS = "skipLevels";
 
     @Override
-    public ShellResult install(Params params) {
-        return this.install(params, new Properties());
+    public ShellResult add(Params params) {
+        return this.add(params, new Properties());
     }
 
-    public ShellResult install(Params params, Properties properties) {
+    public ShellResult add(Params params, Properties properties) {
         RepoInfo repo = params.repo();
         List<PackageInfo> packages = params.packages();
         String stackHome = params.stackHome();
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/Script.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/Script.java
index aef31dcc..48cfae5d 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/Script.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/Script.java
@@ -33,7 +33,7 @@ public interface Script extends PrioritySPI {
      * @param params the parameters required for installation
      * @return a ShellResult object containing the result of the installation 
process
      */
-    ShellResult install(Params params);
+    ShellResult add(Params params);
 
     /**
      * Configure the component.
@@ -69,6 +69,8 @@ public interface Script extends PrioritySPI {
 
     /**
      * Check the healthy status of the component.
+     * A simple status check which will only check if the process is running
+     * use {@link #check(Params)} to check the real healthy status of the 
component with smoke tests.
      *
      * @param params the parameters required to check the status
      * @return a ShellResult(0 for healthy, -1 for unhealthy) object 
containing the result of the status check
@@ -76,8 +78,7 @@ public interface Script extends PrioritySPI {
     ShellResult status(Params params);
 
     /**
-     * Check component.
-     * Usually we will run smoke tests for component to see if it works as 
expected.
+     * Run smoke tests for component to see if it works as expected.
      *
      * @param params the parameters required to check the component
      * @return a ShellResult object indicating success
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusServerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusServerScript.java
index c9341607..78efa805 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusServerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusServerScript.java
@@ -34,11 +34,11 @@ import java.util.Properties;
 public class PrometheusServerScript extends AbstractServerScript {
 
     @Override
-    public ShellResult install(Params params) {
+    public ShellResult add(Params params) {
         Properties properties = new Properties();
         properties.setProperty(PROPERTY_KEY_SKIP_LEVELS, "1");
 
-        return super.install(params, properties);
+        return super.add(params, properties);
     }
 
     @Override


Reply via email to