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 3632173b BIGTOP-4391: Adjust APIs related to service creation for UI 
needs (#191)
3632173b is described below

commit 3632173bf7ae52b63b59d1b881c66a125825e3bb
Author: Zhiguo Wu <[email protected]>
AuthorDate: Fri Mar 21 14:07:15 2025 +0800

    BIGTOP-4391: Adjust APIs related to service creation for UI needs (#191)
---
 README.md                                          |  16 ---
 README.zh.md                                       |  16 ---
 .../src/main/resources/mapper/mysql/HostMapper.xml |   2 +-
 .../resources/mapper/postgresql/HostMapper.xml     |   2 +-
 bigtop-manager-dist/pom.xml                        |  12 +-
 .../{assembly-agent-bin.xml => assembly-agent.xml} |   4 +-
 ...assembly-server-bin.xml => assembly-server.xml} |   4 +-
 .../src/main/assembly/assembly-src.xml             |   2 +-
 .../manager/grpc/payload/JobCachePayload.java      |   2 +
 .../server/command/helper/JobCacheHelper.java      | 121 +++++++++++++--------
 .../manager/server/command/job/AbstractJob.java    |   2 +-
 .../server/command/job/service/ServiceAddJob.java  |  14 +++
 .../command/stage/AbstractComponentStage.java      |   8 +-
 .../manager/server/command/stage/StageContext.java |   2 +-
 .../manager/server/enums/ApiExceptionEnum.java     |   7 +-
 .../bigtop/manager/server/enums/LocaleKeys.java    |   1 +
 .../bigtop/manager/server/grpc/GrpcClient.java     |  12 +-
 .../bigtop/manager/server/model/dto/HostDTO.java   |   4 +
 .../model/dto/command/ServiceCommandDTO.java       |   2 +
 .../manager/server/model/req/ComponentHostReq.java |   2 -
 .../model/req/command/ServiceCommandReq.java       |   3 +
 .../manager/server/proxy/PrometheusProxy.java      |  35 ++----
 .../server/service/impl/MetricsServiceImpl.java    |  50 ++++++++-
 .../server/service/impl/ServiceServiceImpl.java    |  13 ++-
 .../manager/server/utils/RemoteSSHUtils.java       |   4 +-
 .../src/main/resources/application.yml             |   4 -
 .../main/resources/ddl/PostgreSQL-DDL-CREATE.sql   |   4 +-
 .../main/resources/i18n/messages_en_US.properties  |   1 +
 .../main/resources/i18n/messages_zh_CN.properties  |   1 +
 29 files changed, 208 insertions(+), 142 deletions(-)

diff --git a/README.md b/README.md
index 299a695d..7410f7ad 100644
--- a/README.md
+++ b/README.md
@@ -51,19 +51,3 @@ mvn clean package -DskipTests
 
 ### API Testing
 - request `http://localhost:8080/swagger-ui/index.html` to check swagger API 
Doc
-
-### How to test bm-monitoring
-1. Install [Prometheus LTS 
Version](https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz)
-2. Configure prometheus.yml, add below code into `scrape_configs`
-```
-- job_name: "bm-agent-host"
-  metrics_path: "/actuator/prometheus"
-  static_configs:
-    - targets: ["agent1 ip/hostname:8081", "agent2 ip/hostname:8081", ...]
-```
-3. Configure Prometheus Query Info at 
`bigtop-manager-server/src/main/resources/application.yml`
-```
-monitoring:
-  prometheus-host: "http://localhost:9090";
-  agent-host-job-name: "bm-agent-host"
-```
\ No newline at end of file
diff --git a/README.zh.md b/README.zh.md
index b555a6e7..64836452 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -54,19 +54,3 @@ mvn clean package -DskipTests
 
 ### API 测试
 - 访问 `http://localhost:8080/swagger-ui/index.html` 查看swagger API 文档
-
-### 如何测试 bm-monitoring
-1. 安装 [Prometheus LTS 
Version](https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz)
-2. 配置 prometheus.yml,在`scrape_configs`部分添加以下yaml代码
-```
-- job_name: "bm-agent-host"
-  metrics_path: "/actuator/prometheus"
-  static_configs:
-    - targets: ["agent1 server ip/hostname:8081", "agent2 server 
ip/hostname:8081", ...]
-```
-3. 配置以下prometheus查询信息,配置文件位于 
`bigtop-manager-server/src/main/resources/application.yml`
-```
-monitoring:
-  prometheus-host: "http://localhost:9090";
-  agent-host-job-name: "bm-agent-host"
-```
\ 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 14ce2b37..a51b245e 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
@@ -50,7 +50,7 @@
             <if test="query.hostname != null and query.hostname != ''">
                 and h.hostname like concat('%', #{query.hostname}, '%')
             </if>
-            <if test="query.clusterId != null">
+            <if test="query.clusterId != null and query.clusterId != 0">
                 and h.cluster_id = #{query.clusterId}
             </if>
             <if test="query.ipv4 != null and query.ipv4 != ''">
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 2b1fdb9c..36834182 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
@@ -50,7 +50,7 @@
             <if test="query.hostname != null and query.hostname != ''">
                 and h.hostname like concat('%', #{query.hostname}, '%')
             </if>
-            <if test="query.clusterId != null">
+            <if test="query.clusterId != null and query.clusterId != 0">
                 and h.cluster_id = #{query.clusterId}
             </if>
             <if test="query.ipv4 != null and query.ipv4 != ''">
diff --git a/bigtop-manager-dist/pom.xml b/bigtop-manager-dist/pom.xml
index ab82e165..0182c9cc 100644
--- a/bigtop-manager-dist/pom.xml
+++ b/bigtop-manager-dist/pom.xml
@@ -68,27 +68,27 @@
                 <artifactId>maven-assembly-plugin</artifactId>
                 <executions>
                     <execution>
-                        <id>server-bin</id>
+                        <id>server</id>
                         <goals>
                             <goal>single</goal>
                         </goals>
                         <phase>package</phase>
                         <configuration>
                             <descriptors>
-                                
<descriptor>src/main/assembly/assembly-server-bin.xml</descriptor>
+                                
<descriptor>src/main/assembly/assembly-server.xml</descriptor>
                             </descriptors>
                             <appendAssemblyId>true</appendAssemblyId>
                         </configuration>
                     </execution>
                     <execution>
-                        <id>agent-bin</id>
+                        <id>agent</id>
                         <goals>
                             <goal>single</goal>
                         </goals>
                         <phase>package</phase>
                         <configuration>
                             <descriptors>
-                                
<descriptor>src/main/assembly/assembly-agent-bin.xml</descriptor>
+                                
<descriptor>src/main/assembly/assembly-agent.xml</descriptor>
                             </descriptors>
                             <appendAssemblyId>true</appendAssemblyId>
                         </configuration>
@@ -135,7 +135,7 @@
                                 <phase>package</phase>
                                 <configuration>
                                     <descriptors>
-                                        
<descriptor>src/main/assembly/assembly-server-bin.xml</descriptor>
+                                        
<descriptor>src/main/assembly/assembly-server.xml</descriptor>
                                     </descriptors>
                                     <appendAssemblyId>true</appendAssemblyId>
                                 </configuration>
@@ -148,7 +148,7 @@
                                 <phase>package</phase>
                                 <configuration>
                                     <descriptors>
-                                        
<descriptor>src/main/assembly/assembly-agent-bin.xml</descriptor>
+                                        
<descriptor>src/main/assembly/assembly-agent.xml</descriptor>
                                     </descriptors>
                                     <appendAssemblyId>true</appendAssemblyId>
                                 </configuration>
diff --git a/bigtop-manager-dist/src/main/assembly/assembly-agent-bin.xml 
b/bigtop-manager-dist/src/main/assembly/assembly-agent.xml
similarity index 96%
rename from bigtop-manager-dist/src/main/assembly/assembly-agent-bin.xml
rename to bigtop-manager-dist/src/main/assembly/assembly-agent.xml
index 4885e342..b3f0f741 100644
--- a/bigtop-manager-dist/src/main/assembly/assembly-agent-bin.xml
+++ b/bigtop-manager-dist/src/main/assembly/assembly-agent.xml
@@ -19,12 +19,12 @@
 <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0";
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
           xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 
http://maven.apache.org/xsd/assembly-2.1.0.xsd";>
-    <id>agent-bin</id>
+    <id>agent</id>
     <formats>
         <format>tar.gz</format>
     </formats>
     <includeBaseDirectory>true</includeBaseDirectory>
-    <baseDirectory>${project.build.finalName}-agent-bin</baseDirectory>
+    <baseDirectory>bigtop-manager-agent</baseDirectory>
 
     <fileSets>
         <fileSet>
diff --git a/bigtop-manager-dist/src/main/assembly/assembly-server-bin.xml 
b/bigtop-manager-dist/src/main/assembly/assembly-server.xml
similarity index 97%
rename from bigtop-manager-dist/src/main/assembly/assembly-server-bin.xml
rename to bigtop-manager-dist/src/main/assembly/assembly-server.xml
index 941eac45..f174ae13 100644
--- a/bigtop-manager-dist/src/main/assembly/assembly-server-bin.xml
+++ b/bigtop-manager-dist/src/main/assembly/assembly-server.xml
@@ -19,12 +19,12 @@
 <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0";
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
           xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 
http://maven.apache.org/xsd/assembly-2.1.0.xsd";>
-    <id>server-bin</id>
+    <id>server</id>
     <formats>
         <format>tar.gz</format>
     </formats>
     <includeBaseDirectory>true</includeBaseDirectory>
-    <baseDirectory>${project.build.finalName}-server-bin</baseDirectory>
+    <baseDirectory>bigtop-manager-server</baseDirectory>
 
     <fileSets>
         <fileSet>
diff --git a/bigtop-manager-dist/src/main/assembly/assembly-src.xml 
b/bigtop-manager-dist/src/main/assembly/assembly-src.xml
index aab25fa3..c4c3ea96 100644
--- a/bigtop-manager-dist/src/main/assembly/assembly-src.xml
+++ b/bigtop-manager-dist/src/main/assembly/assembly-src.xml
@@ -24,7 +24,7 @@
         <format>tar.gz</format>
     </formats>
     <includeBaseDirectory>true</includeBaseDirectory>
-    <baseDirectory>${project.build.finalName}-src</baseDirectory>
+    <baseDirectory>bigtop-manager-src</baseDirectory>
 
     <fileSets>
         <fileSet>
diff --git 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/payload/JobCachePayload.java
 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/payload/JobCachePayload.java
index e3626eca..39fef48f 100644
--- 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/payload/JobCachePayload.java
+++ 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/payload/JobCachePayload.java
@@ -29,6 +29,8 @@ import java.util.Map;
 @Data
 public class JobCachePayload {
 
+    private Long clusterId;
+
     private ClusterInfo clusterInfo;
 
     private Map<String, String> userInfo;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
index a5790741..9221db33 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
@@ -45,9 +45,11 @@ import org.apache.bigtop.manager.server.model.dto.StackDTO;
 import org.apache.bigtop.manager.server.utils.StackUtils;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
@@ -74,15 +76,25 @@ public class JobCacheHelper {
         INITIALIZED.set(true);
     }
 
-    public static void sendJobCache(Long clusterId, Long jobId, List<String> 
hostnames) {
-        JobCachePayload payload = genPayload(clusterId);
-        JobCacheRequest request = JobCacheRequest.newBuilder()
-                .setJobId(jobId)
-                .setPayload(JsonUtils.writeAsString(payload))
-                .build();
+    public static void sendJobCache(Long jobId, List<String> hostnames) {
+        if (!INITIALIZED.get()) {
+            initialize();
+        }
+
+        JobCachePayload payload = new JobCachePayload();
+        genGlobalPayload(payload);
+
+        // Sort by cluster id to avoid regenerating the same cluster payload
         List<HostPO> hostPOList = hostDao.findAllByHostnames(hostnames);
+        hostPOList.sort(Comparator.comparing(HostPO::getClusterId));
+
         List<CompletableFuture<Boolean>> futures = new ArrayList<>();
         for (HostPO hostPO : hostPOList) {
+            genClusterPayload(payload, hostPO.getClusterId());
+            JobCacheRequest request = JobCacheRequest.newBuilder()
+                    .setJobId(jobId)
+                    .setPayload(JsonUtils.writeAsString(payload))
+                    .build();
             futures.add(CompletableFuture.supplyAsync(() -> {
                 JobCacheServiceGrpc.JobCacheServiceBlockingStub stub = 
GrpcClient.getBlockingStub(
                         hostPO.getHostname(),
@@ -109,26 +121,66 @@ public class JobCacheHelper {
         }
     }
 
-    private static JobCachePayload genPayload(Long clusterId) {
-        if (!INITIALIZED.get()) {
-            initialize();
+    private static void genClusterPayload(JobCachePayload payload, Long 
clusterId) {
+        if (Objects.equals(payload.getClusterId(), clusterId)) {
+            return;
         }
 
         ClusterPO clusterPO = clusterDao.findById(clusterId);
 
-        ComponentQuery componentQuery =
-                ComponentQuery.builder().clusterId(clusterId).build();
-
-        List<ServiceConfigPO> serviceConfigPOList = 
serviceConfigDao.findByClusterId(clusterPO.getId());
-        List<ComponentPO> componentPOList = 
componentDao.findByQuery(componentQuery);
-        List<RepoPO> repoPOList = repoDao.findAll();
-        List<HostPO> hostPOList = hostDao.findAll();
-
         ClusterInfo clusterInfo = new ClusterInfo();
         clusterInfo.setName(clusterPO.getName());
         clusterInfo.setUserGroup(clusterPO.getUserGroup());
         clusterInfo.setRootDir(clusterPO.getRootDir());
 
+        Map<String, Map<String, String>> serviceConfigMap = 
payload.getConfigurations();
+        serviceConfigMap.putAll(getServiceConfigMap(clusterId));
+
+        Map<String, List<String>> componentHostMap = 
payload.getComponentHosts();
+        componentHostMap.putAll(getComponentHostMap(clusterId));
+
+        payload.setClusterId(clusterId);
+        payload.setClusterInfo(clusterInfo);
+        payload.setConfigurations(serviceConfigMap);
+        payload.setComponentHosts(componentHostMap);
+    }
+
+    private static void genGlobalPayload(JobCachePayload payload) {
+        List<RepoPO> repoPOList = repoDao.findAll();
+        List<HostPO> hostPOList = hostDao.findAll();
+
+        Map<String, Map<String, String>> serviceConfigMap = 
getServiceConfigMap(0L);
+
+        Map<String, List<String>> componentHostMap = new HashMap<>();
+        List<String> allHostnames = 
hostPOList.stream().map(HostPO::getHostname).toList();
+        componentHostMap.put(ALL_HOST_KEY, allHostnames);
+        componentHostMap.putAll(getComponentHostMap(0L));
+
+        List<RepoInfo> repoList = new ArrayList<>();
+        repoPOList.forEach(repoPO -> {
+            RepoInfo repoInfo = new RepoInfo();
+            repoInfo.setName(repoPO.getName());
+            repoInfo.setArch(repoPO.getArch());
+            repoInfo.setBaseUrl(repoPO.getBaseUrl());
+            repoInfo.setType(repoPO.getType());
+            repoList.add(repoInfo);
+        });
+
+        Map<String, String> userMap = new HashMap<>();
+        for (StackDTO stackDTO : StackUtils.getAllStacks()) {
+            for (ServiceDTO serviceDTO : 
StackUtils.getServiceDTOList(stackDTO)) {
+                userMap.put(serviceDTO.getName(), serviceDTO.getUser());
+            }
+        }
+
+        payload.setConfigurations(serviceConfigMap);
+        payload.setComponentHosts(componentHostMap);
+        payload.setRepoInfo(repoList);
+        payload.setUserInfo(userMap);
+    }
+
+    private static Map<String, Map<String, String>> getServiceConfigMap(Long 
clusterId) {
+        List<ServiceConfigPO> serviceConfigPOList = 
serviceConfigDao.findByClusterId(clusterId);
         Map<String, Map<String, String>> serviceConfigMap = new HashMap<>();
         for (ServiceConfigPO serviceConfigPO : serviceConfigPOList) {
             List<Map<String, Object>> properties = 
JsonUtils.readFromString(serviceConfigPO.getPropertiesJson());
@@ -146,6 +198,12 @@ public class JobCacheHelper {
             }
         }
 
+        return serviceConfigMap;
+    }
+
+    private static Map<String, List<String>> getComponentHostMap(Long 
clusterId) {
+        ComponentQuery query = 
ComponentQuery.builder().clusterId(clusterId).build();
+        List<ComponentPO> componentPOList = componentDao.findByQuery(query);
         Map<String, List<String>> hostMap = new HashMap<>();
         componentPOList.forEach(x -> {
             if (hostMap.containsKey(x.getName())) {
@@ -155,35 +213,8 @@ public class JobCacheHelper {
                 list.add(x.getHostname());
                 hostMap.put(x.getName(), list);
             }
-            hostMap.get(x.getName()).add(x.getHostname());
-        });
-
-        List<String> allHostnames = 
hostPOList.stream().map(HostPO::getHostname).toList();
-        hostMap.put(ALL_HOST_KEY, allHostnames);
-
-        List<RepoInfo> repoList = new ArrayList<>();
-        repoPOList.forEach(repoPO -> {
-            RepoInfo repoInfo = new RepoInfo();
-            repoInfo.setName(repoPO.getName());
-            repoInfo.setArch(repoPO.getArch());
-            repoInfo.setBaseUrl(repoPO.getBaseUrl());
-            repoInfo.setType(repoPO.getType());
-            repoList.add(repoInfo);
         });
 
-        Map<String, String> userMap = new HashMap<>();
-        for (StackDTO stackDTO : StackUtils.getAllStacks()) {
-            for (ServiceDTO serviceDTO : 
StackUtils.getServiceDTOList(stackDTO)) {
-                userMap.put(serviceDTO.getName(), serviceDTO.getUser());
-            }
-        }
-
-        JobCachePayload payload = new JobCachePayload();
-        payload.setClusterInfo(clusterInfo);
-        payload.setConfigurations(serviceConfigMap);
-        payload.setComponentHosts(hostMap);
-        payload.setRepoInfo(repoList);
-        payload.setUserInfo(userMap);
-        return payload;
+        return hostMap;
     }
 }
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 02f07ecf..ec7dd6c0 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
@@ -105,7 +105,7 @@ public abstract class AbstractJob implements Job {
                     .flatMap(List::stream)
                     .distinct()
                     .toList();
-            JobCacheHelper.sendJobCache(clusterPO.getId(), jobPO.getId(), 
hostnames);
+            JobCacheHelper.sendJobCache(jobPO.getId(), hostnames);
 
             LinkedBlockingQueue<Stage> queue = new 
LinkedBlockingQueue<>(stages);
             while (!queue.isEmpty()) {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java
index 7ffadc05..a5589d8e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java
@@ -41,6 +41,8 @@ import 
org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO;
 import org.apache.bigtop.manager.server.utils.StackConfigUtils;
 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;
@@ -84,11 +86,15 @@ public class ServiceAddJob extends AbstractServiceJob {
         Map<String, List<String>> componentHostsMap = new HashMap<>();
 
         jobContext.getCommandDTO().getServiceCommands().stream()
+                .filter(command -> !command.getInstalled())
                 .map(ServiceCommandDTO::getComponentHosts)
                 .forEach(componentHosts -> {
                     for (ComponentHostDTO componentHost : componentHosts) {
                         String componentName = 
componentHost.getComponentName();
                         List<String> hostnames = componentHost.getHostnames();
+                        if (CollectionUtils.isEmpty(hostnames)) {
+                            throw new RuntimeException("No hostnames found for 
component " + componentName);
+                        }
                         componentHostsMap.put(componentName, hostnames);
                     }
                 });
@@ -121,6 +127,10 @@ public class ServiceAddJob extends AbstractServiceJob {
         Long clusterId = commandDTO.getClusterId();
         List<ServiceCommandDTO> serviceCommands = 
commandDTO.getServiceCommands();
         for (ServiceCommandDTO serviceCommand : serviceCommands) {
+            if (serviceCommand.getInstalled()) {
+                continue;
+            }
+
             String serviceName = serviceCommand.getServiceName();
             ServicePO servicePO = serviceDao.findByClusterIdAndName(clusterId, 
serviceName);
             servicePO.setStatus(HealthyStatusEnum.HEALTHY.getCode());
@@ -136,6 +146,10 @@ public class ServiceAddJob extends AbstractServiceJob {
     }
 
     private void saveService(ServiceCommandDTO serviceCommand) {
+        if (serviceCommand.getInstalled()) {
+            return;
+        }
+
         CommandDTO commandDTO = jobContext.getCommandDTO();
         Long clusterId = commandDTO.getClusterId();
         String serviceName = serviceCommand.getServiceName();
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 0e913467..8d35b8d8 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
@@ -70,14 +70,14 @@ public abstract class AbstractComponentStage extends 
AbstractStage {
 
         TaskContext taskContext = new TaskContext();
         taskContext.setHostname(hostname);
-        taskContext.setClusterId(clusterPO.getId());
-        taskContext.setClusterName(clusterPO.getName());
+        taskContext.setClusterId(clusterPO == null ? null : clusterPO.getId());
+        taskContext.setClusterName(clusterPO == null ? null : 
clusterPO.getName());
         taskContext.setServiceName(serviceDTO.getName());
         taskContext.setComponentName(componentDTO.getName());
         taskContext.setComponentDisplayName(componentDTO.getDisplayName());
         taskContext.setServiceUser(serviceDTO.getUser());
-        taskContext.setUserGroup(clusterPO.getUserGroup());
-        taskContext.setRootDir(clusterPO.getRootDir());
+        taskContext.setUserGroup(clusterPO == null ? null : 
clusterPO.getUserGroup());
+        taskContext.setRootDir(clusterPO == null ? null : 
clusterPO.getRootDir());
 
         Map<String, Object> properties = new HashMap<>();
         properties.put("clusterHosts", getClusterHosts());
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
index 7bddcaa9..da3595b8 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/StageContext.java
@@ -48,7 +48,7 @@ public class StageContext {
     public static StageContext fromCommandDTO(CommandDTO commandDTO) {
         StageContext context = new StageContext();
 
-        if (commandDTO.getClusterId() != null) {
+        if (commandDTO.getClusterId() != null && commandDTO.getClusterId() != 
0) {
             ClusterDao clusterDao = 
SpringContextHolder.getBean(ClusterDao.class);
             ClusterPO clusterPO = 
clusterDao.findById(commandDTO.getClusterId());
             context.setClusterId(clusterPO.getId());
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
index 429fe597..d98ccede 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
@@ -41,9 +41,10 @@ public enum ApiExceptionEnum {
     HOST_NOT_FOUND(12000, LocaleKeys.HOST_NOT_FOUND),
     HOST_ASSIGNED(12001, LocaleKeys.HOST_ASSIGNED),
     HOST_NOT_CONNECTED(12002, LocaleKeys.HOST_NOT_CONNECTED),
-    HOST_UNABLE_TO_CONNECT(12003, LocaleKeys.HOST_UNABLE_TO_CONNECT),
-    HOST_UNABLE_TO_EXEC_COMMAND(12004, LocaleKeys.HOST_UNABLE_TO_EXEC_COMMAND),
-    HOST_HAS_COMPONENTS(12005, LocaleKeys.HOST_HAS_COMPONENTS),
+    HOST_UNABLE_TO_RESOLVE(12003, LocaleKeys.HOST_UNABLE_TO_RESOLVE),
+    HOST_UNABLE_TO_CONNECT(12004, LocaleKeys.HOST_UNABLE_TO_CONNECT),
+    HOST_UNABLE_TO_EXEC_COMMAND(12005, LocaleKeys.HOST_UNABLE_TO_EXEC_COMMAND),
+    HOST_HAS_COMPONENTS(12006, LocaleKeys.HOST_HAS_COMPONENTS),
 
     // Stack Exceptions -- 13000 ~ 13999
     STACK_NOT_FOUND(13000, LocaleKeys.STACK_NOT_FOUND),
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
index c2fd671c..132f141b 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
@@ -43,6 +43,7 @@ public enum LocaleKeys {
     HOST_NOT_FOUND("host.not.found"),
     HOST_ASSIGNED("host.assigned"),
     HOST_NOT_CONNECTED("host.not.connected"),
+    HOST_UNABLE_TO_RESOLVE("host.unable.to.resolve"),
     HOST_UNABLE_TO_CONNECT("host.unable.to.connect"),
     HOST_UNABLE_TO_EXEC_COMMAND("host.unable.to.exec.command"),
     HOST_HAS_COMPONENTS("host.has.components"),
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/grpc/GrpcClient.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/grpc/GrpcClient.java
index 74b6e917..340d1711 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/grpc/GrpcClient.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/grpc/GrpcClient.java
@@ -33,6 +33,7 @@ import io.grpc.stub.AbstractStub;
 import lombok.extern.slf4j.Slf4j;
 
 import java.lang.reflect.Constructor;
+import java.net.InetAddress;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
@@ -85,7 +86,16 @@ public class GrpcClient {
     }
 
     private static ManagedChannel createChannel(String host, Integer port) {
-        ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port)
+        String ipv4;
+        try {
+            InetAddress address = InetAddress.getByName(host);
+            ipv4 = address.getHostAddress();
+        } catch (Exception e) {
+            log.error("Unable to resolve host: {}", host);
+            throw new ApiException(ApiExceptionEnum.HOST_UNABLE_TO_RESOLVE, 
host);
+        }
+
+        ManagedChannel channel = ManagedChannelBuilder.forAddress(ipv4, port)
                 .usePlaintext()
                 .keepAliveTime(60, TimeUnit.SECONDS)
                 .keepAliveWithoutCalls(true)
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
index 4581d3ac..0090031d 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/HostDTO.java
@@ -53,5 +53,9 @@ public class HostDTO {
 
     private Integer grpcPort;
 
+    private String ipv4;
+
+    private String ipv6;
+
     private String desc;
 }
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 c306a717..7ebc9f5a 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,6 +31,8 @@ public class ServiceCommandDTO implements Serializable {
 
     private String serviceName;
 
+    private Boolean installed;
+
     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 214c04d7..1a75cbee 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
@@ -21,7 +21,6 @@ package org.apache.bigtop.manager.server.model.req;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
@@ -31,7 +30,6 @@ public class ComponentHostReq {
     @NotNull @Schema(description = "Component name", example = 
"zookeeper_server")
     private String componentName;
 
-    @NotEmpty
     @Schema(description = "Hostnames for component", example = "[host1, 
host2]")
     private List<String> hostnames;
 }
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 dd645ad5..14c73043 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,6 +36,9 @@ public class ServiceCommandReq {
     @NotNull @Schema(description = "Service name", example = "zookeeper")
     private String serviceName;
 
+    @NotNull @Schema(description = "Whether the service is already installed", 
example = "false")
+    private Boolean installed;
+
     @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/proxy/PrometheusProxy.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/proxy/PrometheusProxy.java
index 30920a27..2ccf4f9d 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/proxy/PrometheusProxy.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/proxy/PrometheusProxy.java
@@ -18,15 +18,9 @@
  */
 package org.apache.bigtop.manager.server.proxy;
 
-import org.apache.bigtop.manager.dao.query.HostQuery;
-import org.apache.bigtop.manager.server.model.vo.HostVO;
-import org.apache.bigtop.manager.server.model.vo.PageVO;
-import org.apache.bigtop.manager.server.service.HostService;
 import org.apache.bigtop.manager.server.utils.ProxyUtils;
 
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
-import org.springframework.stereotype.Component;
 import org.springframework.web.reactive.function.BodyInserters;
 import org.springframework.web.reactive.function.client.WebClient;
 
@@ -36,7 +30,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import reactor.core.publisher.Mono;
 
-import jakarta.annotation.Resource;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -44,14 +37,10 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
-@Component
 public class PrometheusProxy {
 
     private final WebClient webClient;
 
-    @Value("${monitoring.agent-host-job-name}")
-    private String agentHostJobName;
-
     public static final String MEM_IDLE = "memIdle";
     public static final String MEM_TOTAL = "memTotal";
     public static final String DISK_IDLE = "diskFreeSpace";
@@ -66,12 +55,8 @@ public class PrometheusProxy {
     public static final String DISK_READ = "diskRead";
     public static final String DISK_WRITE = "diskWrite";
 
-    @Resource
-    private HostService hostService;
-
-    public PrometheusProxy(
-            WebClient.Builder webClientBuilder, 
@Value("${monitoring.prometheus-host}") String prometheusHost) {
-        this.webClient = webClientBuilder.baseUrl(prometheusHost).build();
+    public PrometheusProxy(String prometheusHost) {
+        this.webClient = WebClient.builder().baseUrl(prometheusHost).build();
     }
     /**
      * Retrieve current data
@@ -120,7 +105,7 @@ public class PrometheusProxy {
      * query agents healthy
      */
     public JsonNode queryAgentsHealthyStatus() {
-        JsonNode result = query("up{job=\"%s\"}".formatted(agentHostJobName));
+        JsonNode result = query("up{job=\"%s\"}".formatted("bm-agent-host"));
         ObjectMapper objectMapper = new ObjectMapper();
         ArrayNode agentsHealthyStatus = objectMapper.createArrayNode();
         if (result != null) {
@@ -145,9 +130,8 @@ public class PrometheusProxy {
     /**
      * query agents info interval
      */
-    public JsonNode queryAgentsInfo(Long id, String interval) {
+    public JsonNode queryAgentsInfo(String agentIpv4, String interval) {
         ObjectMapper objectMapper = new ObjectMapper();
-        String agentIpv4 = hostService.get(id).getIpv4();
         if (!Objects.equals(agentIpv4, "")) {
             ObjectNode ag = objectMapper.createObjectNode();
             double[] agentsCpuUsage = new double[6];
@@ -225,12 +209,8 @@ public class PrometheusProxy {
     /**
      * query clusters info interval
      */
-    public JsonNode queryClustersInfo(Long clusterId, String interval) {
-        HostQuery hostQuery = new HostQuery();
-        hostQuery.setClusterId(clusterId);
-        PageVO<HostVO> hostPage = hostService.list(hostQuery); // query host 
list
-        List<HostVO> hostList = hostPage.getContent();
-        int agentsNum = Math.toIntExact(hostPage.getTotal()); // change to 
agentsNum
+    public JsonNode queryClustersInfo(List<String> agentIpv4s, String 
interval) {
+        int agentsNum = agentIpv4s.size(); // change to agentsNum
         ObjectMapper objectMapper = new ObjectMapper();
         if (agentsNum > 0) {
             int totalPhysicalCores = 0;
@@ -245,8 +225,7 @@ public class PrometheusProxy {
 
             int agentIndex = 0;
             ObjectNode clusterInfo = objectMapper.createObjectNode();
-            for (HostVO hostVO : hostList) {
-                String agentIpv4 = hostVO.getIpv4();
+            for (String agentIpv4 : agentIpv4s) {
                 JsonNode agentCpu = retrieveAgentCpu(agentIpv4);
                 instantCpuUsage += agentCpu.get("cpuUsage").asDouble()
                         * agentCpu.get(PHYSICAL_CORES).asInt();
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/MetricsServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/MetricsServiceImpl.java
index dff7728a..ba431bb9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/MetricsServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/MetricsServiceImpl.java
@@ -18,35 +18,77 @@
  */
 package org.apache.bigtop.manager.server.service.impl;
 
+import org.apache.bigtop.manager.dao.po.ComponentPO;
+import org.apache.bigtop.manager.dao.po.HostPO;
+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.server.proxy.PrometheusProxy;
 import org.apache.bigtop.manager.server.service.MetricsService;
 
 import org.springframework.stereotype.Service;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
 
 import jakarta.annotation.Resource;
+import java.util.List;
 
 @Slf4j
 @Service
 public class MetricsServiceImpl implements MetricsService {
 
     @Resource
-    private PrometheusProxy prometheusProxy;
+    private HostDao hostDao;
+
+    @Resource
+    private ComponentDao componentDao;
 
     @Override
     public JsonNode queryAgentsHealthyStatus() {
-        return prometheusProxy.queryAgentsHealthyStatus();
+        PrometheusProxy proxy = getProxy();
+        if (proxy == null) {
+            return new ObjectMapper().createObjectNode();
+        }
+
+        return proxy.queryAgentsHealthyStatus();
     }
 
     @Override
     public JsonNode queryAgentsInfo(Long id, String interval) {
-        return prometheusProxy.queryAgentsInfo(id, interval);
+        PrometheusProxy proxy = getProxy();
+        if (proxy == null) {
+            return new ObjectMapper().createObjectNode();
+        }
+
+        String ipv4 = hostDao.findById(id).getIpv4();
+        return proxy.queryAgentsInfo(ipv4, interval);
     }
 
     @Override
     public JsonNode queryClustersInfo(Long clusterId, String interval) {
-        return prometheusProxy.queryClustersInfo(clusterId, interval);
+        PrometheusProxy proxy = getProxy();
+        if (proxy == null) {
+            return new ObjectMapper().createObjectNode();
+        }
+
+        List<String> ipv4s = hostDao.findAllByClusterId(clusterId).stream()
+                .map(HostPO::getIpv4)
+                .toList();
+        return proxy.queryClustersInfo(ipv4s, interval);
+    }
+
+    private PrometheusProxy getProxy() {
+        ComponentQuery query =
+                ComponentQuery.builder().name("prometheus_server").build();
+        List<ComponentPO> componentPOList = componentDao.findByQuery(query);
+        if (componentPOList.isEmpty()) {
+            return null;
+        } else {
+            ComponentPO componentPO = componentPOList.get(0);
+            HostPO hostPO = hostDao.findById(componentPO.getHostId());
+            return new PrometheusProxy(hostPO.getHostname());
+        }
     }
 }
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 af9c0a87..3e4cd61f 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
@@ -33,6 +33,7 @@ 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.ComponentConverter;
 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;
@@ -40,6 +41,7 @@ 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.ComponentVO;
 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;
@@ -125,7 +127,16 @@ public class ServiceServiceImpl implements ServiceService {
 
     @Override
     public ServiceVO get(Long id) {
-        return ServiceConverter.INSTANCE.fromPO2VO(serviceDao.findById(id));
+        ServiceVO serviceVO = 
ServiceConverter.INSTANCE.fromPO2VO(serviceDao.findById(id));
+
+        ComponentQuery query = ComponentQuery.builder().serviceId(id).build();
+        List<ComponentPO> componentPOList = componentDao.findByQuery(query);
+        List<ComponentVO> componentVOList = 
ComponentConverter.INSTANCE.fromPO2VO(componentPOList);
+        List<ServiceConfigVO> serviceConfigVOList = listConf(null, id);
+
+        serviceVO.setComponents(componentVOList);
+        serviceVO.setConfigs(serviceConfigVOList);
+        return serviceVO;
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/RemoteSSHUtils.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/RemoteSSHUtils.java
index 53417f1e..aa394498 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/RemoteSSHUtils.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/RemoteSSHUtils.java
@@ -66,7 +66,9 @@ public class RemoteSSHUtils {
             String keyPassword,
             String command)
             throws Exception {
-        String keyPath = ProjectPathUtils.getKeyStorePath() + File.separator + 
keyFilename;
+        String keyPath = StringUtils.isEmpty(keyFilename)
+                ? null
+                : ProjectPathUtils.getKeyStorePath() + File.separator + 
keyFilename;
         try (SshClient client = getSshClient(keyPath, keyString, keyPassword)) 
{
             return run(client, host, port, user, command);
         }
diff --git a/bigtop-manager-server/src/main/resources/application.yml 
b/bigtop-manager-server/src/main/resources/application.yml
index 9c3a1282..87b5dbd0 100644
--- a/bigtop-manager-server/src/main/resources/application.yml
+++ b/bigtop-manager-server/src/main/resources/application.yml
@@ -57,10 +57,6 @@ springdoc:
   swagger-ui:
     default-models-expand-depth: -1
 
-monitoring:
-  prometheus-host: "http://localhost:9090";
-  agent-host-job-name: "bm-agent-host"
-
 pagehelper:
   reasonable: false
   params: count=countSql
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 7f745b96..900f7101 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
@@ -217,7 +217,7 @@ CREATE TABLE job
     name        VARCHAR(255),
     context     TEXT                  NOT NULL,
     state       VARCHAR(32)           NOT NULL,
-    cluster_id  BIGINT CHECK (cluster_id > 0) DEFAULT NULL,
+    cluster_id  BIGINT DEFAULT NULL,
     create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     create_by   BIGINT,
@@ -236,7 +236,7 @@ CREATE TABLE stage
     context        TEXT,
     "order"        INTEGER,
     state          VARCHAR(32)               NOT NULL,
-    cluster_id     BIGINT CHECK (cluster_id > 0) DEFAULT NULL,
+    cluster_id     BIGINT DEFAULT NULL,
     job_id         BIGINT CHECK (job_id > 0) NOT NULL,
     create_time    TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time    TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
diff --git 
a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties 
b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
index c83cf2b4..a9d1b3d9 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
@@ -37,6 +37,7 @@ cluster.has.no.services=Cluster has no services, please add 
one first
 host.not.found=Host not exist
 host.assigned=Hosts [{0}] already assigned to another cluster
 host.not.connected=Hosts [{0}] not connected
+host.unable.to.resolve=Unable to resolve to host [{0}]
 host.unable.to.connect=Unable to connect to host [{0}]
 host.unable.to.exec.command=Unable to execute command on host [{0}]
 host.has.components=Host still has components, please remove them first
diff --git 
a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties 
b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
index 7b4b92d0..64583349 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
@@ -37,6 +37,7 @@ cluster.has.no.services=集群上没有服务,请先添加
 host.not.found=主机不存在
 host.assigned=主机 [{0}] 已属于其他集群
 host.not.connected=主机 [{0}] 未连接
+host.unable.to.resolve=无法解析主机 [{0}]
 host.unable.to.connect=无法连接到主机 [{0}]
 host.unable.to.exec.command=无法在主机 [{0}] 上执行命令
 host.has.components=主机上仍有组件,请先移除


Reply via email to