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 c41d5ee1 BIGTOP-4247: Refactor APIs for Service (#106)
c41d5ee1 is described below

commit c41d5ee144fd42ab0e7f5ad226a68a5ba1fcee42
Author: Zhiguo Wu <[email protected]>
AuthorDate: Tue Nov 19 17:16:32 2024 +0800

    BIGTOP-4247: Refactor APIs for Service (#106)
---
 .../apache/bigtop/manager/dao/po/ClusterPO.java    |  3 +
 .../apache/bigtop/manager/dao/po/ServicePO.java    | 39 ++++-------
 .../apache/bigtop/manager/dao/query/HostQuery.java |  4 +-
 .../query/{HostQuery.java => ServiceQuery.java}    |  6 +-
 .../bigtop/manager/dao/repository/ServiceDao.java  |  6 +-
 .../main/resources/mapper/mysql/ClusterMapper.xml  |  3 +-
 .../resources/mapper/mysql/HostComponentMapper.xml |  2 +-
 .../src/main/resources/mapper/mysql/HostMapper.xml |  8 +--
 .../main/resources/mapper/mysql/ServiceMapper.xml  | 77 ++++++----------------
 .../resources/mapper/postgresql/ClusterMapper.xml  |  3 +-
 .../mapper/postgresql/HostComponentMapper.xml      |  2 +-
 .../resources/mapper/postgresql/HostMapper.xml     |  8 +--
 .../resources/mapper/postgresql/ServiceMapper.xml  | 77 ++++++----------------
 .../server/command/job/AbstractServiceJob.java     |  2 +-
 .../server/command/job/ServiceInstallJob.java      |  3 +-
 .../command/stage/AbstractComponentStage.java      |  6 +-
 .../server/command/task/CacheFileUpdateTask.java   |  4 +-
 .../validator/RequiredServicesValidator.java       |  3 +-
 .../manager/server/controller/HostController.java  |  2 +-
 .../server/controller/ServiceController.java       | 22 ++++++-
 .../server/model/converter/ServiceConverter.java   | 14 +---
 .../manager/server/model/dto/ServiceDTO.java       |  8 +--
 .../bigtop/manager/server/model/vo/ClusterVO.java  |  2 +
 .../bigtop/manager/server/model/vo/ServiceVO.java  | 24 ++-----
 .../manager/server/service/ServiceService.java     |  8 ++-
 .../server/service/impl/HostServiceImpl.java       |  6 --
 .../server/service/impl/ServiceServiceImpl.java    | 72 +++++---------------
 .../server/service/impl/StackServiceImpl.java      |  2 +-
 .../bigtop/manager/server/utils/StackUtils.java    |  8 +--
 .../src/main/resources/ddl/MySQL-DDL-CREATE.sql    | 19 +++---
 .../main/resources/ddl/PostgreSQL-DDL-CREATE.sql   | 21 +++---
 .../server/controller/ServiceControllerTest.java   | 10 +--
 32 files changed, 177 insertions(+), 297 deletions(-)

diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
index 96789e1e..b3d62f74 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ClusterPO.java
@@ -60,6 +60,9 @@ public class ClusterPO extends BasePO implements Serializable 
{
     @Transient
     private Long totalHost;
 
+    @Transient
+    private Long totalService;
+
     @Transient
     private Long totalProcessor;
 
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
index 4584d7f4..d7b22003 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
@@ -20,14 +20,11 @@ package org.apache.bigtop.manager.dao.po;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import lombok.ToString;
 
 import jakarta.persistence.Column;
 import jakarta.persistence.Id;
 import jakarta.persistence.Table;
-import jakarta.persistence.Transient;
 import java.io.Serializable;
-import java.util.List;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -38,38 +35,30 @@ public class ServicePO extends BasePO implements 
Serializable {
     @Column(name = "id")
     private Long id;
 
-    @Column(name = "service_name")
-    private String serviceName;
+    @Column(name = "name")
+    private String name;
 
     @Column(name = "display_name")
     private String displayName;
 
-    @Column(name = "service_desc")
-    private String serviceDesc;
+    @Column(name = "desc")
+    private String desc;
 
-    @Column(name = "service_version")
-    private String serviceVersion;
+    @Column(name = "user")
+    private String user;
 
-    @Column(name = "package_specifics")
-    private String packageSpecifics;
+    @Column(name = "version")
+    private String version;
 
-    @Column(name = "service_user")
-    private String serviceUser;
+    @Column(name = "stack")
+    private String stack;
 
-    @Column(name = "required_services")
-    private String requiredServices;
+    @Column(name = "need_restart")
+    private Boolean needRestart;
 
     @Column(name = "cluster_id")
     private Long clusterId;
 
-    @Transient
-    @Column(name = "cluster_name")
-    private String clusterName;
-
-    @Transient
-    @Column(name = "user_group")
-    private String userGroup;
-
-    @ToString.Exclude
-    private List<ComponentPO> components;
+    @Column(name = "status")
+    private Integer status;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/HostQuery.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/HostQuery.java
index 5e280836..397758ee 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/HostQuery.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/HostQuery.java
@@ -23,11 +23,11 @@ import lombok.Data;
 @Data
 public class HostQuery {
 
-    private String hostnameLike;
+    private String hostname;
 
     private Long clusterId;
 
-    private String ipv4Like;
+    private String ipv4;
 
     private Integer status;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/HostQuery.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ServiceQuery.java
similarity index 91%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/HostQuery.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ServiceQuery.java
index 5e280836..7b755b48 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/HostQuery.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ServiceQuery.java
@@ -21,13 +21,13 @@ package org.apache.bigtop.manager.dao.query;
 import lombok.Data;
 
 @Data
-public class HostQuery {
+public class ServiceQuery {
 
-    private String hostnameLike;
+    private String name;
 
     private Long clusterId;
 
-    private String ipv4Like;
+    private Boolean needRestart;
 
     private Integer status;
 }
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 57d29805..8901b882 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
@@ -20,17 +20,17 @@
 package org.apache.bigtop.manager.dao.repository;
 
 import org.apache.bigtop.manager.dao.po.ServicePO;
+import org.apache.bigtop.manager.dao.query.ServiceQuery;
 
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
-import java.util.Optional;
 
 public interface ServiceDao extends BaseDao<ServicePO> {
 
-    List<ServicePO> findAllByClusterId(@Param("clusterId") Long clusterId);
+    List<ServicePO> findByQuery(@Param("query") ServiceQuery query);
 
-    Optional<ServicePO> findByIdJoin(@Param("id") Long id);
+    List<ServicePO> findByClusterId(@Param("clusterId") Long clusterId);
 
     ServicePO findByClusterIdAndServiceName(
             @Param("clusterId") Long clusterId, @Param("serviceName") String 
serviceName);
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 b3dc0141..921380b2 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ClusterMapper.xml
@@ -36,10 +36,11 @@
             <property name="alias" value="c"/>
         </include>, u.nickname as create_user,
         count(h.id) as total_host, sum(h.available_processors) as 
total_processor,
-        sum(h.total_memory_size) as total_memory, sum(h.total_disk) as 
total_disk
+        sum(h.total_memory_size) as total_memory, sum(h.total_disk) as 
total_disk, count(s.id) as total_service
         from
         cluster c left join user u on c.create_by = u.id
         left join host h on c.id = h.cluster_id
+        left join service s on c.id = s.cluster_id
         where c.id = #{id}
         limit 1
     </select>
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml
index 9410a0f8..51d323b8 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostComponentMapper.xml
@@ -201,7 +201,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        
,ser.service_name,ser.service_user,clu.root_dir,c.component_name,c.command_script,hst.hostname,
 hst.grpc_port
+        ,ser.name as service_name,ser.user as 
service_user,clu.root_dir,c.component_name,c.command_script,hst.hostname, 
hst.grpc_port
         from
         host_component hc
         inner join host hst
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 97b95be0..12848a4d 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
@@ -114,14 +114,14 @@
         left join cluster c on h.cluster_id = c.id
         left join host_component hc on h.id = hc.host_id
         <where>
-            <if test="query.hostnameLike != null and query.hostnameLike != ''">
-                and h.hostname like concat('%', #{query.hostnameLike}, '%')
+            <if test="query.hostname != null and query.hostname != ''">
+                and h.hostname like concat('%', #{query.hostname}, '%')
             </if>
             <if test="query.clusterId != null">
                 and h.cluster_id = #{query.clusterId}
             </if>
-            <if test="query.ipv4Like != null and query.ipv4Like != ''">
-                and h.ipv4 like concat('%', #{query.ipv4Like}, '%')
+            <if test="query.ipv4 != null and query.ipv4 != ''">
+                and h.ipv4 like concat('%', #{query.ipv4}, '%')
             </if>
             <if test="query.status != null">
                 and h.status = #{query.status}
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 3f951e04..70cbe85d 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
@@ -24,75 +24,40 @@
 <mapper namespace="org.apache.bigtop.manager.dao.repository.ServiceDao">
 
     <sql id="baseColumns">
-        id, service_name, display_name, service_desc, service_version, 
package_specifics, service_user, required_services, cluster_id
+        id, name, display_name, `desc`, user, version, stack, need_restart, 
cluster_id, status
     </sql>
 
     <sql id="baseColumnsV2">
-        ${alias}.id, ${alias}.service_name, ${alias}.display_name, 
${alias}.service_desc, ${alias}.service_version, ${alias}.package_specifics, 
${alias}.service_user, ${alias}.required_services, ${alias}.cluster_id
+        ${alias}.id, ${alias}.name, ${alias}.display_name, ${alias}.`desc`, 
${alias}.user, ${alias}.version, ${alias}.stack, ${alias}.need_restart, 
${alias}.cluster_id, ${alias}.status
     </sql>
 
-    <resultMap id="serviceMap" 
type="org.apache.bigtop.manager.dao.po.ServicePO">
-        <id column="id" property="id"/>
-        <result column="service_name" property="serviceName"/>
-        <result column="display_name" property="displayName"/>
-        <result column="service_desc" property="serviceDesc"/>
-        <result column="service_version" property="serviceVersion"/>
-        <result column="package_specifics" property="packageSpecifics"/>
-        <result column="service_user" property="serviceUser"/>
-        <result column="required_services" property="requiredServices"/>
-        <result column="cluster_id" property="clusterId"/>
-        <result column="cluster_name" property="clusterName"/>
-        <result column="user_group" property="userGroup"/>
-        <collection property="components" 
ofType="org.apache.bigtop.manager.dao.po.ComponentPO">
-            <id column="cid" property="id"/>
-            <result column="component_name" property="componentName"/>
-            <result column="category" property="category"/>
-            <result column="quick_link" property="quickLink"/>
-            <result column="service_id" property="serviceId"/>
-            <result column="cluster_id" property="clusterId"/>
-        </collection>
-    </resultMap>
-
-    <select id="findAllByClusterId" parameterType="java.lang.Long" 
resultMap="serviceMap">
+    <select id="findByQuery" 
resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
-        <include refid="baseColumnsV2">
-            <property name="alias" value="s"/>
-        </include>
-        , clus.name as cluster_name, clus.user_group, c.component_name, 
c.category, c.quick_link, c.id as cid
+        <include refid="baseColumns"/>
         from
-        (select * from service
+        service s
         <where>
-            <if test="clusterId != 0">
-                cluster_id = #{clusterId}
+            <if test="query.name != null and query.name != ''">
+                and s.name like concat('%', #{query.name}, '%')
+            </if>
+            <if test="query.clusterId != null">
+                and s.cluster_id = #{query.clusterId}
+            </if>
+            <if test="query.needRestart != null">
+                and s.need_restart = #{query.needRestart}
+            </if>
+            <if test="query.status != null">
+                and s.status = #{query.status}
             </if>
         </where>
-        ) s
-        inner join
-        cluster clus
-        on s.cluster_id = clus.id
-        inner join
-        component c
-        on c.service_id = s.id
     </select>
 
-    <select id="findByIdJoin" parameterType="java.lang.Long"
-            resultType="org.apache.bigtop.manager.dao.po.ServicePO">
+    <select id="findByClusterId" parameterType="java.lang.Long" 
resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
-        <include refid="baseColumnsV2">
-            <property name="alias" value="s"/>
-        </include>
-        , clus.name as cluster_name, clus.user_group
-        from
-        (select * from service
-        <where>
-            <if test="id != 0">
-                id = #{id}
-            </if>
-        </where>
-        ) s
-        inner join
-        cluster clus
-        on s.cluster_id = clus.id
+        <include refid="baseColumns" />
+        from service
+        where
+        cluster_id = #{clusterId}
     </select>
 
     <select id="findByClusterIdAndServiceName"
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 99c515ed..f2334e0c 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ClusterMapper.xml
@@ -36,10 +36,11 @@
             <property name="alias" value="c"/>
         </include>, u.nickname as create_user,
         count(h.id) as total_host, sum(h.available_processors) as 
total_processor,
-        sum(h.total_memory_size) as total_memory, sum(h.total_disk) as 
total_disk
+        sum(h.total_memory_size) as total_memory, sum(h.total_disk) as 
total_disk, count(s.id) as total_service
         from
         cluster c left join user u on c.create_by = u.id
         left join host h on c.id = h.cluster_id
+        left join service s on c.id = s.cluster_id
         where c.id = #{id}
         limit 1
     </select>
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
index 705c4d35..5cdc9c59 100644
--- 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
+++ 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostComponentMapper.xml
@@ -201,7 +201,7 @@
         <include refid="baseColumnsV2">
             <property name="alias" value="hc"/>
         </include>
-        
,ser.service_name,ser.service_user,clu.root_dir,c.component_name,c.command_script,hst.hostname,
 hst.grpc_port
+        ,ser.name as service_name,ser."user" as 
service_user,clu.root_dir,c.component_name,c.command_script,hst.hostname, 
hst.grpc_port
         from
         host_component hc
         inner join host hst
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 d98dc593..d7c8c17d 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
@@ -107,14 +107,14 @@
         left join cluster c on h.cluster_id = c.id
         left join host_component hc on h.id = hc.host_id
         <where>
-            <if test="query.hostnameLike != null and query.hostnameLike != ''">
-                and h.hostname like concat('%', #{query.hostnameLike}, '%')
+            <if test="query.hostname != null and query.hostname != ''">
+                and h.hostname like concat('%', #{query.hostname}, '%')
             </if>
             <if test="query.clusterId != null">
                 and h.cluster_id = #{query.clusterId}
             </if>
-            <if test="query.ipv4Like != null and query.ipv4Like != ''">
-                and h.ipv4 like concat('%', #{query.ipv4Like}, '%')
+            <if test="query.ipv4 != null and query.ipv4 != ''">
+                and h.ipv4 like concat('%', #{query.ipv4}, '%')
             </if>
             <if test="query.status != null">
                 and h.status = #{query.status}
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 3f951e04..d540e82d 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
@@ -24,75 +24,40 @@
 <mapper namespace="org.apache.bigtop.manager.dao.repository.ServiceDao">
 
     <sql id="baseColumns">
-        id, service_name, display_name, service_desc, service_version, 
package_specifics, service_user, required_services, cluster_id
+        id, name, display_name, "desc", "user", version, stack, need_restart, 
cluster_id, status
     </sql>
 
     <sql id="baseColumnsV2">
-        ${alias}.id, ${alias}.service_name, ${alias}.display_name, 
${alias}.service_desc, ${alias}.service_version, ${alias}.package_specifics, 
${alias}.service_user, ${alias}.required_services, ${alias}.cluster_id
+        ${alias}.id, ${alias}.name, ${alias}.display_name, ${alias}."desc", 
${alias}."user", ${alias}.version, ${alias}.stack, ${alias}.need_restart, 
${alias}.cluster_id, ${alias}.status
     </sql>
 
-    <resultMap id="serviceMap" 
type="org.apache.bigtop.manager.dao.po.ServicePO">
-        <id column="id" property="id"/>
-        <result column="service_name" property="serviceName"/>
-        <result column="display_name" property="displayName"/>
-        <result column="service_desc" property="serviceDesc"/>
-        <result column="service_version" property="serviceVersion"/>
-        <result column="package_specifics" property="packageSpecifics"/>
-        <result column="service_user" property="serviceUser"/>
-        <result column="required_services" property="requiredServices"/>
-        <result column="cluster_id" property="clusterId"/>
-        <result column="cluster_name" property="clusterName"/>
-        <result column="user_group" property="userGroup"/>
-        <collection property="components" 
ofType="org.apache.bigtop.manager.dao.po.ComponentPO">
-            <id column="cid" property="id"/>
-            <result column="component_name" property="componentName"/>
-            <result column="category" property="category"/>
-            <result column="quick_link" property="quickLink"/>
-            <result column="service_id" property="serviceId"/>
-            <result column="cluster_id" property="clusterId"/>
-        </collection>
-    </resultMap>
-
-    <select id="findAllByClusterId" parameterType="java.lang.Long" 
resultMap="serviceMap">
+    <select id="findByQuery" 
resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
-        <include refid="baseColumnsV2">
-            <property name="alias" value="s"/>
-        </include>
-        , clus.name as cluster_name, clus.user_group, c.component_name, 
c.category, c.quick_link, c.id as cid
+        <include refid="baseColumns"/>
         from
-        (select * from service
+        service s
         <where>
-            <if test="clusterId != 0">
-                cluster_id = #{clusterId}
+            <if test="query.name != null and query.name != ''">
+                and s.name like concat('%', #{query.name}, '%')
+            </if>
+            <if test="query.clusterId != null">
+                and s.cluster_id = #{query.clusterId}
+            </if>
+            <if test="query.needRestart != null">
+                and s.need_restart = #{query.needRestart}
+            </if>
+            <if test="query.status != null">
+                and s.status = #{query.status}
             </if>
         </where>
-        ) s
-        inner join
-        cluster clus
-        on s.cluster_id = clus.id
-        inner join
-        component c
-        on c.service_id = s.id
     </select>
 
-    <select id="findByIdJoin" parameterType="java.lang.Long"
-            resultType="org.apache.bigtop.manager.dao.po.ServicePO">
+    <select id="findByClusterId" parameterType="java.lang.Long" 
resultType="org.apache.bigtop.manager.dao.po.ServicePO">
         select
-        <include refid="baseColumnsV2">
-            <property name="alias" value="s"/>
-        </include>
-        , clus.name as cluster_name, clus.user_group
-        from
-        (select * from service
-        <where>
-            <if test="id != 0">
-                id = #{id}
-            </if>
-        </where>
-        ) s
-        inner join
-        cluster clus
-        on s.cluster_id = clus.id
+        <include refid="baseColumns" />
+        from service
+        where
+        cluster_id = #{clusterId}
     </select>
 
     <select id="findByClusterIdAndServiceName"
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 c2c69d0b..fbd6dc17 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
@@ -122,7 +122,7 @@ public abstract class AbstractServiceJob extends 
AbstractJob {
         for (ServiceDTO serviceDTO : StackUtils.getServiceDTOList(new 
StackDTO(stackName, stackVersion))) {
             for (ComponentDTO componentDTO : serviceDTO.getComponents()) {
                 if (componentDTO.getComponentName().equals(componentName)) {
-                    return serviceDTO.getServiceName();
+                    return serviceDTO.getName();
                 }
             }
         }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
index 1cd1119d..0fb014b9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java
@@ -139,7 +139,8 @@ public class ServiceInstallJob extends AbstractServiceJob {
         // 1. Persist service and components
         if (servicePO == null) {
             ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName);
-            servicePO = ServiceConverter.INSTANCE.fromDTO2PO(serviceDTO, 
clusterPO);
+            servicePO = ServiceConverter.INSTANCE.fromDTO2PO(serviceDTO);
+            servicePO.setClusterId(clusterId);
             serviceDao.save(servicePO);
         }
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
index 3398d76f..4c509674 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
@@ -53,7 +53,7 @@ public abstract class AbstractComponentStage extends 
AbstractStage {
 
     @Override
     protected String getServiceName() {
-        return stageContext.getServiceDTO().getServiceName();
+        return stageContext.getServiceDTO().getName();
     }
 
     @Override
@@ -69,10 +69,10 @@ public abstract class AbstractComponentStage extends 
AbstractStage {
         taskContext.setHostDTO(hostDTO);
         taskContext.setClusterId(clusterPO.getId());
         taskContext.setClusterName(clusterPO.getName());
-        taskContext.setServiceName(serviceDTO.getServiceName());
+        taskContext.setServiceName(serviceDTO.getName());
         taskContext.setComponentName(componentDTO.getComponentName());
         taskContext.setComponentDisplayName(componentDTO.getDisplayName());
-        taskContext.setServiceUser(serviceDTO.getServiceUser());
+        taskContext.setServiceUser(serviceDTO.getUser());
         taskContext.setRootDir(clusterPO.getRootDir());
 
         Map<String, Object> properties = new HashMap<>();
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 90f1a82c..181e88e2 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
@@ -112,7 +112,7 @@ public class CacheFileUpdateTask extends AbstractTask {
 
         Long clusterId = clusterPO.getId();
 
-        List<ServicePO> servicePOList = 
serviceDao.findAllByClusterId(clusterId);
+        List<ServicePO> servicePOList = serviceDao.findByClusterId(clusterId);
         List<ServiceConfigPO> serviceConfigPOList = 
serviceConfigDao.findByClusterId(clusterPO.getId());
         List<HostComponentPO> hostComponentPOList = 
hostComponentDao.findAllByClusterId(clusterId);
         List<RepoPO> repoPOList = 
repoDao.findAllByClusterId(clusterPO.getId());
@@ -158,7 +158,7 @@ public class CacheFileUpdateTask extends AbstractTask {
         });
 
         userMap = new HashMap<>();
-        servicePOList.forEach(x -> userMap.put(x.getServiceName(), 
x.getServiceUser()));
+        servicePOList.forEach(x -> userMap.put(x.getName(), x.getUser()));
 
         settingsMap = new HashMap<>();
         settings.forEach(x -> settingsMap.put(x.getTypeName(), 
x.getConfigData()));
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 c2073fd0..17e7723c 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
@@ -71,8 +71,7 @@ public class RequiredServicesValidator implements 
CommandValidator {
             }
 
             List<ServicePO> servicePOList = 
serviceDao.findByClusterIdAndServiceNameIn(clusterId, requiredServices);
-            List<String> list =
-                    
servicePOList.stream().map(ServicePO::getServiceName).toList();
+            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/controller/HostController.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/HostController.java
index e49bf435..5f6890eb 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/HostController.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/HostController.java
@@ -55,7 +55,6 @@ public class HostController {
     @Resource
     private HostService hostService;
 
-    @Operation(summary = "list", description = "List hosts")
     @Parameters({
         @Parameter(in = ParameterIn.QUERY, name = "pageNum", schema = 
@Schema(type = "integer", defaultValue = "1")),
         @Parameter(in = ParameterIn.QUERY, name = "pageSize", schema = 
@Schema(type = "integer", defaultValue = "10")),
@@ -66,6 +65,7 @@ public class HostController {
                 description = "asc/desc",
                 schema = @Schema(type = "string", defaultValue = "asc"))
     })
+    @Operation(summary = "list", description = "List hosts")
     @GetMapping
     public ResponseEntity<PageVO<HostVO>> list(HostQuery hostQuery) {
         return ResponseEntity.success(hostService.list(hostQuery));
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ServiceController.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ServiceController.java
index c8e1cfcd..a23c8374 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ServiceController.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ServiceController.java
@@ -18,8 +18,10 @@
  */
 package org.apache.bigtop.manager.server.controller;
 
+import org.apache.bigtop.manager.dao.query.ServiceQuery;
 import org.apache.bigtop.manager.server.model.req.ServiceConfigReq;
 import org.apache.bigtop.manager.server.model.req.ServiceConfigSnapshotReq;
+import org.apache.bigtop.manager.server.model.vo.PageVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceConfigSnapshotVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceConfigVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceVO;
@@ -35,6 +37,10 @@ import 
org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 
@@ -50,10 +56,20 @@ public class ServiceController {
     @Resource
     private ServiceService serviceService;
 
-    @Operation(summary = "list", description = "List services")
+    @Parameters({
+        @Parameter(in = ParameterIn.QUERY, name = "pageNum", schema = 
@Schema(type = "integer", defaultValue = "1")),
+        @Parameter(in = ParameterIn.QUERY, name = "pageSize", schema = 
@Schema(type = "integer", defaultValue = "10")),
+        @Parameter(in = ParameterIn.QUERY, name = "orderBy", schema = 
@Schema(type = "string", defaultValue = "id")),
+        @Parameter(
+                in = ParameterIn.QUERY,
+                name = "sort",
+                description = "asc/desc",
+                schema = @Schema(type = "string", defaultValue = "asc"))
+    })
+    @Operation(summary = "list", description = "List hosts")
     @GetMapping
-    public ResponseEntity<List<ServiceVO>> list(@PathVariable Long clusterId) {
-        return ResponseEntity.success(serviceService.list(clusterId));
+    public ResponseEntity<PageVO<ServiceVO>> list(@PathVariable Long 
clusterId, @RequestBody ServiceQuery query) {
+        return ResponseEntity.success(serviceService.list(query));
     }
 
     @Operation(summary = "get", description = "Get a service")
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
index 2abd3c52..f63cfb94 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
@@ -18,16 +18,13 @@
  */
 package org.apache.bigtop.manager.server.model.converter;
 
-import org.apache.bigtop.manager.dao.po.ClusterPO;
 import org.apache.bigtop.manager.dao.po.ServicePO;
 import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
 import org.apache.bigtop.manager.server.model.dto.ServiceDTO;
 import org.apache.bigtop.manager.server.model.vo.ServiceVO;
 import org.apache.bigtop.manager.server.stack.model.ServiceModel;
 
-import org.mapstruct.Context;
 import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;
 
 import java.util.List;
@@ -39,23 +36,14 @@ public interface ServiceConverter {
 
     ServiceConverter INSTANCE = Mappers.getMapper(ServiceConverter.class);
 
-    @Mapping(target = "packageSpecifics", source = "packageSpecifics", 
qualifiedByName = "obj2Json")
-    @Mapping(target = "requiredServices", source = "requiredServices", 
qualifiedByName = "obj2Json")
-    @Mapping(target = "clusterId", expression = "java(clusterPO.getId())")
-    @Mapping(target = "components", ignore = true)
-    ServicePO fromDTO2PO(ServiceDTO serviceDTO, @Context ClusterPO clusterPO);
+    ServicePO fromDTO2PO(ServiceDTO serviceDTO);
 
     ServiceVO fromDTO2VO(ServiceDTO serviceDTO);
 
     List<ServiceVO> fromDTO2VO(List<ServiceDTO> serviceDTOList);
 
-    @Mapping(target = "serviceName", source = "name")
-    @Mapping(target = "serviceDesc", source = "desc")
-    @Mapping(target = "serviceVersion", source = "version")
-    @Mapping(target = "serviceUser", source = "user")
     ServiceDTO fromModel2DTO(ServiceModel serviceModel);
 
-    @Mapping(target = "requiredServices", source = "requiredServices", 
qualifiedByName = "json2List")
     ServiceVO fromPO2VO(ServicePO servicePO);
 
     List<ServiceVO> fromPO2VO(List<ServicePO> servicePOList);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
index 6c800f70..9b42cb73 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
@@ -25,15 +25,15 @@ import java.util.List;
 @Data
 public class ServiceDTO {
 
-    private String serviceName;
+    private String name;
 
     private String displayName;
 
-    private String serviceDesc;
+    private String desc;
 
-    private String serviceVersion;
+    private String version;
 
-    private String serviceUser;
+    private String user;
 
     private List<PackageSpecificDTO> packageSpecifics;
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
index c710fb6a..492e21c0 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ClusterVO.java
@@ -41,6 +41,8 @@ public class ClusterVO {
 
     private Long totalHost;
 
+    private Long totalService;
+
     private Long totalProcessor;
 
     private Long totalMemory;
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 99136b9e..20821951 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,34 +20,24 @@ package org.apache.bigtop.manager.server.model.vo;
 
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class ServiceVO {
 
     private Long id;
 
-    private String serviceName;
+    private String name;
 
     private String displayName;
 
-    private String serviceDesc;
-
-    private String serviceVersion;
-
-    private String clusterName;
-
-    private String serviceUser;
-
-    private List<ComponentVO> components;
+    private String desc;
 
-    private List<ServiceConfigVO> configs;
+    private String user;
 
-    private List<String> requiredServices;
+    private String version;
 
-    private Boolean isClient;
+    private String stack;
 
-    private Boolean isHealthy;
+    private Boolean needRestart;
 
-    private List<QuickLinkVO> quickLinks;
+    private Integer status;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ServiceService.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ServiceService.java
index b88f933e..20f35ebf 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ServiceService.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ServiceService.java
@@ -18,8 +18,10 @@
  */
 package org.apache.bigtop.manager.server.service;
 
+import org.apache.bigtop.manager.dao.query.ServiceQuery;
 import org.apache.bigtop.manager.server.model.req.ServiceConfigReq;
 import org.apache.bigtop.manager.server.model.req.ServiceConfigSnapshotReq;
+import org.apache.bigtop.manager.server.model.vo.PageVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceConfigSnapshotVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceConfigVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceVO;
@@ -29,11 +31,11 @@ import java.util.List;
 public interface ServiceService {
 
     /**
-     * Get all stacks.
+     * Get services by query.
      *
-     * @return Stacks
+     * @return services
      */
-    List<ServiceVO> list(Long clusterId);
+    PageVO<ServiceVO> list(ServiceQuery query);
 
     /**
      * Get a service.
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 0e1196cd..e3b49537 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
@@ -36,8 +36,6 @@ import org.apache.bigtop.manager.server.service.HostService;
 import org.apache.bigtop.manager.server.utils.PageUtils;
 import org.apache.bigtop.manager.server.utils.RemoteSSHUtils;
 
-import org.apache.commons.collections4.CollectionUtils;
-
 import org.springframework.stereotype.Service;
 
 import com.github.pagehelper.Page;
@@ -67,10 +65,6 @@ public class HostServiceImpl implements HostService {
         try (Page<?> ignored =
                 PageHelper.startPage(pageQuery.getPageNum(), 
pageQuery.getPageSize(), pageQuery.getOrderBy())) {
             List<HostPO> hostPOList = hostDao.findByQuery(hostQuery);
-            if (CollectionUtils.isEmpty(hostPOList)) {
-                throw new ApiException(ApiExceptionEnum.HOST_NOT_FOUND);
-            }
-
             PageInfo<HostPO> pageInfo = new PageInfo<>(hostPOList);
             return PageVO.of(pageInfo);
         } finally {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
index 47d898c3..c4084eae 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
@@ -18,39 +18,39 @@
  */
 package org.apache.bigtop.manager.server.service.impl;
 
-import org.apache.bigtop.manager.common.constants.ComponentCategories;
-import org.apache.bigtop.manager.common.enums.MaintainState;
 import org.apache.bigtop.manager.common.utils.JsonUtils;
-import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.po.HostComponentPO;
 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.repository.HostComponentDao;
+import org.apache.bigtop.manager.dao.query.ServiceQuery;
 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.enums.ApiExceptionEnum;
-import org.apache.bigtop.manager.server.exception.ApiException;
 import org.apache.bigtop.manager.server.model.converter.ServiceConfigConverter;
 import 
org.apache.bigtop.manager.server.model.converter.ServiceConfigSnapshotConverter;
 import org.apache.bigtop.manager.server.model.converter.ServiceConverter;
 import org.apache.bigtop.manager.server.model.dto.PropertyDTO;
 import org.apache.bigtop.manager.server.model.dto.QuickLinkDTO;
 import org.apache.bigtop.manager.server.model.dto.ServiceConfigDTO;
+import org.apache.bigtop.manager.server.model.query.PageQuery;
 import org.apache.bigtop.manager.server.model.req.ServiceConfigReq;
 import org.apache.bigtop.manager.server.model.req.ServiceConfigSnapshotReq;
+import org.apache.bigtop.manager.server.model.vo.PageVO;
 import org.apache.bigtop.manager.server.model.vo.QuickLinkVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceConfigSnapshotVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceConfigVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceVO;
 import org.apache.bigtop.manager.server.service.ServiceService;
+import org.apache.bigtop.manager.server.utils.PageUtils;
 
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
 
 import org.springframework.stereotype.Service;
 
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 
 import jakarta.annotation.Resource;
@@ -58,7 +58,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -67,9 +66,6 @@ public class ServiceServiceImpl implements ServiceService {
     @Resource
     private ServiceDao serviceDao;
 
-    @Resource
-    private HostComponentDao hostComponentDao;
-
     @Resource
     private ServiceConfigDao serviceConfigDao;
 
@@ -77,55 +73,21 @@ public class ServiceServiceImpl implements ServiceService {
     private ServiceConfigSnapshotDao serviceConfigSnapshotDao;
 
     @Override
-    public List<ServiceVO> list(Long clusterId) {
-        List<ServiceVO> res = new ArrayList<>();
-
-        List<ServicePO> servicePOList = 
serviceDao.findAllByClusterId(clusterId);
-        List<HostComponentPO> allByClusterId = 
hostComponentDao.findAllByClusterId(clusterId);
-        Map<Long, List<HostComponentPO>> serviceIdToHostComponent =
-                
allByClusterId.stream().collect(Collectors.groupingBy(HostComponentPO::getServiceId));
-        Map<Long, List<HostComponentPO>> componentIdToHostComponent =
-                
allByClusterId.stream().collect(Collectors.groupingBy(HostComponentPO::getComponentId));
-
-        for (ServicePO servicePO : servicePOList) {
-            Long serviceId = servicePO.getId();
-            ServiceVO serviceVO = 
ServiceConverter.INSTANCE.fromPO2VO(servicePO);
-            List<ComponentPO> components = servicePO.getComponents();
-            serviceVO.setQuickLinks(new ArrayList<>());
-
-            for (ComponentPO componentPO : components) {
-                Long componentId = componentPO.getId();
-                List<HostComponentPO> hostComponentPOList = 
componentIdToHostComponent.get(componentId);
-
-                String quickLink = componentPO.getQuickLink();
-                if (StringUtils.isNotBlank(quickLink)) {
-                    List<QuickLinkVO> quickLinkVOList =
-                            resolveQuickLink(hostComponentPOList, quickLink, 
clusterId, serviceId);
-                    serviceVO.getQuickLinks().addAll(quickLinkVOList);
-                }
-            }
-            boolean isClient = components.stream()
-                    .allMatch(componentPO -> 
componentPO.getCategory().equalsIgnoreCase(ComponentCategories.CLIENT));
-            boolean isHealthy = 
serviceIdToHostComponent.get(serviceId).stream().allMatch(hostComponentPO -> {
-                MaintainState expectedState = 
hostComponentPO.getCategory().equalsIgnoreCase(ComponentCategories.CLIENT)
-                        ? MaintainState.INSTALLED
-                        : MaintainState.STARTED;
-                return 
hostComponentPO.getState().equals(expectedState.getName());
-            });
-
-            serviceVO.setIsClient(isClient);
-            serviceVO.setIsHealthy(isHealthy);
-            res.add(serviceVO);
+    public PageVO<ServiceVO> list(ServiceQuery query) {
+        PageQuery pageQuery = PageUtils.getPageQuery();
+        try (Page<?> ignored =
+                PageHelper.startPage(pageQuery.getPageNum(), 
pageQuery.getPageSize(), pageQuery.getOrderBy())) {
+            List<ServicePO> servicePOList = serviceDao.findByQuery(query);
+            PageInfo<ServicePO> pageInfo = new PageInfo<>(servicePOList);
+            return PageVO.of(pageInfo);
+        } finally {
+            PageHelper.clearPage();
         }
-
-        return res;
     }
 
     @Override
     public ServiceVO get(Long id) {
-        ServicePO servicePO =
-                serviceDao.findByIdJoin(id).orElseThrow(() -> new 
ApiException(ApiExceptionEnum.SERVICE_NOT_FOUND));
-        return ServiceConverter.INSTANCE.fromPO2VO(servicePO);
+        return ServiceConverter.INSTANCE.fromPO2VO(serviceDao.findById(id));
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/StackServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/StackServiceImpl.java
index 9a5d26f7..3d777a99 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/StackServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/StackServiceImpl.java
@@ -46,7 +46,7 @@ public class StackServiceImpl implements StackService {
             StackDTO stackDTO = entry.getKey();
             List<ServiceDTO> serviceDTOList = entry.getValue();
             for (ServiceDTO serviceDTO : serviceDTOList) {
-                
serviceDTO.setConfigs(StackUtils.SERVICE_CONFIG_MAP.get(serviceDTO.getServiceName()));
+                
serviceDTO.setConfigs(StackUtils.SERVICE_CONFIG_MAP.get(serviceDTO.getName()));
             }
 
             StackVO stackVO = StackConverter.INSTANCE.fromDTO2VO(stackDTO);
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 0843463c..0f6f8f8f 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
@@ -112,7 +112,7 @@ public class StackUtils {
                 ServiceDTO serviceDTO = parseServiceMetaInfo(file);
                 services.add(serviceDTO);
 
-                parseServiceConfigurations(file, serviceDTO.getServiceName());
+                parseServiceConfigurations(file, serviceDTO.getName());
 
                 parseDag(file);
             }
@@ -126,7 +126,7 @@ public class StackUtils {
                 JaxbUtils.readFromPath(file.getAbsolutePath() + "/" + 
META_FILE, ServiceMetainfoXml.class);
         ServiceModel serviceModel = serviceMetainfoXml.getService();
         ServiceDTO serviceDTO = 
ServiceConverter.INSTANCE.fromModel2DTO(serviceModel);
-        
serviceDTO.setServiceDesc(StringUtils.strip(serviceDTO.getServiceDesc()));
+        serviceDTO.setDesc(StringUtils.strip(serviceDTO.getDesc()));
         return serviceDTO;
     }
 
@@ -211,7 +211,7 @@ public class StackUtils {
     public static StackDTO getServiceStack(String serviceName) {
         for (Map.Entry<StackDTO, List<ServiceDTO>> entry : 
STACK_SERVICE_MAP.entrySet()) {
             for (ServiceDTO serviceDTO : entry.getValue()) {
-                if (serviceDTO.getServiceName().equals(serviceName)) {
+                if (serviceDTO.getName().equals(serviceName)) {
                     return entry.getKey();
                 }
             }
@@ -232,7 +232,7 @@ public class StackUtils {
     public static ServiceDTO getServiceDTO(String serviceName) {
         for (Map.Entry<StackDTO, List<ServiceDTO>> entry : 
STACK_SERVICE_MAP.entrySet()) {
             for (ServiceDTO serviceDTO : entry.getValue()) {
-                if (serviceDTO.getServiceName().equals(serviceName)) {
+                if (serviceDTO.getName().equals(serviceName)) {
                     return serviceDTO;
                 }
             }
diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
index 6c236757..d89400ab 100644
--- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
@@ -108,7 +108,7 @@ CREATE TABLE `host`
     `total_disk`           BIGINT,
     `total_memory_size`    BIGINT,
     `desc`                 VARCHAR(255) DEFAULT NULL,
-    `status`               INTEGER  DEFAULT NULL COMMENT '1-healthy, 
2-unhealthy, 3-unknown',
+    `status`               INTEGER DEFAULT NULL COMMENT '1-healthy, 
2-unhealthy, 3-unknown',
     `err_info`             VARCHAR(255) DEFAULT NULL,
     `create_time`          DATETIME     DEFAULT CURRENT_TIMESTAMP,
     `update_time`          DATETIME     DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
@@ -136,21 +136,22 @@ CREATE TABLE `repo`
 CREATE TABLE `service`
 (
     `id`                BIGINT NOT NULL AUTO_INCREMENT,
-    `display_name`      VARCHAR(255),
-    `package_specifics` VARCHAR(1024),
-    `required_services` VARCHAR(255),
-    `service_desc`      VARCHAR(1024),
-    `service_name`      VARCHAR(255),
-    `service_user`      VARCHAR(255),
-    `service_version`   VARCHAR(255),
+    `name`              VARCHAR(255) DEFAULT NULL,
+    `display_name`      VARCHAR(255) DEFAULT NULL,
+    `desc`              VARCHAR(1024) DEFAULT NULL,
+    `user`              VARCHAR(255) DEFAULT NULL,
+    `version`           VARCHAR(255) DEFAULT NULL,
+    `stack`             VARCHAR(255) DEFAULT NULL,
+    `need_restart`      BOOLEAN DEFAULT FALSE,
     `cluster_id`        BIGINT,
+    `status`            INTEGER DEFAULT NULL COMMENT '1-healthy, 2-unhealthy, 
3-unknown',
     `create_time`       DATETIME    DEFAULT CURRENT_TIMESTAMP,
     `update_time`       DATETIME    DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
     `create_by`         BIGINT,
     `update_by`         BIGINT,
     PRIMARY KEY (id),
     KEY                 idx_service_cluster_id (cluster_id),
-    UNIQUE KEY `uk_service_name` (`service_name`, `cluster_id`)
+    UNIQUE KEY `uk_service_name` (`name`, `cluster_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
 CREATE TABLE `service_config`
diff --git 
a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
index f7590fda..e59ca7c4 100644
--- a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
@@ -73,8 +73,6 @@ COMMENT ON COLUMN cluster."desc" IS 'Cluster Description';
 COMMENT ON COLUMN cluster.type IS '1-Physical Machine, 2-Kubernetes';
 COMMENT ON COLUMN cluster.status IS '1-healthy, 2-unhealthy, 3-unknown';
 
-DROP INDEX IF EXISTS idx_cluster_stack_id;
-
 CREATE TABLE host
 (
     id                   BIGINT CHECK (id > 0)         NOT NULL GENERATED 
ALWAYS AS IDENTITY,
@@ -133,22 +131,25 @@ COMMENT ON COLUMN repo.type IS '1-services, 2-tools';
 CREATE TABLE service
 (
     id                BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
-    display_name      VARCHAR(255),
-    package_specifics VARCHAR(1024),
-    required_services VARCHAR(255),
-    service_desc      VARCHAR(1024),
-    service_name      VARCHAR(255),
-    service_user      VARCHAR(255),
-    service_version   VARCHAR(255),
+    name              VARCHAR(255) DEFAULT NULL,
+    display_name      VARCHAR(255) DEFAULT NULL,
+    "desc"            VARCHAR(1024) DEFAULT NULL,
+    "user"            VARCHAR(255) DEFAULT NULL,
+    version           VARCHAR(255) DEFAULT NULL,
+    stack             VARCHAR(255) DEFAULT NULL,
+    need_restart      BOOLEAN DEFAULT FALSE,
     cluster_id        BIGINT,
+    status            INTEGER DEFAULT NULL,
     create_time       TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time       TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     create_by         BIGINT,
     update_by         BIGINT,
     PRIMARY KEY (id),
-    CONSTRAINT uk_service_name UNIQUE (service_name, cluster_id)
+    CONSTRAINT uk_service_name UNIQUE (name, cluster_id)
 );
 
+COMMENT ON COLUMN service.status IS '1-healthy, 2-unhealthy, 3-unknown';
+
 CREATE INDEX idx_service_cluster_id ON service (cluster_id);
 
 CREATE TABLE service_config
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ServiceControllerTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ServiceControllerTest.java
index 87ab340d..80c5b1bd 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ServiceControllerTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ServiceControllerTest.java
@@ -18,6 +18,8 @@
  */
 package org.apache.bigtop.manager.server.controller;
 
+import org.apache.bigtop.manager.dao.query.ServiceQuery;
+import org.apache.bigtop.manager.server.model.vo.PageVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceVO;
 import org.apache.bigtop.manager.server.service.ServiceService;
 import org.apache.bigtop.manager.server.utils.MessageSourceUtils;
@@ -33,9 +35,6 @@ import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
 
-import java.util.Arrays;
-import java.util.List;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -66,10 +65,11 @@ class ServiceControllerTest {
 
     @Test
     void listReturnsAllServices() {
-        List<ServiceVO> services = Arrays.asList(new ServiceVO(), new 
ServiceVO());
+        ServiceQuery query = new ServiceQuery();
+        PageVO<ServiceVO> services = new PageVO<>();
         when(serviceService.list(any())).thenReturn(services);
 
-        ResponseEntity<List<ServiceVO>> response = serviceController.list(1L);
+        ResponseEntity<PageVO<ServiceVO>> response = 
serviceController.list(1L, query);
 
         assertTrue(response.isSuccess());
         assertEquals(services, response.getData());

Reply via email to