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 a97a4da5 BIGTOP-4317: Support host start/stop/restart commands (#139)
a97a4da5 is described below

commit a97a4da5892e31b06d9970ac76ff2de8c49bceb7
Author: Zhiguo Wu <[email protected]>
AuthorDate: Sat Jan 4 10:58:15 2025 +0800

    BIGTOP-4317: Support host start/stop/restart commands (#139)
---
 .../bigtop/manager/dao/query/ComponentQuery.java   |   2 +
 .../resources/mapper/mysql/ComponentMapper.xml     |   6 +
 .../mapper/postgresql/ComponentMapper.xml          |   6 +
 .../command/factory/host/HostAddJobFactory.java    |   3 +-
 ...dJobFactory.java => HostRestartJobFactory.java} |   9 +-
 ...AddJobFactory.java => HostStartJobFactory.java} |   9 +-
 ...tAddJobFactory.java => HostStopJobFactory.java} |   9 +-
 .../server/command/job/AbstractHostJob.java        | 137 +++++++++++++++++++++
 .../manager/server/command/job/HostRestartJob.java |  35 +++---
 .../manager/server/command/job/HostStartJob.java   |  35 ++----
 .../manager/server/command/job/HostStopJob.java    |  35 ++----
 11 files changed, 204 insertions(+), 82 deletions(-)

diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
index 5fda2fba..6fc5c529 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
@@ -39,6 +39,8 @@ public class ComponentQuery {
 
     private String hostname;
 
+    private List<String> hostnames;
+
     private Long serviceId;
 
     private List<String> serviceNames;
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml
index 964295af..8a7f1fa0 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ComponentMapper.xml
@@ -59,6 +59,12 @@
             <if test="query.hostname != null and query.hostname != ''">
                 and h.hostname = #{query.hostname}
             </if>
+            <if test="query.hostnames != null and query.hostnames.size() > 0">
+                and h.hostname in
+                <foreach collection="query.hostnames" item="hostname" 
index="index" open="(" close=")" separator=",">
+                    #{hostname}
+                </foreach>
+            </if>
             <if test="query.serviceId != null">
                 and comp.service_id = #{query.serviceId}
             </if>
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml
index 964295af..8a7f1fa0 100644
--- 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml
+++ 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ComponentMapper.xml
@@ -59,6 +59,12 @@
             <if test="query.hostname != null and query.hostname != ''">
                 and h.hostname = #{query.hostname}
             </if>
+            <if test="query.hostnames != null and query.hostnames.size() > 0">
+                and h.hostname in
+                <foreach collection="query.hostnames" item="hostname" 
index="index" open="(" close=")" separator=",">
+                    #{hostname}
+                </foreach>
+            </if>
             <if test="query.serviceId != null">
                 and comp.service_id = #{query.serviceId}
             </if>
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
index ecf9b911..98474d8d 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
@@ -20,7 +20,6 @@ package org.apache.bigtop.manager.server.command.factory.host;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.server.command.CommandIdentifier;
-import 
org.apache.bigtop.manager.server.command.factory.cluster.AbstractClusterJobFactory;
 import org.apache.bigtop.manager.server.command.job.HostAddJob;
 import org.apache.bigtop.manager.server.command.job.Job;
 import org.apache.bigtop.manager.server.command.job.JobContext;
@@ -35,7 +34,7 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class HostAddJobFactory extends AbstractClusterJobFactory {
+public class HostAddJobFactory extends AbstractHostJobFactory {
 
     @Override
     public CommandIdentifier getCommandIdentifier() {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostRestartJobFactory.java
similarity index 86%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostRestartJobFactory.java
index ecf9b911..c0e25341 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostRestartJobFactory.java
@@ -20,8 +20,7 @@ package org.apache.bigtop.manager.server.command.factory.host;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.server.command.CommandIdentifier;
-import 
org.apache.bigtop.manager.server.command.factory.cluster.AbstractClusterJobFactory;
-import org.apache.bigtop.manager.server.command.job.HostAddJob;
+import org.apache.bigtop.manager.server.command.job.HostRestartJob;
 import org.apache.bigtop.manager.server.command.job.Job;
 import org.apache.bigtop.manager.server.command.job.JobContext;
 import org.apache.bigtop.manager.server.enums.CommandLevel;
@@ -35,15 +34,15 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class HostAddJobFactory extends AbstractClusterJobFactory {
+public class HostRestartJobFactory extends AbstractHostJobFactory {
 
     @Override
     public CommandIdentifier getCommandIdentifier() {
-        return new CommandIdentifier(CommandLevel.HOST, Command.ADD);
+        return new CommandIdentifier(CommandLevel.HOST, Command.RESTART);
     }
 
     @Override
     public Job createJob(JobContext jobContext) {
-        return new HostAddJob(jobContext);
+        return new HostRestartJob(jobContext);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostStartJobFactory.java
similarity index 86%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostStartJobFactory.java
index ecf9b911..844f6518 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostStartJobFactory.java
@@ -20,8 +20,7 @@ package org.apache.bigtop.manager.server.command.factory.host;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.server.command.CommandIdentifier;
-import 
org.apache.bigtop.manager.server.command.factory.cluster.AbstractClusterJobFactory;
-import org.apache.bigtop.manager.server.command.job.HostAddJob;
+import org.apache.bigtop.manager.server.command.job.HostStartJob;
 import org.apache.bigtop.manager.server.command.job.Job;
 import org.apache.bigtop.manager.server.command.job.JobContext;
 import org.apache.bigtop.manager.server.enums.CommandLevel;
@@ -35,15 +34,15 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class HostAddJobFactory extends AbstractClusterJobFactory {
+public class HostStartJobFactory extends AbstractHostJobFactory {
 
     @Override
     public CommandIdentifier getCommandIdentifier() {
-        return new CommandIdentifier(CommandLevel.HOST, Command.ADD);
+        return new CommandIdentifier(CommandLevel.HOST, Command.START);
     }
 
     @Override
     public Job createJob(JobContext jobContext) {
-        return new HostAddJob(jobContext);
+        return new HostStartJob(jobContext);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostStopJobFactory.java
similarity index 86%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostStopJobFactory.java
index ecf9b911..efa6e81f 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostAddJobFactory.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/factory/host/HostStopJobFactory.java
@@ -20,8 +20,7 @@ package org.apache.bigtop.manager.server.command.factory.host;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.server.command.CommandIdentifier;
-import 
org.apache.bigtop.manager.server.command.factory.cluster.AbstractClusterJobFactory;
-import org.apache.bigtop.manager.server.command.job.HostAddJob;
+import org.apache.bigtop.manager.server.command.job.HostStopJob;
 import org.apache.bigtop.manager.server.command.job.Job;
 import org.apache.bigtop.manager.server.command.job.JobContext;
 import org.apache.bigtop.manager.server.enums.CommandLevel;
@@ -35,15 +34,15 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class HostAddJobFactory extends AbstractClusterJobFactory {
+public class HostStopJobFactory extends AbstractHostJobFactory {
 
     @Override
     public CommandIdentifier getCommandIdentifier() {
-        return new CommandIdentifier(CommandLevel.HOST, Command.ADD);
+        return new CommandIdentifier(CommandLevel.HOST, Command.STOP);
     }
 
     @Override
     public Job createJob(JobContext jobContext) {
-        return new HostAddJob(jobContext);
+        return new HostStopJob(jobContext);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractHostJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractHostJob.java
new file mode 100644
index 00000000..952f6daa
--- /dev/null
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractHostJob.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.server.command.job;
+
+import org.apache.bigtop.manager.common.enums.Command;
+import org.apache.bigtop.manager.dao.po.ComponentPO;
+import org.apache.bigtop.manager.dao.query.ComponentQuery;
+import org.apache.bigtop.manager.dao.repository.ComponentDao;
+import org.apache.bigtop.manager.server.command.stage.ComponentStartStage;
+import org.apache.bigtop.manager.server.command.stage.ComponentStopStage;
+import org.apache.bigtop.manager.server.command.stage.StageContext;
+import org.apache.bigtop.manager.server.holder.SpringContextHolder;
+import org.apache.bigtop.manager.server.model.dto.ComponentDTO;
+import org.apache.bigtop.manager.server.model.dto.ServiceDTO;
+import org.apache.bigtop.manager.server.utils.StackDAGUtils;
+import org.apache.bigtop.manager.server.utils.StackUtils;
+
+import org.apache.commons.collections4.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class AbstractHostJob extends AbstractJob {
+
+    protected ComponentDao componentDao;
+
+    public AbstractHostJob(JobContext jobContext) {
+        super(jobContext);
+    }
+
+    @Override
+    protected void injectBeans() {
+        super.injectBeans();
+
+        this.componentDao = SpringContextHolder.getBean(ComponentDao.class);
+    }
+
+    @Override
+    protected void beforeCreateStages() {
+        super.beforeCreateStages();
+    }
+
+    protected StageContext createStageContext(String componentName, 
List<String> hostnames) {
+        StageContext stageContext = 
StageContext.fromCommandDTO(jobContext.getCommandDTO());
+
+        ServiceDTO serviceDTO = 
StackUtils.getServiceDTOByComponentName(componentName);
+        ComponentDTO componentDTO = StackUtils.getComponentDTO(componentName);
+
+        stageContext.setHostnames(hostnames);
+        stageContext.setServiceDTO(serviceDTO);
+        stageContext.setComponentDTO(componentDTO);
+
+        return stageContext;
+    }
+
+    protected void createStartStages() {
+        List<ComponentPO> componentPOList = getComponentPOList();
+        List<String> todoList = 
StackDAGUtils.getTodoList(getComponentNames(componentPOList), Command.START);
+
+        for (String componentCommand : todoList) {
+            String[] split = componentCommand.split("-");
+            String componentName = split[0];
+
+            if (StackUtils.isClientComponent(componentName)) {
+                continue;
+            }
+
+            List<String> hostnames = getHostnames();
+            if (CollectionUtils.isEmpty(hostnames)) {
+                continue;
+            }
+
+            StageContext stageContext = createStageContext(componentName, 
hostnames);
+            stages.add(new ComponentStartStage(stageContext));
+        }
+    }
+
+    protected void createStopStages() {
+        List<ComponentPO> componentPOList = getComponentPOList();
+        List<String> todoList = 
StackDAGUtils.getTodoList(getComponentNames(componentPOList), Command.STOP);
+
+        for (String componentCommand : todoList) {
+            String[] split = componentCommand.split("-");
+            String componentName = split[0];
+
+            if (StackUtils.isClientComponent(componentName)) {
+                continue;
+            }
+
+            List<String> hostnames = getHostnames();
+            if (CollectionUtils.isEmpty(hostnames)) {
+                continue;
+            }
+
+            StageContext stageContext = createStageContext(componentName, 
hostnames);
+            stages.add(new ComponentStopStage(stageContext));
+        }
+    }
+
+    private List<ComponentPO> getComponentPOList() {
+        ComponentQuery query = ComponentQuery.builder()
+                .clusterId(clusterPO.getId())
+                .hostnames(getHostnames())
+                .build();
+        return componentDao.findByQuery(query);
+    }
+
+    private List<String> getComponentNames(List<ComponentPO> componentPOList) {
+        if (componentPOList == null) {
+            return new ArrayList<>();
+        } else {
+            return 
componentPOList.stream().map(ComponentPO::getName).distinct().toList();
+        }
+    }
+
+    private List<String> getHostnames() {
+        return jobContext.getCommandDTO().getHostCommands().stream()
+                .flatMap(hostCommandDTO -> 
hostCommandDTO.getHostnames().stream())
+                .toList();
+    }
+}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostRestartJob.java
similarity index 64%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostRestartJob.java
index 5fda2fba..926b9d53 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostRestartJob.java
@@ -16,30 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.query;
+package org.apache.bigtop.manager.server.command.job;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+public class HostRestartJob extends AbstractHostJob {
 
-import java.util.List;
+    public HostRestartJob(JobContext jobContext) {
+        super(jobContext);
+    }
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class ComponentQuery {
+    @Override
+    protected void createStages() {
+        super.createStopStages();
 
-    private String name;
+        super.createStartStages();
+    }
 
-    private Long clusterId;
-
-    private Long hostId;
-
-    private String hostname;
-
-    private Long serviceId;
-
-    private List<String> serviceNames;
+    @Override
+    public String getName() {
+        return "Restart host";
+    }
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostStartJob.java
similarity index 64%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostStartJob.java
index 5fda2fba..b49d4d2a 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostStartJob.java
@@ -16,30 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.query;
+package org.apache.bigtop.manager.server.command.job;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+public class HostStartJob extends AbstractHostJob {
 
-import java.util.List;
+    public HostStartJob(JobContext jobContext) {
+        super(jobContext);
+    }
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class ComponentQuery {
+    @Override
+    protected void createStages() {
+        super.createStartStages();
+    }
 
-    private String name;
-
-    private Long clusterId;
-
-    private Long hostId;
-
-    private String hostname;
-
-    private Long serviceId;
-
-    private List<String> serviceNames;
+    @Override
+    public String getName() {
+        return "Start host";
+    }
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostStopJob.java
similarity index 64%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostStopJob.java
index 5fda2fba..aa4d605e 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/query/ComponentQuery.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostStopJob.java
@@ -16,30 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.query;
+package org.apache.bigtop.manager.server.command.job;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+public class HostStopJob extends AbstractHostJob {
 
-import java.util.List;
+    public HostStopJob(JobContext jobContext) {
+        super(jobContext);
+    }
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class ComponentQuery {
+    @Override
+    protected void createStages() {
+        super.createStopStages();
+    }
 
-    private String name;
-
-    private Long clusterId;
-
-    private Long hostId;
-
-    private String hostname;
-
-    private Long serviceId;
-
-    private List<String> serviceNames;
+    @Override
+    public String getName() {
+        return "Stop host";
+    }
 }

Reply via email to