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=主机上仍有组件,请先移除