From c20e3905abba98486c9198caad7f2f2ae9e350d0 Mon Sep 17 00:00:00 2001 From: Zhiguo Wu Date: Fri, 2 Aug 2024 17:01:44 +0800 Subject: [PATCH 1/8] refactor job factory from persist objects to domain objects --- .../executor/AbstractCommandExecutor.java | 3 - ...va => CacheFileUpdateCommandExecutor.java} | 7 +- .../executor/ComponentCommandExecutor.java | 7 +- .../apache/bigtop/manager/dao/po/TaskPO.java | 5 + .../src/main/resources/proto/command.proto | 13 +- .../server/command/job/AbstractJob.java | 141 ++++++++++ .../command/job/AbstractServiceJob.java | 234 ++++++++++++++++ .../server/command/job/ClusterCreateJob.java | 85 ++++++ .../server/command/job/HostAddJob.java | 52 ++++ .../manager/server/command/job/Job.java | 44 +++ .../command/job/ServiceConfigureJob.java | 20 ++ .../server/command/job/ServiceInstallJob.java | 165 +++++++++++ .../server/command/job/ServiceRestartJob.java | 22 ++ .../server/command/job/ServiceStartJob.java | 20 ++ .../server/command/job/ServiceStopJob.java | 20 ++ .../job/factory/AbstractJobFactory.java | 9 +- .../command/job/factory/JobFactory.java | 5 +- .../cluster/ClusterCreateJobFactory.java | 15 +- .../component/ComponentInstallJobFactory.java | 7 +- .../component/ComponentRestartJobFactory.java | 7 +- .../component/ComponentStartJobFactory.java | 7 +- .../component/ComponentStopJobFactory.java | 7 +- .../job/factory/host/HostAddJobFactory.java | 15 +- .../service/ServiceConfigureJobFactory.java | 15 +- .../service/ServiceInstallJobFactory.java | 11 +- .../service/ServiceRestartJobFactory.java | 15 +- .../service/ServiceStartJobFactory.java | 15 +- .../service/ServiceStopJobFactory.java | 15 +- .../cluster/ClusterCreateJobRunner.java | 10 +- .../component/ComponentInstallJobRunner.java | 7 +- .../component/ComponentRestartJobRunner.java | 7 +- .../component/ComponentStartJobRunner.java | 7 +- .../component/ComponentStopJobRunner.java | 7 +- .../job/runner/host/HostAddJobRunner.java | 9 +- .../service/ServiceConfigureJobRunner.java | 7 +- .../service/ServiceInstallJobRunner.java | 9 +- .../service/ServiceRestartJobRunner.java | 7 +- .../runner/service/ServiceStartJobRunner.java | 7 +- .../runner/service/ServiceStopJobRunner.java | 7 +- .../scheduler/DefaultJobScheduler.java | 9 +- .../command/scheduler/JobScheduler.java | 6 +- .../command/stage/AbstractComponentStage.java | 69 +++++ .../server/command/stage/AbstractStage.java | 122 +++++++++ .../command/stage/CacheFileUpdateStage.java | 75 +++++ .../command/stage/ComponentCheckStage.java | 23 ++ .../command/stage/ComponentInstallStage.java | 23 ++ .../command/stage/ComponentStartStage.java | 23 ++ .../command/stage/ComponentStopStage.java | 23 ++ .../server/command/stage/HostCheckStage.java | 59 ++++ .../manager/server/command/stage/Stage.java | 26 ++ .../command/stage/factory/StageContext.java | 5 +- .../component/ComponentCheckStageFactory.java | 7 +- .../ComponentInstallStageFactory.java | 7 +- .../component/ComponentStartStageFactory.java | 7 +- .../component/ComponentStopStageFactory.java | 7 +- .../config/CacheDistributeStageFactory.java | 9 +- .../factory/host/HostCheckStageFactory.java | 9 +- .../service/ServiceConfigureStageFactory.java | 7 +- .../stage/runner/AbstractStageRunner.java | 14 +- .../component/ComponentCheckStageRunner.java | 8 +- .../ComponentInstallStageRunner.java | 11 +- .../component/ComponentStartStageRunner.java | 11 +- .../component/ComponentStopStageRunner.java | 11 +- .../config/CacheDistributeStageRunner.java | 42 ++- .../runner/host/HostCheckStageRunner.java | 8 +- .../service/ServiceConfigureStageRunner.java | 4 +- .../command/task/AbstractComponentTask.java | 109 ++++++++ .../server/command/task/AbstractTask.java | 110 ++++++++ .../command/task/CacheFileUpdateTask.java | 257 ++++++++++++++++++ .../command/task/ComponentCheckTask.java | 20 ++ .../command/task/ComponentInstallTask.java | 36 +++ .../command/task/ComponentStartTask.java | 36 +++ .../command/task/ComponentStopTask.java | 36 +++ .../server/command/task/HostCheckTask.java | 43 +++ .../manager/server/command/task/Task.java | 20 ++ .../server/command/task/TaskContext.java | 37 +++ .../server/holder/SpringContextHolder.java | 4 + .../model/converter/ClusterConverter.java | 2 + .../scheduler/ComponentStatusScheduler.java | 9 +- .../service/impl/ClusterServiceImpl.java | 8 +- .../service/impl/CommandServiceImpl.java | 66 ++++- .../service/impl/ConfigServiceImpl.java | 22 +- .../server/service/impl/JobServiceImpl.java | 50 ++-- .../service/impl/ServiceServiceImpl.java | 9 +- .../main/resources/ddl/MySQL-DDL-CREATE.sql | 1 + 85 files changed, 2299 insertions(+), 266 deletions(-) rename bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/{CacheDistributeCommandExecutor.java => CacheFileUpdateCommandExecutor.java} (95%) create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostAddJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceConfigureJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceRestartJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStartJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStopJob.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/CacheFileUpdateStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentInstallStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentCheckTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/HostCheckTask.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java create mode 100644 bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java diff --git a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/AbstractCommandExecutor.java b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/AbstractCommandExecutor.java index ccbd2a99..a295d21f 100644 --- a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/AbstractCommandExecutor.java +++ b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/AbstractCommandExecutor.java @@ -52,11 +52,8 @@ public CommandReply execute(CommandRequest request) { log.error("Run command failed, {}", request, e); } - commandReplyBuilder.setType(request.getType()); commandReplyBuilder.setHostname(request.getHostname()); commandReplyBuilder.setTaskId(request.getTaskId()); - commandReplyBuilder.setStageId(request.getStageId()); - commandReplyBuilder.setJobId(request.getJobId()); return commandReplyBuilder.build(); } diff --git a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/CacheDistributeCommandExecutor.java b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/CacheFileUpdateCommandExecutor.java similarity index 95% rename from bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/CacheDistributeCommandExecutor.java rename to bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/CacheFileUpdateCommandExecutor.java index 0098fdd4..13fbed71 100644 --- a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/CacheDistributeCommandExecutor.java +++ b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/CacheFileUpdateCommandExecutor.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; @@ -41,13 +42,13 @@ import static org.apache.bigtop.manager.common.constants.CacheFiles.USERS_INFO; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class CacheDistributeCommandExecutor extends AbstractCommandExecutor { +public class CacheFileUpdateCommandExecutor extends AbstractCommandExecutor { @Override public CommandType getCommandType() { - return CommandType.CACHE_DISTRIBUTE; + return CommandType.UPDATE_CACHE_FILES; } @Override diff --git a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/ComponentCommandExecutor.java b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/ComponentCommandExecutor.java index 7df2bd35..f0055139 100644 --- a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/ComponentCommandExecutor.java +++ b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/executor/ComponentCommandExecutor.java @@ -18,19 +18,18 @@ */ package org.apache.bigtop.manager.agent.executor; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload; import org.apache.bigtop.manager.common.shell.ShellResult; import org.apache.bigtop.manager.common.utils.JsonUtils; import org.apache.bigtop.manager.grpc.generated.CommandType; import org.apache.bigtop.manager.stack.core.executor.StackExecutor; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentCommandExecutor extends AbstractCommandExecutor { diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java index 26f44e75..9737f330 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java @@ -61,6 +61,11 @@ public class TaskPO extends BasePO { @Column(name = "name") private String name; + @Lob + @Basic(fetch = FetchType.LAZY) + @Column(name = "context", length = 16777216) + private String context; + @Column(name = "message_id") private String messageId; diff --git a/bigtop-manager-grpc/src/main/resources/proto/command.proto b/bigtop-manager-grpc/src/main/resources/proto/command.proto index e2c09a43..e008c6b0 100644 --- a/bigtop-manager-grpc/src/main/resources/proto/command.proto +++ b/bigtop-manager-grpc/src/main/resources/proto/command.proto @@ -29,24 +29,19 @@ service CommandService { enum CommandType { COMPONENT = 0; HOST_CHECK = 1; - CACHE_DISTRIBUTE = 2; + UPDATE_CACHE_FILES = 2; } message CommandRequest { string payload = 1; string hostname = 2; - int64 job_id = 3; - int64 stage_id = 4; - int64 task_id = 5; - CommandType type = 6; + int64 task_id = 3; + CommandType type = 4; } message CommandReply { int32 code = 1; string result = 2; string hostname = 3; - int64 job_id = 4; - int64 stage_id = 5; - int64 task_id = 6; - CommandType type = 7; + int64 task_id = 4; } \ No newline at end of file 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 new file mode 100644 index 00000000..e34c1876 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java @@ -0,0 +1,141 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.dao.po.ClusterPO; +import org.apache.bigtop.manager.dao.po.JobPO; +import org.apache.bigtop.manager.dao.po.StagePO; +import org.apache.bigtop.manager.dao.po.TaskPO; +import org.apache.bigtop.manager.dao.repository.ClusterRepository; +import org.apache.bigtop.manager.dao.repository.JobRepository; +import org.apache.bigtop.manager.dao.repository.StageRepository; +import org.apache.bigtop.manager.dao.repository.TaskRepository; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; +import org.apache.bigtop.manager.server.command.stage.Stage; +import org.apache.bigtop.manager.server.command.task.Task; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +public abstract class AbstractJob implements Job { + + protected ClusterRepository clusterRepository; + protected JobRepository jobRepository; + protected StageRepository stageRepository; + protected TaskRepository taskRepository; + + protected JobContext jobContext; + protected List stages; + + protected ClusterPO clusterPO; + protected JobPO jobPO; + + public AbstractJob(JobContext jobContext) { + this.jobContext = jobContext; + this.stages = new ArrayList<>(); + + injectBeans(); + + beforeCreateStages(); + + createStages(); + } + + protected void injectBeans() { + this.clusterRepository = SpringContextHolder.getBean(ClusterRepository.class); + this.jobRepository = SpringContextHolder.getBean(JobRepository.class); + this.stageRepository = SpringContextHolder.getBean(StageRepository.class); + this.taskRepository = SpringContextHolder.getBean(TaskRepository.class); + } + + protected void beforeCreateStages() { + Long clusterId = jobContext.getCommandDTO().getClusterId(); + this.clusterPO = clusterId == null ? new ClusterPO() : clusterRepository.getReferenceById(clusterId); + } + + protected abstract void createStages(); + + @Override + public void beforeRun() { + jobPO.setState(JobState.PROCESSING); + jobRepository.save(jobPO); + } + + @Override + public void run() { + beforeRun(); + + boolean success = true; + LinkedBlockingQueue queue = new LinkedBlockingQueue<>(stages); + while (!queue.isEmpty()) { + Stage stage = queue.poll(); + Boolean stageSuccess = stage.run(); + + if (!stageSuccess) { + success = false; + break; + } + } + + if (success) { + onSuccess(); + } else { + onFailure(); + } + } + + @Override + public void onSuccess() { + jobPO.setState(JobState.SUCCESSFUL); + jobRepository.save(jobPO); + } + + @Override + public void onFailure() { + List stagePOList = new ArrayList<>(); + List taskPOList = new ArrayList<>(); + + jobPO.setState(JobState.FAILED); + + for (Stage stage : getStages()) { + StagePO stagePO = stage.toStagePO(); + if (stagePO.getState() == JobState.PENDING) { + stagePO.setState(JobState.CANCELED); + stagePOList.add(stagePO); + + for (Task task : stage.getTasks()) { + TaskPO taskPO = task.toTaskPO(); + taskPO.setState(JobState.CANCELED); + taskPOList.add(taskPO); + } + } + } + + taskRepository.saveAll(taskPOList); + stageRepository.saveAll(stagePOList); + jobRepository.save(jobPO); + } + + @Override + public JobContext getJobContext() { + return jobContext; + } + + @Override + public List getStages() { + return stages; + } + + @Override + public JobPO toJobPO() { + if (jobPO == null) { + jobPO = new JobPO(); + jobPO.setName(getName()); + jobPO.setContext(JsonUtils.writeAsString(jobContext)); + } + + return jobPO; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java new file mode 100644 index 00000000..1a7f81d2 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java @@ -0,0 +1,234 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.common.constants.ComponentCategories; +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.dao.po.ComponentPO; +import org.apache.bigtop.manager.dao.po.HostComponentPO; +import org.apache.bigtop.manager.dao.po.HostPO; +import org.apache.bigtop.manager.dao.repository.ComponentRepository; +import org.apache.bigtop.manager.dao.repository.HostComponentRepository; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; +import org.apache.bigtop.manager.server.command.stage.CacheFileUpdateStage; +import org.apache.bigtop.manager.server.command.stage.ComponentCheckStage; +import org.apache.bigtop.manager.server.command.stage.ComponentInstallStage; +import org.apache.bigtop.manager.server.command.stage.ComponentStartStage; +import org.apache.bigtop.manager.server.command.stage.ComponentStopStage; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.exception.ServerException; +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.model.dto.command.ServiceCommandDTO; +import org.apache.bigtop.manager.server.stack.dag.ComponentCommandWrapper; +import org.apache.bigtop.manager.server.stack.dag.DAG; +import org.apache.bigtop.manager.server.stack.dag.DagGraphEdge; +import org.apache.bigtop.manager.server.utils.StackUtils; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractServiceJob extends AbstractJob { + + protected ComponentRepository componentRepository; + protected HostComponentRepository hostComponentRepository; + + protected String stackName; + protected String stackVersion; + protected DAG dag; + + public AbstractServiceJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.componentRepository = SpringContextHolder.getBean(ComponentRepository.class); + this.hostComponentRepository = SpringContextHolder.getBean(HostComponentRepository.class); + } + + @Override + protected void beforeCreateStages() { + super.beforeCreateStages(); + + stackName = clusterPO.getStackPO().getStackName(); + stackVersion = clusterPO.getStackPO().getStackVersion(); + dag = StackUtils.getStackDagMap().get(StackUtils.fullStackName(stackName, stackVersion)); + } + + protected StageContext createStageContext(String serviceName, String componentName, List hostnames) { + StageContext stageContext = StageContext.fromCommandDTO(jobContext.getCommandDTO()); + + ServiceDTO serviceDTO = StackUtils.getServiceDTO(stackName, stackVersion, serviceName); + ComponentDTO componentDTO = StackUtils.getComponentDTO(stackName, stackVersion, componentName); + + stageContext.setServiceDTO(serviceDTO); + stageContext.setComponentDTO(componentDTO); + stageContext.setStackName(stackName); + stageContext.setStackVersion(stackVersion); + stageContext.setHostnames(hostnames); + + return stageContext; + } + + protected List getTodoListForCommand(Command command) { + try { + List orderedList = dag.topologicalSort(); + List componentNames = getComponentNames(); + List componentCommandNames = new ArrayList<>(componentNames.stream() + .map(x -> x + "-" + command.name().toUpperCase()) + .toList()); + + orderedList.retainAll(componentCommandNames); + componentCommandNames.removeAll(orderedList); + orderedList.addAll(componentCommandNames); + + return orderedList; + } catch (Exception e) { + throw new ServerException(e); + } + } + + protected List getComponentNames() { + List serviceNames = getServiceNames(); + List componentPOList = + componentRepository.findAllByClusterPOIdAndServicePOServiceNameIn(clusterPO.getId(), serviceNames); + + return componentPOList.stream().map(ComponentPO::getComponentName).toList(); + } + + protected String findServiceNameByComponentName(String componentName) { + for (ServiceDTO serviceDTO : StackUtils.getServiceDTOList(stackName, stackVersion)) { + for (ComponentDTO componentDTO : serviceDTO.getComponents()) { + if (componentDTO.getComponentName().equals(componentName)) { + return serviceDTO.getServiceName(); + } + } + } + + return null; + } + + protected Boolean isMasterComponent(String componentName) { + ComponentDTO componentDTO = StackUtils.getComponentDTO(stackName, stackVersion, componentName); + return componentDTO.getCategory().equalsIgnoreCase(ComponentCategories.MASTER); + } + + protected Boolean isSlaveComponent(String componentName) { + ComponentDTO componentDTO = StackUtils.getComponentDTO(stackName, stackVersion, componentName); + return componentDTO.getCategory().equalsIgnoreCase(ComponentCategories.SLAVE); + } + + protected List findHostnamesByComponentName(String componentName) { + List hostComponentPOList = + hostComponentRepository.findAllByComponentPOClusterPOIdAndComponentPOComponentName( + clusterPO.getId(), componentName); + if (hostComponentPOList == null) { + return new ArrayList<>(); + } else { + return hostComponentPOList.stream() + .map(HostComponentPO::getHostPO) + .map(HostPO::getHostname) + .toList(); + } + } + + protected void createCacheStage() { + StageContext stageContext = StageContext.fromPayload(JsonUtils.writeAsString(jobContext.getCommandDTO())); + stageContext.setStackName(stackName); + stageContext.setStackVersion(stackVersion); + stages.add(new CacheFileUpdateStage(stageContext)); + } + + protected void createInstallStages() { + List todoList = getTodoListForCommand(Command.INSTALL); + + for (String componentCommand : todoList) { + String[] split = componentCommand.split("-"); + String componentName = split[0]; + String serviceName = findServiceNameByComponentName(componentName); + List hostnames = findHostnamesByComponentName(componentName); + if (CollectionUtils.isEmpty(hostnames)) { + continue; + } + + StageContext stageContext = createStageContext(serviceName, componentName, hostnames); + stages.add(new ComponentInstallStage(stageContext)); + } + } + + protected void createStartStages() { + List todoList = getTodoListForCommand(Command.START); + + for (String componentCommand : todoList) { + String[] split = componentCommand.split("-"); + String componentName = split[0]; + String serviceName = findServiceNameByComponentName(componentName); + + if (!(isMasterComponent(componentName) || isSlaveComponent(componentName))) { + continue; + } + + List hostnames = findHostnamesByComponentName(componentName); + if (CollectionUtils.isEmpty(hostnames)) { + continue; + } + + StageContext stageContext = createStageContext(serviceName, componentName, hostnames); + stages.add(new ComponentStartStage(stageContext)); + } + } + + protected void createStopStages() { + List todoList = getTodoListForCommand(Command.STOP); + + for (String componentCommand : todoList) { + String[] split = componentCommand.split("-"); + String componentName = split[0]; + String serviceName = findServiceNameByComponentName(componentName); + + if (!(isMasterComponent(componentName) || isSlaveComponent(componentName))) { + continue; + } + + List hostnames = findHostnamesByComponentName(componentName); + if (CollectionUtils.isEmpty(hostnames)) { + continue; + } + + StageContext stageContext = createStageContext(serviceName, componentName, hostnames); + stages.add(new ComponentStopStage(stageContext)); + } + } + + protected void createCheckStages() { + List todoList = getTodoListForCommand(Command.CHECK); + + for (String componentCommand : todoList) { + String[] split = componentCommand.split("-"); + String componentName = split[0]; + String serviceName = findServiceNameByComponentName(componentName); + + if (!isMasterComponent(componentName)) { + continue; + } + + List hostnames = findHostnamesByComponentName(componentName); + if (CollectionUtils.isEmpty(hostnames)) { + continue; + } + + StageContext stageContext = createStageContext(serviceName, componentName, List.of(hostnames.get(0))); + stages.add(new ComponentCheckStage(stageContext)); + } + } + + private List getServiceNames() { + return jobContext.getCommandDTO().getServiceCommands().stream() + .map(ServiceCommandDTO::getServiceName) + .toList(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java new file mode 100644 index 00000000..c0ad4a95 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java @@ -0,0 +1,85 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.po.ClusterPO; +import org.apache.bigtop.manager.dao.po.StagePO; +import org.apache.bigtop.manager.dao.po.TaskPO; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; +import org.apache.bigtop.manager.server.command.stage.CacheFileUpdateStage; +import org.apache.bigtop.manager.server.command.stage.HostCheckStage; +import org.apache.bigtop.manager.server.command.stage.Stage; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.Task; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.server.model.converter.ClusterConverter; +import org.apache.bigtop.manager.server.model.dto.ClusterDTO; +import org.apache.bigtop.manager.server.model.dto.CommandDTO; +import org.apache.bigtop.manager.server.service.ClusterService; + +public class ClusterCreateJob extends AbstractJob { + + private ClusterService clusterService; + + public ClusterCreateJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.clusterService = SpringContextHolder.getBean(ClusterService.class); + } + + @Override + protected void createStages() { + StageContext stageContext = StageContext.fromCommandDTO(jobContext.getCommandDTO()); + stages.add(new HostCheckStage(stageContext)); + stages.add(new CacheFileUpdateStage(stageContext)); + } + + @Override + public void beforeRun() { + super.beforeRun(); + + // Save cluster + CommandDTO commandDTO = jobContext.getCommandDTO(); + ClusterDTO clusterDTO = ClusterConverter.INSTANCE.fromCommand2DTO(commandDTO.getClusterCommand()); + clusterService.save(clusterDTO); + } + + @Override + public void onSuccess() { + super.onSuccess(); + + CommandDTO commandDTO = jobContext.getCommandDTO(); + ClusterPO clusterPO = clusterRepository + .findByClusterName(commandDTO.getClusterCommand().getClusterName()) + .orElse(new ClusterPO()); + + // Update cluster state to installed + clusterPO.setState(MaintainState.INSTALLED); + clusterRepository.save(clusterPO); + + // Link job to cluster after cluster successfully added + jobPO.setClusterPO(clusterPO); + jobRepository.save(jobPO); + + for (Stage stage : getStages()) { + StagePO stagePO = stage.toStagePO(); + stagePO.setClusterPO(clusterPO); + stageRepository.save(stagePO); + + for (Task task : stage.getTasks()) { + TaskPO taskPO = task.toTaskPO(); + taskPO.setClusterPO(clusterPO); + taskRepository.save(taskPO); + } + } + } + + @Override + public String getName() { + return "Create cluster"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostAddJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostAddJob.java new file mode 100644 index 00000000..8e848e8a --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/HostAddJob.java @@ -0,0 +1,52 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.server.command.job.factory.JobContext; +import org.apache.bigtop.manager.server.command.stage.CacheFileUpdateStage; +import org.apache.bigtop.manager.server.command.stage.HostCheckStage; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.server.model.dto.CommandDTO; +import org.apache.bigtop.manager.server.model.dto.command.HostCommandDTO; +import org.apache.bigtop.manager.server.service.HostService; + +import java.util.List; + +public class HostAddJob extends AbstractJob { + + private HostService hostService; + + public HostAddJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.hostService = SpringContextHolder.getBean(HostService.class); + } + + @Override + protected void createStages() { + StageContext stageContext = StageContext.fromCommandDTO(jobContext.getCommandDTO()); + stages.add(new HostCheckStage(stageContext)); + stages.add(new CacheFileUpdateStage(stageContext)); + } + + @Override + public void onSuccess() { + super.onSuccess(); + + CommandDTO commandDTO = jobContext.getCommandDTO(); + List hostCommands = commandDTO.getHostCommands(); + + List hostnames = + hostCommands.stream().map(HostCommandDTO::getHostname).toList(); + hostService.batchSave(commandDTO.getClusterId(), hostnames); + } + + @Override + public String getName() { + return "Add host"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java new file mode 100644 index 00000000..af372fd4 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java @@ -0,0 +1,44 @@ +/* + * 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.dao.po.JobPO; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; +import org.apache.bigtop.manager.server.command.stage.Stage; + +import java.util.List; + +public interface Job { + + String getName(); + + void beforeRun(); + + void run(); + + void onSuccess(); + + void onFailure(); + + JobContext getJobContext(); + + List getStages(); + + JobPO toJobPO(); +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceConfigureJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceConfigureJob.java new file mode 100644 index 00000000..86e863aa --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceConfigureJob.java @@ -0,0 +1,20 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.server.command.job.factory.JobContext; + +public class ServiceConfigureJob extends AbstractServiceJob { + + public ServiceConfigureJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void createStages() { + super.createCacheStage(); + } + + @Override + public String getName() { + return "Configure services"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java new file mode 100644 index 00000000..4081e4b3 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java @@ -0,0 +1,165 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.po.ClusterPO; +import org.apache.bigtop.manager.dao.po.ComponentPO; +import org.apache.bigtop.manager.dao.po.HostComponentPO; +import org.apache.bigtop.manager.dao.po.HostPO; +import org.apache.bigtop.manager.dao.po.ServicePO; +import org.apache.bigtop.manager.dao.repository.HostRepository; +import org.apache.bigtop.manager.dao.repository.ServiceRepository; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.server.model.converter.ComponentConverter; +import org.apache.bigtop.manager.server.model.converter.ServiceConverter; +import org.apache.bigtop.manager.server.model.dto.CommandDTO; +import org.apache.bigtop.manager.server.model.dto.ComponentDTO; +import org.apache.bigtop.manager.server.model.dto.ComponentHostDTO; +import org.apache.bigtop.manager.server.model.dto.ServiceDTO; +import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; +import org.apache.bigtop.manager.server.service.ConfigService; +import org.apache.bigtop.manager.server.utils.StackUtils; + +import java.util.ArrayList; +import java.util.List; + +public class ServiceInstallJob extends AbstractServiceJob { + + private ConfigService configService; + private ServiceRepository serviceRepository; + private HostRepository hostRepository; + + public ServiceInstallJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.configService = SpringContextHolder.getBean(ConfigService.class); + this.serviceRepository = SpringContextHolder.getBean(ServiceRepository.class); + this.hostRepository = SpringContextHolder.getBean(HostRepository.class); + } + + @Override + protected void createStages() { + // Install components + super.createInstallStages(); + + // Distribute caches after installed + super.createCacheStage(); + + // Start all master components + super.createStartStages(); + + // Check all master components after started + super.createCheckStages(); + } + + @Override + protected List getComponentNames() { + List componentNames = new ArrayList<>(); + for (ServiceCommandDTO serviceCommand : jobContext.getCommandDTO().getServiceCommands()) { + List componentHosts = serviceCommand.getComponentHosts(); + for (ComponentHostDTO componentHost : componentHosts) { + String componentName = componentHost.getComponentName(); + componentNames.add(componentName); + } + } + + return componentNames; + } + + @Override + protected List findHostnamesByComponentName(String componentName) { + for (ServiceCommandDTO serviceCommand : jobContext.getCommandDTO().getServiceCommands()) { + List componentHosts = serviceCommand.getComponentHosts(); + for (ComponentHostDTO componentHost : componentHosts) { + if (componentHost.getComponentName().equals(componentName)) { + List hostnames = new ArrayList<>(componentHost.getHostnames()); + List existHostnames = hostComponentRepository + .findAllByComponentPOClusterPOIdAndComponentPOComponentNameAndHostPOHostnameIn( + clusterPO.getId(), componentName, hostnames) + .stream() + .map(hostComponent -> hostComponent.getHostPO().getHostname()) + .toList(); + + hostnames.removeAll(existHostnames); + return hostnames; + } + } + } + + return new ArrayList<>(); + } + + @Override + public void beforeRun() { + super.beforeRun(); + + CommandDTO commandDTO = jobContext.getCommandDTO(); + List serviceCommands = commandDTO.getServiceCommands(); + Long clusterId = commandDTO.getClusterId(); + + // Persist service, component and hostComponent metadata to database + for (ServiceCommandDTO serviceCommand : serviceCommands) { + String serviceName = serviceCommand.getServiceName(); + ServicePO servicePO = serviceRepository.findByClusterPOIdAndServiceName(clusterId, serviceName); + upsertService(servicePO, serviceCommand); + } + } + + private void upsertService(ServicePO servicePO, ServiceCommandDTO serviceCommand) { + CommandDTO commandDTO = jobContext.getCommandDTO(); + Long clusterId = commandDTO.getClusterId(); + String serviceName = serviceCommand.getServiceName(); + ClusterPO clusterPO = clusterRepository.getReferenceById(clusterId); + + String stackName = clusterPO.getStackPO().getStackName(); + String stackVersion = clusterPO.getStackPO().getStackVersion(); + + // 1. Persist service + if (servicePO == null) { + ServiceDTO serviceDTO = StackUtils.getServiceDTO(stackName, stackVersion, serviceName); + servicePO = ServiceConverter.INSTANCE.fromDTO2PO(serviceDTO, clusterPO); + servicePO = serviceRepository.save(servicePO); + } + + // 2. Update configs + configService.upsert(clusterId, servicePO.getId(), serviceCommand.getConfigs()); + + for (ComponentHostDTO componentHostDTO : serviceCommand.getComponentHosts()) { + String componentName = componentHostDTO.getComponentName(); + + // 3. Persist component + ComponentPO componentPO = componentRepository.findByClusterPOIdAndComponentName(clusterId, componentName); + if (componentPO == null) { + ComponentDTO componentDTO = StackUtils.getComponentDTO(stackName, stackVersion, componentName); + componentPO = ComponentConverter.INSTANCE.fromDTO2PO(componentDTO, servicePO, clusterPO); + componentPO = componentRepository.save(componentPO); + } + + // 4. Persist hostComponent + for (String hostname : componentHostDTO.getHostnames()) { + HostComponentPO hostComponentPO = + hostComponentRepository.findByComponentPOComponentNameAndHostPOHostname( + componentName, hostname); + if (hostComponentPO == null) { + HostPO hostPO = hostRepository.findByHostname(hostname); + + hostComponentPO = new HostComponentPO(); + hostComponentPO.setHostPO(hostPO); + hostComponentPO.setComponentPO(componentPO); + hostComponentPO.setState(MaintainState.UNINSTALLED); + hostComponentRepository.save(hostComponentPO); + } + } + } + } + + @Override + public String getName() { + return "Install services"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceRestartJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceRestartJob.java new file mode 100644 index 00000000..6ad05b6b --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceRestartJob.java @@ -0,0 +1,22 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.server.command.job.factory.JobContext; + +public class ServiceRestartJob extends AbstractServiceJob { + + public ServiceRestartJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void createStages() { + super.createStopStages(); + + super.createStartStages(); + } + + @Override + public String getName() { + return "Restart services"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStartJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStartJob.java new file mode 100644 index 00000000..fabb2aaa --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStartJob.java @@ -0,0 +1,20 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.server.command.job.factory.JobContext; + +public class ServiceStartJob extends AbstractServiceJob { + + public ServiceStartJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void createStages() { + super.createStartStages(); + } + + @Override + public String getName() { + return "Start services"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStopJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStopJob.java new file mode 100644 index 00000000..82618644 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceStopJob.java @@ -0,0 +1,20 @@ +package org.apache.bigtop.manager.server.command.job; + +import org.apache.bigtop.manager.server.command.job.factory.JobContext; + +public class ServiceStopJob extends AbstractServiceJob { + + public ServiceStopJob(JobContext jobContext) { + super(jobContext); + } + + @Override + protected void createStages() { + super.createStopStages(); + } + + @Override + public String getName() { + return "Stop services"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/AbstractJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/AbstractJobFactory.java index dc7641f8..40b9b53e 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/AbstractJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/AbstractJobFactory.java @@ -30,6 +30,8 @@ import org.apache.bigtop.manager.dao.repository.TaskRepository; import jakarta.annotation.Resource; +import org.apache.bigtop.manager.server.command.job.Job; + import java.util.ArrayList; import java.util.List; @@ -56,7 +58,7 @@ public abstract class AbstractJobFactory implements JobFactory { protected List stagePOList = new ArrayList<>(); @Override - public JobPO createJob(JobContext jobContext) { + public JobPO createJobOld(JobContext jobContext) { this.jobContext = jobContext; // Create and init job @@ -105,4 +107,9 @@ protected void saveJob() { } } } + + @Override + public Job createJob(JobContext jobContext) { + return null; + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactory.java index 89e3953d..bb3aa9a5 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactory.java @@ -20,10 +20,13 @@ import org.apache.bigtop.manager.dao.po.JobPO; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; public interface JobFactory { CommandIdentifier getCommandIdentifier(); - JobPO createJob(JobContext jobContext); + JobPO createJobOld(JobContext jobContext); + + Job createJob(JobContext jobContext); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/ClusterCreateJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/ClusterCreateJobFactory.java index 1eaf5f01..37c4b19d 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/ClusterCreateJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/ClusterCreateJobFactory.java @@ -18,21 +18,23 @@ */ package org.apache.bigtop.manager.server.command.job.factory.cluster; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.utils.JsonUtils; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.ClusterCreateJob; +import org.apache.bigtop.manager.server.command.job.Job; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; import org.apache.bigtop.manager.server.command.stage.factory.StageContext; import org.apache.bigtop.manager.server.command.stage.factory.StageFactories; import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ClusterCreateJobFactory extends AbstractClusterJobFactory { @@ -48,4 +50,9 @@ public void createStagesAndTasks() { stagePOList.add( StageFactories.getStageFactory(StageType.CACHE_DISTRIBUTE).createStage(stageContext)); } + + @Override + public Job createJob(JobContext jobContext) { + return new ClusterCreateJob(jobContext); + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentInstallJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentInstallJobFactory.java index d1ad8bed..967b90b3 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentInstallJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentInstallJobFactory.java @@ -18,17 +18,16 @@ */ package org.apache.bigtop.manager.server.command.job.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentInstallJobFactory extends AbstractComponentJobFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentRestartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentRestartJobFactory.java index f6352b22..3bad1efb 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentRestartJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentRestartJobFactory.java @@ -18,17 +18,16 @@ */ package org.apache.bigtop.manager.server.command.job.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentRestartJobFactory extends AbstractComponentJobFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStartJobFactory.java index 16ac6bf5..f6195b15 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStartJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStartJobFactory.java @@ -18,17 +18,16 @@ */ package org.apache.bigtop.manager.server.command.job.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStartJobFactory extends AbstractComponentJobFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStopJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStopJobFactory.java index 739a9e07..ced03b8d 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStopJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStopJobFactory.java @@ -18,17 +18,16 @@ */ package org.apache.bigtop.manager.server.command.job.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStopJobFactory extends AbstractComponentJobFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/HostAddJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/HostAddJobFactory.java index 99645e54..5986d096 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/HostAddJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/HostAddJobFactory.java @@ -18,21 +18,23 @@ */ package org.apache.bigtop.manager.server.command.job.factory.host; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.utils.JsonUtils; import org.apache.bigtop.manager.server.command.CommandIdentifier; +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.factory.JobContext; import org.apache.bigtop.manager.server.command.stage.factory.StageContext; import org.apache.bigtop.manager.server.command.stage.factory.StageFactories; import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class HostAddJobFactory extends AbstractHostJobFactory { @@ -47,4 +49,9 @@ public void createStagesAndTasks() { stagePOList.add( StageFactories.getStageFactory(StageType.CACHE_DISTRIBUTE).createStage(stageContext)); } + + @Override + public Job createJob(JobContext jobContext) { + return new HostAddJob(jobContext); + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceConfigureJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceConfigureJobFactory.java index c07382cc..21f11718 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceConfigureJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceConfigureJobFactory.java @@ -18,17 +18,19 @@ */ package org.apache.bigtop.manager.server.command.job.factory.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; +import org.apache.bigtop.manager.server.command.job.ServiceConfigureJob; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceConfigureJobFactory extends AbstractServiceJobFactory { @@ -43,4 +45,9 @@ public void createStagesAndTasks() { super.createCacheStage(); } + + @Override + public Job createJob(JobContext jobContext) { + return new ServiceConfigureJob(jobContext); + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceInstallJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceInstallJobFactory.java index 31d28777..643f74a2 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceInstallJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceInstallJobFactory.java @@ -20,12 +20,16 @@ import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; +import org.apache.bigtop.manager.server.command.job.ServiceInstallJob; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; import org.apache.bigtop.manager.server.enums.CommandLevel; import org.apache.bigtop.manager.server.model.dto.ComponentHostDTO; import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; @@ -33,7 +37,7 @@ import java.util.List; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceInstallJobFactory extends AbstractServiceJobFactory { @@ -42,6 +46,11 @@ public CommandIdentifier getCommandIdentifier() { return new CommandIdentifier(CommandLevel.SERVICE, Command.INSTALL); } + @Override + public Job createJob(JobContext jobContext) { + return new ServiceInstallJob(jobContext); + } + /** * create job and persist it to database */ diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceRestartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceRestartJobFactory.java index 95861444..1e2dd916 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceRestartJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceRestartJobFactory.java @@ -18,17 +18,19 @@ */ package org.apache.bigtop.manager.server.command.job.factory.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; +import org.apache.bigtop.manager.server.command.job.ServiceRestartJob; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceRestartJobFactory extends AbstractServiceJobFactory { @@ -45,4 +47,9 @@ protected void createStagesAndTasks() { super.createStartStages(); } + + @Override + public Job createJob(JobContext jobContext) { + return new ServiceRestartJob(jobContext); + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStartJobFactory.java index 961bccf2..54e0dad9 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStartJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStartJobFactory.java @@ -18,17 +18,19 @@ */ package org.apache.bigtop.manager.server.command.job.factory.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; +import org.apache.bigtop.manager.server.command.job.ServiceStartJob; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceStartJobFactory extends AbstractServiceJobFactory { @@ -43,4 +45,9 @@ protected void createStagesAndTasks() { super.createStartStages(); } + + @Override + public Job createJob(JobContext jobContext) { + return new ServiceStartJob(jobContext); + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStopJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStopJobFactory.java index c6605c21..b59d142e 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStopJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStopJobFactory.java @@ -18,17 +18,19 @@ */ package org.apache.bigtop.manager.server.command.job.factory.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; +import org.apache.bigtop.manager.server.command.job.ServiceStopJob; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceStopJobFactory extends AbstractServiceJobFactory { @@ -43,4 +45,9 @@ protected void createStagesAndTasks() { super.createStopStages(); } + + @Override + public Job createJob(JobContext jobContext) { + return new ServiceStopJob(jobContext); + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/cluster/ClusterCreateJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/cluster/ClusterCreateJobRunner.java index 09a8d71c..bb6d04c8 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/cluster/ClusterCreateJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/cluster/ClusterCreateJobRunner.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.command.job.runner.cluster; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.ClusterPO; @@ -34,16 +36,12 @@ import org.apache.bigtop.manager.server.model.dto.ClusterDTO; import org.apache.bigtop.manager.server.model.dto.CommandDTO; import org.apache.bigtop.manager.server.service.ClusterService; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ClusterCreateJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentInstallJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentInstallJobRunner.java index ecc07faf..ea6f4a07 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentInstallJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentInstallJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentInstallJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentRestartJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentRestartJobRunner.java index f8b1aa56..8d6cbecb 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentRestartJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentRestartJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentRestartJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStartJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStartJobRunner.java index b0f4c661..fd6726e5 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStartJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStartJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStartJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStopJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStopJobRunner.java index 7e7c7e49..f2418511 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStopJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStopJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStopJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/host/HostAddJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/host/HostAddJobRunner.java index 95e5dbae..27254f85 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/host/HostAddJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/host/HostAddJobRunner.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.command.job.runner.host; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; @@ -25,17 +27,14 @@ import org.apache.bigtop.manager.server.model.dto.CommandDTO; import org.apache.bigtop.manager.server.model.dto.command.HostCommandDTO; import org.apache.bigtop.manager.server.service.HostService; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.List; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class HostAddJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceConfigureJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceConfigureJobRunner.java index 0998b363..c9891135 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceConfigureJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceConfigureJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceConfigureJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceInstallJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceInstallJobRunner.java index e54c79f0..3f780173 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceInstallJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceInstallJobRunner.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.command.job.runner.service; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.ClusterPO; @@ -42,17 +44,14 @@ import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; import org.apache.bigtop.manager.server.service.ConfigService; import org.apache.bigtop.manager.server.utils.StackUtils; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.List; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceInstallJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceRestartJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceRestartJobRunner.java index 1c1d0d48..294b6353 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceRestartJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceRestartJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceRestartJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStartJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStartJobRunner.java index 723bdec9..cff7b863 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStartJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStartJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceStartJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStopJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStopJobRunner.java index ca699409..e07942f1 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStopJobRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStopJobRunner.java @@ -18,18 +18,17 @@ */ package org.apache.bigtop.manager.server.command.job.runner.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; import org.apache.bigtop.manager.server.enums.CommandLevel; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceStopJobRunner extends AbstractJobRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/DefaultJobScheduler.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/DefaultJobScheduler.java index 54ce12ed..ef7b782c 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/DefaultJobScheduler.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/DefaultJobScheduler.java @@ -18,9 +18,7 @@ */ package org.apache.bigtop.manager.server.command.scheduler; -import org.apache.bigtop.manager.dao.po.JobPO; -import org.apache.bigtop.manager.server.command.job.runner.JobRunner; -import org.apache.bigtop.manager.server.command.job.runner.JobRunners; +import org.apache.bigtop.manager.server.command.job.Job; import org.apache.bigtop.manager.server.holder.SessionUserHolder; import org.springframework.stereotype.Component; @@ -43,13 +41,12 @@ public class DefaultJobScheduler implements JobScheduler { private volatile boolean running = true; @Override - public void submit(JobPO jobPO) { + public void submit(Job job) { Long userId = SessionUserHolder.getUserId(); queue.offer(() -> { try { SessionUserHolder.setUserId(userId); - JobRunner runner = JobRunners.getJobRunner(jobPO); - runner.run(); + job.run(); } finally { SessionUserHolder.clear(); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/JobScheduler.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/JobScheduler.java index 4a808e46..c6248ed2 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/JobScheduler.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/scheduler/JobScheduler.java @@ -18,7 +18,7 @@ */ package org.apache.bigtop.manager.server.command.scheduler; -import org.apache.bigtop.manager.dao.po.JobPO; +import org.apache.bigtop.manager.server.command.job.Job; /** * JobScheduler interface for job management. @@ -28,9 +28,9 @@ public interface JobScheduler { /** * Submits a job to the job scheduler. - * @param jobPO The job to be submitted. + * @param job The job to be submitted. */ - void submit(JobPO jobPO); + void submit(Job job); /** * Starts the job scheduler. 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 new file mode 100644 index 00000000..44aa4170 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java @@ -0,0 +1,69 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.dao.po.ClusterPO; +import org.apache.bigtop.manager.dao.repository.ClusterRepository; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.TaskContext; +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 java.util.HashMap; +import java.util.Map; + +public abstract class AbstractComponentStage extends AbstractStage { + + private ClusterRepository clusterRepository; + + private ClusterPO clusterPO; + + public AbstractComponentStage(StageContext stageContext) { + super(stageContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.clusterRepository = SpringContextHolder.getBean(ClusterRepository.class); + } + + @Override + protected void beforeCreateTasks() { + this.clusterPO = clusterRepository.getReferenceById(stageContext.getClusterId()); + } + + @Override + protected String getServiceName() { + return stageContext.getServiceDTO().getServiceName(); + } + + @Override + protected String getComponentName() { + return stageContext.getComponentDTO().getComponentName(); + } + + protected TaskContext createTaskContext(String hostname) { + ServiceDTO serviceDTO = stageContext.getServiceDTO(); + ComponentDTO componentDTO = stageContext.getComponentDTO(); + + TaskContext taskContext = new TaskContext(); + taskContext.setHostname(hostname); + taskContext.setClusterId(clusterPO.getId()); + taskContext.setClusterName(clusterPO.getClusterName()); + taskContext.setServiceName(serviceDTO.getServiceName()); + taskContext.setStackName(stageContext.getStackName()); + taskContext.setStackVersion(stageContext.getStackVersion()); + taskContext.setComponentName(componentDTO.getComponentName()); + taskContext.setServiceUser(serviceDTO.getServiceUser()); + taskContext.setServiceGroup(serviceDTO.getServiceGroup()); + taskContext.setRoot(clusterPO.getRoot()); + + Map properties = new HashMap<>(); + properties.put("customCommands", componentDTO.getCustomCommands()); + properties.put("osSpecifics", serviceDTO.getOsSpecifics()); + properties.put("commandScript", componentDTO.getCommandScript()); + taskContext.setProperties(properties); + return taskContext; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java new file mode 100644 index 00000000..37e99cab --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java @@ -0,0 +1,122 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.dao.po.StagePO; +import org.apache.bigtop.manager.dao.repository.StageRepository; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.Task; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public abstract class AbstractStage implements Stage { + + protected StageRepository stageRepository; + + protected StageContext stageContext; + protected List tasks; + + protected StagePO stagePO; + + public AbstractStage(StageContext stageContext) { + this.stageContext = stageContext; + this.tasks = new ArrayList<>(); + + injectBeans(); + + beforeCreateTasks(); + + for (String hostname : stageContext.getHostnames()) { + tasks.add(createTask(hostname)); + } + } + + protected void injectBeans() { + this.stageRepository = SpringContextHolder.getBean(StageRepository.class); + } + + protected abstract void beforeCreateTasks(); + + protected abstract Task createTask(String hostname); + + protected String getServiceName() { + return "cluster"; + } + + protected String getComponentName() { + return "agent"; + } + + @Override + public void beforeRun() { + stagePO.setState(JobState.PROCESSING); + stageRepository.save(stagePO); + } + + @Override + public Boolean run() { + beforeRun(); + + List> futures = new ArrayList<>(); + for (Task task : tasks) { + futures.add(CompletableFuture.supplyAsync(task::run)); + } + + List taskResults = futures.stream() + .map((future) -> { + try { + return future.get(); + } catch (Exception e) { + return false; + } + }) + .toList(); + + boolean allTaskSuccess = taskResults.stream().allMatch(Boolean::booleanValue); + if (allTaskSuccess) { + onSuccess(); + } else { + onFailure(); + } + + return allTaskSuccess; + } + + @Override + public void onSuccess() { + stagePO.setState(JobState.SUCCESSFUL); + stageRepository.save(stagePO); + } + + @Override + public void onFailure() { + stagePO.setState(JobState.FAILED); + stageRepository.save(stagePO); + } + + @Override + public StageContext getStageContext() { + return stageContext; + } + + @Override + public List getTasks() { + return tasks; + } + + @Override + public StagePO toStagePO() { + if (stagePO == null) { + stagePO = new StagePO(); + stagePO.setName(getName()); + stagePO.setServiceName(getServiceName()); + stagePO.setComponentName(getComponentName()); + stagePO.setContext(JsonUtils.writeAsString(stageContext)); + } + + return stagePO; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/CacheFileUpdateStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/CacheFileUpdateStage.java new file mode 100644 index 00000000..2b65eae9 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/CacheFileUpdateStage.java @@ -0,0 +1,75 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.dao.po.HostPO; +import org.apache.bigtop.manager.dao.repository.HostRepository; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.CacheFileUpdateTask; +import org.apache.bigtop.manager.server.command.task.Task; +import org.apache.bigtop.manager.server.command.task.TaskContext; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CacheFileUpdateStage extends AbstractStage { + + private HostRepository hostRepository; + + public CacheFileUpdateStage(StageContext stageContext) { + super(stageContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.hostRepository = SpringContextHolder.getBean(HostRepository.class); + } + + @Override + protected void beforeCreateTasks() { + List hostnames = new ArrayList<>(); + + if (stageContext.getClusterId() == null) { + hostnames.addAll(stageContext.getHostnames()); + } else { + hostnames.addAll(stageContext.getHostnames() == null ? List.of() : stageContext.getHostnames()); + hostnames.addAll(hostRepository.findAllByClusterPOId(stageContext.getClusterId()).stream() + .map(HostPO::getHostname) + .toList()); + } + + stageContext.setHostnames(hostnames); + } + + @Override + protected Task createTask(String hostname) { + TaskContext taskContext = new TaskContext(); + taskContext.setHostname(hostname); + taskContext.setClusterId(stageContext.getClusterId()); + taskContext.setClusterName(stageContext.getClusterName()); + taskContext.setStackName(stageContext.getStackName()); + taskContext.setStackVersion(stageContext.getStackVersion()); + taskContext.setServiceName("cluster"); + taskContext.setServiceUser("root"); + taskContext.setServiceGroup("root"); + taskContext.setComponentName("agent"); + taskContext.setCommand(Command.CUSTOM); + taskContext.setCustomCommand("update_cache_files"); + + Map properties = new HashMap<>(); + properties.put("repoInfoList", stageContext.getRepoInfoList()); + properties.put("hostnames", stageContext.getHostnames()); + taskContext.setProperties(properties); + + return new CacheFileUpdateTask(taskContext); + } + + @Override + public String getName() { + return "Update cache files"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStage.java new file mode 100644 index 00000000..d81c0da1 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentCheckStage.java @@ -0,0 +1,23 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.ComponentCheckTask; +import org.apache.bigtop.manager.server.command.task.Task; + +public class ComponentCheckStage extends AbstractComponentStage { + + public ComponentCheckStage(StageContext stageContext) { + super(stageContext); + } + + + @Override + protected Task createTask(String hostname) { + return new ComponentCheckTask(createTaskContext(hostname)); + } + + @Override + public String getName() { + return "Check " + stageContext.getComponentDTO().getDisplayName(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentInstallStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentInstallStage.java new file mode 100644 index 00000000..6760dce4 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentInstallStage.java @@ -0,0 +1,23 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.ComponentInstallTask; +import org.apache.bigtop.manager.server.command.task.Task; + +public class ComponentInstallStage extends AbstractComponentStage { + + public ComponentInstallStage(StageContext stageContext) { + super(stageContext); + } + + + @Override + protected Task createTask(String hostname) { + return new ComponentInstallTask(createTaskContext(hostname)); + } + + @Override + public String getName() { + return "Install " + stageContext.getComponentDTO().getDisplayName(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStage.java new file mode 100644 index 00000000..23f89b46 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStartStage.java @@ -0,0 +1,23 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.ComponentStartTask; +import org.apache.bigtop.manager.server.command.task.Task; + +public class ComponentStartStage extends AbstractComponentStage { + + public ComponentStartStage(StageContext stageContext) { + super(stageContext); + } + + + @Override + protected Task createTask(String hostname) { + return new ComponentStartTask(createTaskContext(hostname)); + } + + @Override + public String getName() { + return "Start " + stageContext.getComponentDTO().getDisplayName(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStage.java new file mode 100644 index 00000000..fea1d2c5 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/ComponentStopStage.java @@ -0,0 +1,23 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.ComponentStopTask; +import org.apache.bigtop.manager.server.command.task.Task; + +public class ComponentStopStage extends AbstractComponentStage { + + public ComponentStopStage(StageContext stageContext) { + super(stageContext); + } + + + @Override + protected Task createTask(String hostname) { + return new ComponentStopTask(createTaskContext(hostname)); + } + + @Override + public String getName() { + return "Stop " + stageContext.getComponentDTO().getDisplayName(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java new file mode 100644 index 00000000..cee11231 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/HostCheckStage.java @@ -0,0 +1,59 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.dao.po.ClusterPO; +import org.apache.bigtop.manager.dao.repository.ClusterRepository; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.HostCheckTask; +import org.apache.bigtop.manager.server.command.task.Task; +import org.apache.bigtop.manager.server.command.task.TaskContext; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; + +public class HostCheckStage extends AbstractStage { + + private ClusterRepository clusterRepository; + + public HostCheckStage(StageContext stageContext) { + super(stageContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.clusterRepository = SpringContextHolder.getBean(ClusterRepository.class); + } + + @Override + protected void beforeCreateTasks() { + if (stageContext.getClusterId() != null) { + ClusterPO clusterPO = clusterRepository.getReferenceById(stageContext.getClusterId()); + + stageContext.setStackName(clusterPO.getStackPO().getStackName()); + stageContext.setStackVersion(clusterPO.getStackPO().getStackVersion()); + } + } + + @Override + protected Task createTask(String hostname) { + TaskContext taskContext = new TaskContext(); + taskContext.setHostname(hostname); + taskContext.setClusterId(stageContext.getClusterId()); + taskContext.setClusterName(stageContext.getClusterName()); + taskContext.setStackName(stageContext.getStackName()); + taskContext.setStackVersion(stageContext.getStackVersion()); + taskContext.setServiceName("cluster"); + taskContext.setServiceUser("root"); + taskContext.setServiceGroup("root"); + taskContext.setComponentName("agent"); + taskContext.setCommand(Command.CUSTOM); + taskContext.setCustomCommand("check_host"); + + return new HostCheckTask(taskContext); + } + + @Override + public String getName() { + return "Check hosts"; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java new file mode 100644 index 00000000..fe1f5b98 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java @@ -0,0 +1,26 @@ +package org.apache.bigtop.manager.server.command.stage; + +import org.apache.bigtop.manager.dao.po.StagePO; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.task.Task; + +import java.util.List; + +public interface Stage { + + String getName(); + + void beforeRun(); + + Boolean run(); + + void onSuccess(); + + void onFailure(); + + StageContext getStageContext(); + + List getTasks(); + + StagePO toStagePO(); +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageContext.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageContext.java index 86240e21..042ac440 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageContext.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageContext.java @@ -52,9 +52,12 @@ public class StageContext { private List repoInfoList; public static StageContext fromPayload(String payload) { - StageContext context = new StageContext(); CommandDTO commandDTO = JsonUtils.readFromString(payload, CommandDTO.class); + return fromCommandDTO(commandDTO); + } + public static StageContext fromCommandDTO(CommandDTO commandDTO) { + StageContext context = new StageContext(); context.setClusterId(commandDTO.getClusterId()); switch (commandDTO.getCommandLevel()) { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentCheckStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentCheckStageFactory.java index 8f6c1f78..554fb27c 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentCheckStageFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentCheckStageFactory.java @@ -18,16 +18,15 @@ */ package org.apache.bigtop.manager.server.command.stage.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.stage.factory.StageType; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentCheckStageFactory extends AbstractComponentStageFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentInstallStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentInstallStageFactory.java index 1e9eabac..8cf8645c 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentInstallStageFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentInstallStageFactory.java @@ -18,16 +18,15 @@ */ package org.apache.bigtop.manager.server.command.stage.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.stage.factory.StageType; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentInstallStageFactory extends AbstractComponentStageFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStartStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStartStageFactory.java index 7604c759..bc0558e9 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStartStageFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStartStageFactory.java @@ -18,16 +18,15 @@ */ package org.apache.bigtop.manager.server.command.stage.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.stage.factory.StageType; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStartStageFactory extends AbstractComponentStageFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStopStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStopStageFactory.java index 232a3742..5a584716 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStopStageFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStopStageFactory.java @@ -18,16 +18,15 @@ */ package org.apache.bigtop.manager.server.command.stage.factory.component; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.command.stage.factory.StageType; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStopStageFactory extends AbstractComponentStageFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/config/CacheDistributeStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/config/CacheDistributeStageFactory.java index c29066ad..d6caee05 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/config/CacheDistributeStageFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/config/CacheDistributeStageFactory.java @@ -18,24 +18,23 @@ */ package org.apache.bigtop.manager.server.command.stage.factory.config; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.dao.po.HostPO; import org.apache.bigtop.manager.dao.po.TaskPO; import org.apache.bigtop.manager.dao.repository.HostRepository; import org.apache.bigtop.manager.server.command.stage.factory.AbstractStageFactory; import org.apache.bigtop.manager.server.command.stage.factory.StageType; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.List; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class CacheDistributeStageFactory extends AbstractStageFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCheckStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCheckStageFactory.java index e92b2b9b..6ecb0f63 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCheckStageFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCheckStageFactory.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.command.stage.factory.host; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.message.entity.payload.HostCheckPayload; import org.apache.bigtop.manager.common.utils.JsonUtils; @@ -29,18 +31,15 @@ import org.apache.bigtop.manager.grpc.utils.ProtobufUtil; import org.apache.bigtop.manager.server.command.stage.factory.AbstractStageFactory; import org.apache.bigtop.manager.server.command.stage.factory.StageType; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.List; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class HostCheckStageFactory extends AbstractStageFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/service/ServiceConfigureStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/service/ServiceConfigureStageFactory.java index 1da995c1..62a328be 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/service/ServiceConfigureStageFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/service/ServiceConfigureStageFactory.java @@ -18,16 +18,15 @@ */ package org.apache.bigtop.manager.server.command.stage.factory.service; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.server.command.stage.factory.AbstractStageFactory; import org.apache.bigtop.manager.server.command.stage.factory.StageType; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceConfigureStageFactory extends AbstractStageFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/AbstractStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/AbstractStageRunner.java index 59b46503..108e4c4b 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/AbstractStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/AbstractStageRunner.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.command.stage.runner; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.constants.MessageConstants; import org.apache.bigtop.manager.common.enums.JobState; import org.apache.bigtop.manager.dao.po.StagePO; @@ -31,9 +33,6 @@ import org.apache.bigtop.manager.server.command.stage.factory.StageContext; import org.apache.bigtop.manager.server.grpc.GrpcClient; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -41,16 +40,15 @@ @Slf4j public abstract class AbstractStageRunner implements StageRunner { + protected StagePO stagePO; + protected StageContext stageContext; + @Resource protected StageRepository stageRepository; @Resource protected TaskRepository taskRepository; - protected StagePO stagePO; - - protected StageContext stageContext; - @Override public void setStage(StagePO stagePO) { this.stagePO = stagePO; @@ -72,8 +70,6 @@ public void run() { CommandRequest protoRequest = ProtobufUtil.fromJson(taskPO.getContent(), CommandRequest.class); CommandRequest.Builder builder = CommandRequest.newBuilder(protoRequest); builder.setTaskId(taskPO.getId()); - builder.setStageId(stagePO.getId()); - builder.setJobId(stagePO.getJobPO().getId()); CommandRequest request = builder.build(); futures.add(CompletableFuture.supplyAsync(() -> { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentCheckStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentCheckStageRunner.java index 91db2b62..8d6a5284 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentCheckStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentCheckStageRunner.java @@ -18,16 +18,16 @@ */ package org.apache.bigtop.manager.server.command.stage.runner.component; +import lombok.experimental.SuperBuilder; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.command.stage.runner.AbstractStageRunner; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentCheckStageRunner extends AbstractStageRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentInstallStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentInstallStageRunner.java index c2a15fac..26b66730 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentInstallStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentInstallStageRunner.java @@ -18,22 +18,21 @@ */ package org.apache.bigtop.manager.server.command.stage.runner.component; +import jakarta.annotation.Resource; +import lombok.experimental.SuperBuilder; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.HostComponentPO; import org.apache.bigtop.manager.dao.po.TaskPO; import org.apache.bigtop.manager.dao.repository.HostComponentRepository; import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.command.stage.runner.AbstractStageRunner; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentInstallStageRunner extends AbstractStageRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStartStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStartStageRunner.java index b070c321..24cce266 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStartStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStartStageRunner.java @@ -18,22 +18,21 @@ */ package org.apache.bigtop.manager.server.command.stage.runner.component; +import jakarta.annotation.Resource; +import lombok.experimental.SuperBuilder; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.HostComponentPO; import org.apache.bigtop.manager.dao.po.TaskPO; import org.apache.bigtop.manager.dao.repository.HostComponentRepository; import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.command.stage.runner.AbstractStageRunner; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStartStageRunner extends AbstractStageRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStopStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStopStageRunner.java index 9ebfbf45..9ed3f4fe 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStopStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStopStageRunner.java @@ -18,22 +18,21 @@ */ package org.apache.bigtop.manager.server.command.stage.runner.component; +import jakarta.annotation.Resource; +import lombok.experimental.SuperBuilder; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.HostComponentPO; import org.apache.bigtop.manager.dao.po.TaskPO; import org.apache.bigtop.manager.dao.repository.HostComponentRepository; import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.command.stage.runner.AbstractStageRunner; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ComponentStopStageRunner extends AbstractStageRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/config/CacheDistributeStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/config/CacheDistributeStageRunner.java index a4cc566a..5be743ff 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/config/CacheDistributeStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/config/CacheDistributeStageRunner.java @@ -18,6 +18,9 @@ */ package org.apache.bigtop.manager.server.command.stage.runner.config; +import com.fasterxml.jackson.core.type.TypeReference; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.constants.Constants; import org.apache.bigtop.manager.common.message.entity.payload.CacheMessagePayload; import org.apache.bigtop.manager.common.message.entity.pojo.ClusterInfo; @@ -53,16 +56,11 @@ import org.apache.bigtop.manager.server.model.dto.StackDTO; import org.apache.bigtop.manager.server.utils.StackConfigUtils; import org.apache.bigtop.manager.server.utils.StackUtils; - import org.apache.commons.lang3.tuple.ImmutablePair; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -import com.fasterxml.jackson.core.type.TypeReference; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -74,10 +72,24 @@ import static org.apache.bigtop.manager.common.constants.Constants.ALL_HOST_KEY; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class CacheDistributeStageRunner extends AbstractStageRunner { + private ClusterInfo clusterInfo; + + private Map componentInfoMap; + + private Map> serviceConfigMap; + + private Map> hostMap; + + private List repoList; + + private Map> userMap; + + private Map settingsMap; + @Resource private ClusterRepository clusterRepository; @@ -102,20 +114,6 @@ public class CacheDistributeStageRunner extends AbstractStageRunner { @Resource private ComponentRepository componentRepository; - private ClusterInfo clusterInfo; - - private Map componentInfoMap; - - private Map> serviceConfigMap; - - private Map> hostMap; - - private List repoList; - - private Map> userMap; - - private Map settingsMap; - @Override public StageType getStageType() { return StageType.CACHE_DISTRIBUTE; @@ -270,7 +268,7 @@ private CommandRequest getMessage(String hostname) { messagePayload.setComponentInfo(componentInfoMap); CommandRequest.Builder builder = CommandRequest.newBuilder(); - builder.setType(CommandType.CACHE_DISTRIBUTE); + builder.setType(CommandType.UPDATE_CACHE_FILES); builder.setHostname(hostname); builder.setPayload(JsonUtils.writeAsString(messagePayload)); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCheckStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCheckStageRunner.java index eed2807b..cb9dbef3 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCheckStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCheckStageRunner.java @@ -18,16 +18,16 @@ */ package org.apache.bigtop.manager.server.command.stage.runner.host; +import lombok.experimental.SuperBuilder; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.command.stage.runner.AbstractStageRunner; - import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class HostCheckStageRunner extends AbstractStageRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/service/ServiceConfigureStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/service/ServiceConfigureStageRunner.java index 45bcc65c..456d2bf3 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/service/ServiceConfigureStageRunner.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/service/ServiceConfigureStageRunner.java @@ -23,11 +23,13 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import lombok.experimental.SuperBuilder; import lombok.extern.slf4j.Slf4j; @Slf4j -@org.springframework.stereotype.Component +@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceConfigureStageRunner extends AbstractStageRunner { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java new file mode 100644 index 00000000..341c5b2b --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java @@ -0,0 +1,109 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload; +import org.apache.bigtop.manager.common.message.entity.pojo.CustomCommandInfo; +import org.apache.bigtop.manager.common.message.entity.pojo.OSSpecificInfo; +import org.apache.bigtop.manager.common.message.entity.pojo.ScriptInfo; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.dao.repository.HostComponentRepository; +import org.apache.bigtop.manager.grpc.generated.CommandRequest; +import org.apache.bigtop.manager.grpc.generated.CommandType; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.server.model.dto.CustomCommandDTO; +import org.apache.bigtop.manager.server.model.dto.OSSpecificDTO; +import org.apache.bigtop.manager.server.model.dto.ScriptDTO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public abstract class AbstractComponentTask extends AbstractTask { + + protected HostComponentRepository hostComponentRepository; + + public AbstractComponentTask(TaskContext taskContext) { + super(taskContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.hostComponentRepository = SpringContextHolder.getBean(HostComponentRepository.class); + } + + @Override + @SuppressWarnings("unchecked") + protected CommandRequest getCommandRequest() { + CommandPayload commandPayload = new CommandPayload(); + commandPayload.setServiceName(taskContext.getServiceName()); + commandPayload.setCommand(Command.CHECK); + commandPayload.setServiceUser(taskContext.getServiceUser()); + commandPayload.setServiceGroup(taskContext.getServiceGroup()); + commandPayload.setStackName(taskContext.getStackName()); + commandPayload.setStackVersion(taskContext.getStackVersion()); + commandPayload.setComponentName(taskContext.getComponentName()); + commandPayload.setRoot(taskContext.getRoot()); + commandPayload.setHostname(taskContext.getHostname()); + + Map properties = taskContext.getProperties(); + + commandPayload.setCustomCommands(convertCustomCommandInfo((List) properties.get("customCommands"))); + commandPayload.setOsSpecifics(convertOSSpecificInfo((List) properties.get("osSpecifics"))); + commandPayload.setCommandScript(convertScriptInfo((ScriptDTO) properties.get("commandScript"))); + + CommandRequest.Builder builder = CommandRequest.newBuilder(); + builder.setType(CommandType.COMPONENT); + builder.setHostname(taskContext.getHostname()); + builder.setPayload(JsonUtils.writeAsString(commandPayload)); + + return builder.build(); + } + + + private ScriptInfo convertScriptInfo(ScriptDTO scriptDTO) { + if (scriptDTO == null) { + return null; + } + + ScriptInfo scriptInfo = new ScriptInfo(); + scriptInfo.setScriptId(scriptDTO.getScriptId()); + scriptInfo.setScriptType(scriptDTO.getScriptType()); + scriptInfo.setTimeout(scriptDTO.getTimeout()); + return scriptInfo; + } + + private List convertOSSpecificInfo(List osSpecificDTOs) { + if (osSpecificDTOs == null) { + return new ArrayList<>(); + } + + List osSpecificInfos = new ArrayList<>(); + for (OSSpecificDTO osSpecificDTO : osSpecificDTOs) { + OSSpecificInfo osSpecificInfo = new OSSpecificInfo(); + osSpecificInfo.setOs(osSpecificDTO.getOs()); + osSpecificInfo.setArch(osSpecificDTO.getArch()); + osSpecificInfo.setPackages(osSpecificDTO.getPackages()); + osSpecificInfos.add(osSpecificInfo); + } + + return osSpecificInfos; + } + + private List convertCustomCommandInfo(List customCommandDTOs) { + if (customCommandDTOs == null) { + return new ArrayList<>(); + } + + List customCommandInfos = new ArrayList<>(); + for (CustomCommandDTO customCommandDTO : customCommandDTOs) { + CustomCommandInfo customCommandInfo = new CustomCommandInfo(); + customCommandInfo.setName(customCommandDTO.getName()); + customCommandInfo.setCommandScript(convertScriptInfo(customCommandDTO.getCommandScript())); + customCommandInfos.add(customCommandInfo); + } + + return customCommandInfos; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java new file mode 100644 index 00000000..de7ce6d5 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java @@ -0,0 +1,110 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.constants.MessageConstants; +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.dao.po.TaskPO; +import org.apache.bigtop.manager.dao.repository.TaskRepository; +import org.apache.bigtop.manager.grpc.generated.CommandReply; +import org.apache.bigtop.manager.grpc.generated.CommandRequest; +import org.apache.bigtop.manager.grpc.generated.CommandServiceGrpc; +import org.apache.bigtop.manager.grpc.utils.ProtobufUtil; +import org.apache.bigtop.manager.server.grpc.GrpcClient; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; + +public abstract class AbstractTask implements Task { + + protected TaskRepository taskRepository; + + protected TaskContext taskContext; + + protected CommandRequest commandRequest; + protected TaskPO taskPO; + + public AbstractTask(TaskContext taskContext) { + this.taskContext = taskContext; + + injectBeans(); + } + + protected void injectBeans() { + this.taskRepository = SpringContextHolder.getBean(TaskRepository.class); + } + + protected abstract Command getCommand(); + + protected String getCustomCommand() { + return null; + } + + protected abstract CommandRequest getCommandRequest(); + + @Override + public void beforeRun() { + taskPO.setState(JobState.PROCESSING); + taskRepository.save(taskPO); + } + + @Override + public Boolean run() { + beforeRun(); + + CommandRequest.Builder builder = CommandRequest.newBuilder(getCommandRequest()); + builder.setTaskId(taskPO.getId()); + commandRequest = builder.build(); + + CommandServiceGrpc.CommandServiceBlockingStub stub = GrpcClient.getBlockingStub( + taskContext.getHostname(), CommandServiceGrpc.CommandServiceBlockingStub.class); + CommandReply reply = stub.exec(commandRequest); + + boolean taskSuccess = reply != null && reply.getCode() == MessageConstants.SUCCESS_CODE; + + if (taskSuccess) { + onSuccess(); + } else { + onFailure(); + } + + return taskSuccess; + } + + @Override + public void onSuccess() { + taskPO.setContent(ProtobufUtil.toJson(commandRequest)); + taskPO.setState(JobState.SUCCESSFUL); + taskRepository.save(taskPO); + } + + @Override + public void onFailure() { + taskPO.setContent(ProtobufUtil.toJson(commandRequest)); + taskPO.setState(JobState.FAILED); + taskRepository.save(taskPO); + } + + @Override + public TaskContext getTaskContext() { + return taskContext; + } + + @Override + public TaskPO toTaskPO() { + if (taskPO == null) { + taskPO = new TaskPO(); + taskPO.setName(getName()); + taskPO.setContext(JsonUtils.writeAsString(taskContext)); + taskPO.setStackName(taskContext.getStackName()); + taskPO.setStackVersion(taskContext.getStackVersion()); + taskPO.setHostname(taskContext.getHostname()); + taskPO.setServiceName(taskContext.getServiceName()); + taskPO.setServiceUser(taskContext.getServiceUser()); + taskPO.setServiceGroup(taskContext.getServiceGroup()); + taskPO.setComponentName(taskContext.getComponentName()); + taskPO.setCommand(getCommand()); + taskPO.setCustomCommand(getCustomCommand()); + } + + return taskPO; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java new file mode 100644 index 00000000..492c616e --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/CacheFileUpdateTask.java @@ -0,0 +1,257 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.constants.Constants; +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.message.entity.payload.CacheMessagePayload; +import org.apache.bigtop.manager.common.message.entity.pojo.ClusterInfo; +import org.apache.bigtop.manager.common.message.entity.pojo.ComponentInfo; +import org.apache.bigtop.manager.common.message.entity.pojo.RepoInfo; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.dao.po.ClusterPO; +import org.apache.bigtop.manager.dao.po.ComponentPO; +import org.apache.bigtop.manager.dao.po.HostComponentPO; +import org.apache.bigtop.manager.dao.po.HostPO; +import org.apache.bigtop.manager.dao.po.RepoPO; +import org.apache.bigtop.manager.dao.po.ServiceConfigPO; +import org.apache.bigtop.manager.dao.po.ServicePO; +import org.apache.bigtop.manager.dao.po.SettingPO; +import org.apache.bigtop.manager.dao.po.TypeConfigPO; +import org.apache.bigtop.manager.dao.repository.ClusterRepository; +import org.apache.bigtop.manager.dao.repository.ComponentRepository; +import org.apache.bigtop.manager.dao.repository.HostComponentRepository; +import org.apache.bigtop.manager.dao.repository.HostRepository; +import org.apache.bigtop.manager.dao.repository.RepoRepository; +import org.apache.bigtop.manager.dao.repository.ServiceConfigRepository; +import org.apache.bigtop.manager.dao.repository.ServiceRepository; +import org.apache.bigtop.manager.dao.repository.SettingRepository; +import org.apache.bigtop.manager.grpc.generated.CommandRequest; +import org.apache.bigtop.manager.grpc.generated.CommandType; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.server.model.converter.RepoConverter; +import org.apache.bigtop.manager.server.model.dto.PropertyDTO; +import org.apache.bigtop.manager.server.model.dto.RepoDTO; +import org.apache.bigtop.manager.server.model.dto.ServiceDTO; +import org.apache.bigtop.manager.server.model.dto.StackDTO; +import org.apache.bigtop.manager.server.utils.StackConfigUtils; +import org.apache.bigtop.manager.server.utils.StackUtils; + +import org.apache.commons.lang3.tuple.ImmutablePair; + +import com.fasterxml.jackson.core.type.TypeReference; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.apache.bigtop.manager.common.constants.Constants.ALL_HOST_KEY; + +public class CacheFileUpdateTask extends AbstractTask { + + private ClusterRepository clusterRepository; + private HostComponentRepository hostComponentRepository; + private ServiceRepository serviceRepository; + private ServiceConfigRepository serviceConfigRepository; + private RepoRepository repoRepository; + private SettingRepository settingRepository; + private HostRepository hostRepository; + private ComponentRepository componentRepository; + + private ClusterInfo clusterInfo; + private Map componentInfoMap; + private Map> serviceConfigMap; + private Map> hostMap; + private List repoList; + private Map> userMap; + private Map settingsMap; + + public CacheFileUpdateTask(TaskContext taskContext) { + super(taskContext); + } + + @Override + protected void injectBeans() { + super.injectBeans(); + + this.clusterRepository = SpringContextHolder.getBean(ClusterRepository.class); + this.hostComponentRepository = SpringContextHolder.getBean(HostComponentRepository.class); + this.serviceRepository = SpringContextHolder.getBean(ServiceRepository.class); + this.serviceConfigRepository = SpringContextHolder.getBean(ServiceConfigRepository.class); + this.repoRepository = SpringContextHolder.getBean(RepoRepository.class); + this.settingRepository = SpringContextHolder.getBean(SettingRepository.class); + this.hostRepository = SpringContextHolder.getBean(HostRepository.class); + this.componentRepository = SpringContextHolder.getBean(ComponentRepository.class); + } + + @Override + public void beforeRun() { + super.beforeRun(); + + genCaches(); + } + + private void genCaches() { + if (taskContext.getClusterId() == null) { + genEmptyCaches(); + } else { + genFullCaches(); + } + } + + private void genFullCaches() { + ClusterPO clusterPO = clusterRepository.getReferenceById(taskContext.getClusterId()); + + Long clusterId = clusterPO.getId(); + String clusterName = clusterPO.getClusterName(); + String stackName = clusterPO.getStackPO().getStackName(); + String stackVersion = clusterPO.getStackPO().getStackVersion(); + + List servicePOList = serviceRepository.findAllByClusterPOId(clusterId); + List serviceConfigPOList = + serviceConfigRepository.findAllByClusterPOAndSelectedIsTrue(clusterPO); + List hostComponentPOList = hostComponentRepository.findAllByComponentPOClusterPOId(clusterId); + List repoPOList = repoRepository.findAllByClusterPO(clusterPO); + Iterable settings = settingRepository.findAll(); + List hostPOList = hostRepository.findAllByClusterPOId(clusterId); + + clusterInfo = new ClusterInfo(); + clusterInfo.setClusterName(clusterName); + clusterInfo.setStackName(stackName); + clusterInfo.setStackVersion(stackVersion); + clusterInfo.setUserGroup(clusterPO.getUserGroup()); + clusterInfo.setRepoTemplate(clusterPO.getRepoTemplate()); + clusterInfo.setRoot(clusterPO.getRoot()); + clusterInfo.setPackages(List.of(clusterPO.getPackages().split(","))); + + serviceConfigMap = new HashMap<>(); + for (ServiceConfigPO serviceConfigPO : serviceConfigPOList) { + for (TypeConfigPO typeConfigPO : serviceConfigPO.getConfigs()) { + List properties = + JsonUtils.readFromString(typeConfigPO.getPropertiesJson(), new TypeReference<>() {}); + String configMapStr = JsonUtils.writeAsString(StackConfigUtils.extractConfigMap(properties)); + + if (serviceConfigMap.containsKey(serviceConfigPO.getServicePO().getServiceName())) { + serviceConfigMap + .get(serviceConfigPO.getServicePO().getServiceName()) + .put(typeConfigPO.getTypeName(), configMapStr); + } else { + Map hashMap = new HashMap<>(); + hashMap.put(typeConfigPO.getTypeName(), configMapStr); + serviceConfigMap.put(serviceConfigPO.getServicePO().getServiceName(), hashMap); + } + } + } + + hostMap = new HashMap<>(); + hostComponentPOList.forEach(x -> { + if (hostMap.containsKey(x.getComponentPO().getComponentName())) { + hostMap.get(x.getComponentPO().getComponentName()) + .add(x.getHostPO().getHostname()); + } else { + Set set = new HashSet<>(); + set.add(x.getHostPO().getHostname()); + hostMap.put(x.getComponentPO().getComponentName(), set); + } + hostMap.get(x.getComponentPO().getComponentName()).add(x.getHostPO().getHostname()); + }); + + Set hostNameSet = hostPOList.stream().map(HostPO::getHostname).collect(Collectors.toSet()); + hostMap.put(ALL_HOST_KEY, hostNameSet); + + repoList = new ArrayList<>(); + repoPOList.forEach(repoPO -> { + RepoInfo repoInfo = RepoConverter.INSTANCE.fromPO2Message(repoPO); + repoList.add(repoInfo); + }); + + userMap = new HashMap<>(); + servicePOList.forEach(x -> userMap.put(x.getServiceUser(), Set.of(x.getServiceGroup()))); + + settingsMap = new HashMap<>(); + settings.forEach(x -> settingsMap.put(x.getTypeName(), x.getConfigData())); + + componentInfoMap = new HashMap<>(); + List componentPOList = componentRepository.findAll(); + componentPOList.forEach(c -> { + ComponentInfo componentInfo = new ComponentInfo(); + componentInfo.setComponentName(c.getComponentName()); + componentInfo.setCommandScript(c.getCommandScript()); + componentInfo.setDisplayName(c.getDisplayName()); + componentInfo.setCategory(c.getCategory()); + componentInfo.setCustomCommands(c.getCustomCommands()); + componentInfo.setServiceName(c.getServicePO().getServiceName()); + componentInfoMap.put(c.getComponentName(), componentInfo); + }); + } + + @SuppressWarnings("unchecked") + private void genEmptyCaches() { + componentInfoMap = new HashMap<>(); + serviceConfigMap = new HashMap<>(); + hostMap = new HashMap<>(); + userMap = new HashMap<>(); + settingsMap = new HashMap<>(); + + String fullStackName = StackUtils.fullStackName(taskContext.getStackName(), taskContext.getStackVersion()); + ImmutablePair> immutablePair = + StackUtils.getStackKeyMap().get(fullStackName); + StackDTO stackDTO = immutablePair.getLeft(); + List serviceDTOList = immutablePair.getRight(); + + Map properties = taskContext.getProperties(); + + repoList = RepoConverter.INSTANCE.fromDTO2Message((List) properties.get("repoInfoList")); + clusterInfo = new ClusterInfo(); + clusterInfo.setClusterName(taskContext.getClusterName()); + clusterInfo.setStackName(taskContext.getStackName()); + clusterInfo.setStackVersion(taskContext.getStackVersion()); + clusterInfo.setUserGroup(stackDTO.getUserGroup()); + clusterInfo.setRepoTemplate(stackDTO.getRepoTemplate()); + clusterInfo.setRoot(stackDTO.getRoot()); + + List hostnames = (List) properties.get("hostnames"); + hostMap.put(Constants.ALL_HOST_KEY, new HashSet<>(hostnames)); + + for (ServiceDTO serviceDTO : serviceDTOList) { + userMap.put(serviceDTO.getServiceUser(), Set.of(serviceDTO.getServiceGroup())); + } + } + + @Override + protected Command getCommand() { + return Command.CUSTOM; + } + + @Override + protected String getCustomCommand() { + return "update_cache_files"; + } + + @Override + protected CommandRequest getCommandRequest() { + CacheMessagePayload messagePayload = new CacheMessagePayload(); + messagePayload.setHostname(taskContext.getHostname()); + messagePayload.setClusterInfo(clusterInfo); + messagePayload.setConfigurations(serviceConfigMap); + messagePayload.setClusterHostInfo(hostMap); + messagePayload.setRepoInfo(repoList); + messagePayload.setSettings(settingsMap); + messagePayload.setUserInfo(userMap); + messagePayload.setComponentInfo(componentInfoMap); + + CommandRequest.Builder builder = CommandRequest.newBuilder(); + builder.setType(CommandType.UPDATE_CACHE_FILES); + builder.setHostname(taskContext.getHostname()); + builder.setPayload(JsonUtils.writeAsString(messagePayload)); + + return builder.build(); + } + + @Override + public String getName() { + return "Update cache files on " + taskContext.getHostname(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentCheckTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentCheckTask.java new file mode 100644 index 00000000..13aaf7e8 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentCheckTask.java @@ -0,0 +1,20 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.enums.Command; + +public class ComponentCheckTask extends AbstractComponentTask { + + public ComponentCheckTask(TaskContext taskContext) { + super(taskContext); + } + + @Override + protected Command getCommand() { + return Command.CHECK; + } + + @Override + public String getName() { + return "Check component " + taskContext.getComponentName() + " on " + taskContext.getHostname(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java new file mode 100644 index 00000000..4ee76da3 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java @@ -0,0 +1,36 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.po.HostComponentPO; + +public class ComponentInstallTask extends AbstractComponentTask { + + public ComponentInstallTask(TaskContext taskContext) { + super(taskContext); + } + + @Override + protected Command getCommand() { + return Command.INSTALL; + } + + @Override + public void onSuccess() { + super.onSuccess(); + + Long clusterId = taskContext.getClusterId(); + String componentName = taskContext.getComponentName(); + String hostname = taskContext.getHostname(); + HostComponentPO hostComponentPO = + hostComponentRepository.findByComponentPOClusterPOIdAndComponentPOComponentNameAndHostPOHostname( + clusterId, componentName, hostname); + hostComponentPO.setState(MaintainState.INSTALLED); + hostComponentRepository.save(hostComponentPO); + } + + @Override + public String getName() { + return "Install component " + taskContext.getComponentName() + " on " + taskContext.getHostname(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java new file mode 100644 index 00000000..5e3416cc --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java @@ -0,0 +1,36 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.po.HostComponentPO; + +public class ComponentStartTask extends AbstractComponentTask { + + public ComponentStartTask(TaskContext taskContext) { + super(taskContext); + } + + @Override + protected Command getCommand() { + return Command.START; + } + + @Override + public void onSuccess() { + super.onSuccess(); + + Long clusterId = taskContext.getClusterId(); + String componentName = taskContext.getComponentName(); + String hostname = taskContext.getHostname(); + HostComponentPO hostComponentPO = + hostComponentRepository.findByComponentPOClusterPOIdAndComponentPOComponentNameAndHostPOHostname( + clusterId, componentName, hostname); + hostComponentPO.setState(MaintainState.STARTED); + hostComponentRepository.save(hostComponentPO); + } + + @Override + public String getName() { + return "Start component " + taskContext.getComponentName() + " on " + taskContext.getHostname(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java new file mode 100644 index 00000000..ed4da7a9 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java @@ -0,0 +1,36 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.po.HostComponentPO; + +public class ComponentStopTask extends AbstractComponentTask { + + public ComponentStopTask(TaskContext taskContext) { + super(taskContext); + } + + @Override + protected Command getCommand() { + return Command.STOP; + } + + @Override + public void onSuccess() { + super.onSuccess(); + + Long clusterId = taskContext.getClusterId(); + String componentName = taskContext.getComponentName(); + String hostname = taskContext.getHostname(); + HostComponentPO hostComponentPO = + hostComponentRepository.findByComponentPOClusterPOIdAndComponentPOComponentNameAndHostPOHostname( + clusterId, componentName, hostname); + hostComponentPO.setState(MaintainState.STOPPED); + hostComponentRepository.save(hostComponentPO); + } + + @Override + public String getName() { + return "Stop component " + taskContext.getComponentName() + " on " + taskContext.getHostname(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/HostCheckTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/HostCheckTask.java new file mode 100644 index 00000000..ad7f3560 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/HostCheckTask.java @@ -0,0 +1,43 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.message.entity.payload.HostCheckPayload; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.grpc.generated.CommandRequest; +import org.apache.bigtop.manager.grpc.generated.CommandType; + +public class HostCheckTask extends AbstractTask { + + public HostCheckTask(TaskContext taskContext) { + super(taskContext); + } + + @Override + protected Command getCommand() { + return Command.CUSTOM; + } + + @Override + protected String getCustomCommand() { + return "check_host"; + } + + @Override + protected CommandRequest getCommandRequest() { + String hostname = taskContext.getHostname(); + HostCheckPayload messagePayload = new HostCheckPayload(); + messagePayload.setHostname(hostname); + + CommandRequest.Builder builder = CommandRequest.newBuilder(); + builder.setType(CommandType.HOST_CHECK); + builder.setHostname(hostname); + builder.setPayload(JsonUtils.writeAsString(messagePayload)); + + return builder.build(); + } + + @Override + public String getName() { + return "Check host " + taskContext.getHostname(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java new file mode 100644 index 00000000..a636c3c7 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java @@ -0,0 +1,20 @@ +package org.apache.bigtop.manager.server.command.task; + +import org.apache.bigtop.manager.dao.po.TaskPO; + +public interface Task { + + String getName(); + + void beforeRun(); + + Boolean run(); + + void onSuccess(); + + void onFailure(); + + TaskContext getTaskContext(); + + TaskPO toTaskPO(); +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java new file mode 100644 index 00000000..ae5b1f35 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/TaskContext.java @@ -0,0 +1,37 @@ +package org.apache.bigtop.manager.server.command.task; + +import lombok.Data; +import org.apache.bigtop.manager.common.enums.Command; + +import java.util.Map; + +@Data +public class TaskContext { + + private Long clusterId; + + private String clusterName; + + private String hostname; + + private String stackName; + + private String stackVersion; + + private String serviceName; + + private String serviceUser; + + private String serviceGroup; + + private String componentName; + + private Command command; + + private String customCommand; + + private String root; + + // Extra properties for specific tasks + protected Map properties; +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/holder/SpringContextHolder.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/holder/SpringContextHolder.java index 4143720d..f4da2f12 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/holder/SpringContextHolder.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/holder/SpringContextHolder.java @@ -44,6 +44,10 @@ public void setApplicationContext(@Nonnull ApplicationContext applicationContext SpringContextHolder.applicationContext = applicationContext; } + public static T getBean(Class clazz) { + return applicationContext.getBean(clazz); + } + public static Map getCommandValidators() { return applicationContext.getBeansOfType(CommandValidator.class); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java index 635181e4..b093dfd9 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ClusterConverter.java @@ -43,6 +43,8 @@ public interface ClusterConverter { ClusterPO fromDTO2PO(ClusterDTO clusterDTO); + ClusterDTO fromPO2DTO(ClusterPO clusterPO); + @Mapping(target = "stackName", source = "stackPO.stackName") @Mapping(target = "stackVersion", source = "stackPO.stackVersion") ClusterVO fromEntity2VO(ClusterPO clusterPO); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java index 9759865b..35746556 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.scheduler; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.ClusterPO; import org.apache.bigtop.manager.dao.po.ComponentPO; @@ -30,18 +32,15 @@ import org.apache.bigtop.manager.grpc.generated.ComponentStatusRequest; import org.apache.bigtop.manager.grpc.generated.ComponentStatusServiceGrpc; import org.apache.bigtop.manager.server.grpc.GrpcClient; - import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.List; import java.util.concurrent.TimeUnit; @Slf4j -@org.springframework.stereotype.Component +@Component public class ComponentStatusScheduler { @Resource diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java index 74a57605..0172607e 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.service.impl; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.ClusterPO; import org.apache.bigtop.manager.dao.po.RepoPO; @@ -35,15 +37,13 @@ import org.apache.bigtop.manager.server.service.ClusterService; import org.apache.bigtop.manager.server.service.HostService; import org.apache.bigtop.manager.server.utils.StackUtils; +import org.springframework.stereotype.Service; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.List; @Slf4j -@org.springframework.stereotype.Service +@Service public class ClusterServiceImpl implements ClusterService { @Resource diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java index 9eb8037a..d15002e0 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java @@ -18,30 +18,55 @@ */ package org.apache.bigtop.manager.server.service.impl; +import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.dao.po.ClusterPO; import org.apache.bigtop.manager.dao.po.JobPO; +import org.apache.bigtop.manager.dao.po.StagePO; +import org.apache.bigtop.manager.dao.po.TaskPO; +import org.apache.bigtop.manager.dao.repository.ClusterRepository; +import org.apache.bigtop.manager.dao.repository.JobRepository; +import org.apache.bigtop.manager.dao.repository.StageRepository; +import org.apache.bigtop.manager.dao.repository.TaskRepository; import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; import org.apache.bigtop.manager.server.command.job.factory.JobContext; import org.apache.bigtop.manager.server.command.job.factory.JobFactories; import org.apache.bigtop.manager.server.command.job.factory.JobFactory; import org.apache.bigtop.manager.server.command.job.validator.ValidatorContext; import org.apache.bigtop.manager.server.command.job.validator.ValidatorExecutionChain; import org.apache.bigtop.manager.server.command.scheduler.JobScheduler; +import org.apache.bigtop.manager.server.command.stage.Stage; +import org.apache.bigtop.manager.server.command.task.Task; import org.apache.bigtop.manager.server.model.converter.JobConverter; import org.apache.bigtop.manager.server.model.dto.CommandDTO; import org.apache.bigtop.manager.server.model.vo.CommandVO; import org.apache.bigtop.manager.server.service.CommandService; +import org.springframework.stereotype.Service; + import lombok.extern.slf4j.Slf4j; import jakarta.annotation.Resource; @Slf4j -@org.springframework.stereotype.Service +@Service public class CommandServiceImpl implements CommandService { @Resource private JobScheduler jobScheduler; + @Resource + private ClusterRepository clusterRepository; + + @Resource + private JobRepository jobRepository; + + @Resource + private StageRepository stageRepository; + + @Resource + private TaskRepository taskRepository; + @Override public CommandVO command(CommandDTO commandDTO) { CommandIdentifier commandIdentifier = @@ -56,11 +81,46 @@ public CommandVO command(CommandDTO commandDTO) { JobContext jobContext = new JobContext(); jobContext.setCommandDTO(commandDTO); JobFactory jobFactory = JobFactories.getJobFactory(commandIdentifier); - JobPO jobPO = jobFactory.createJob(jobContext); + Job job = jobFactory.createJob(jobContext); + + // Save job + JobPO jobPO = saveJob(job); // Submit job - jobScheduler.submit(jobPO); + jobScheduler.submit(job); return JobConverter.INSTANCE.fromPO2CommandVO(jobPO); } + + protected JobPO saveJob(Job job) { + Long clusterId = job.getJobContext().getCommandDTO().getClusterId(); + ClusterPO clusterPO = clusterId == null ? null : clusterRepository.getReferenceById(clusterId); + + JobPO jobPO = job.toJobPO(); + jobPO.setClusterPO(clusterPO); + jobPO.setState(JobState.PENDING); + jobRepository.save(jobPO); + + for (int i = 0; i < job.getStages().size(); i++) { + Stage stage = job.getStages().get(i); + StagePO stagePO = stage.toStagePO(); + stagePO.setClusterPO(clusterPO); + stagePO.setJobPO(jobPO); + stagePO.setOrder(i + 1); + stagePO.setState(JobState.PENDING); + stageRepository.save(stagePO); + + for (int j = 0; j < stage.getTasks().size(); j++) { + Task task = stage.getTasks().get(j); + TaskPO taskPO = task.toTaskPO(); + taskPO.setClusterPO(clusterPO); + taskPO.setJobPO(jobPO); + taskPO.setStagePO(stagePO); + taskPO.setState(JobState.PENDING); + taskRepository.save(taskPO); + } + } + + return jobPO; + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java index 45a51dac..dbe9339b 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java @@ -35,27 +35,23 @@ import org.apache.bigtop.manager.server.service.ConfigService; import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import jakarta.annotation.Resource; import java.util.List; @Slf4j -@org.springframework.stereotype.Service +@Service +@RequiredArgsConstructor public class ConfigServiceImpl implements ConfigService { - @Resource - private ClusterRepository clusterRepository; - - @Resource - private ServiceRepository serviceRepository; - - @Resource - private ServiceConfigRepository serviceConfigRepository; - - @Resource - private TypeConfigRepository typeConfigRepository; + // Autowired Beans + private final ClusterRepository clusterRepository; + private final ServiceRepository serviceRepository; + private final ServiceConfigRepository serviceConfigRepository; + private final TypeConfigRepository typeConfigRepository; @Override public List list(Long clusterId) { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java index fa9fb930..117366b4 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java @@ -18,16 +18,12 @@ */ package org.apache.bigtop.manager.server.service.impl; -import org.apache.bigtop.manager.common.enums.JobState; +import jakarta.annotation.Resource; import org.apache.bigtop.manager.dao.po.JobPO; -import org.apache.bigtop.manager.dao.po.StagePO; -import org.apache.bigtop.manager.dao.po.TaskPO; import org.apache.bigtop.manager.dao.repository.JobRepository; import org.apache.bigtop.manager.dao.repository.StageRepository; import org.apache.bigtop.manager.dao.repository.TaskRepository; import org.apache.bigtop.manager.server.command.scheduler.JobScheduler; -import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; -import org.apache.bigtop.manager.server.exception.ApiException; import org.apache.bigtop.manager.server.model.converter.JobConverter; import org.apache.bigtop.manager.server.model.query.PageQuery; import org.apache.bigtop.manager.server.model.vo.JobVO; @@ -35,14 +31,11 @@ import org.apache.bigtop.manager.server.service.JobService; import org.apache.bigtop.manager.server.utils.ClusterUtils; import org.apache.bigtop.manager.server.utils.PageUtils; - import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import jakarta.annotation.Resource; - @Service public class JobServiceImpl implements JobService { @@ -80,25 +73,26 @@ public JobVO get(Long id) { @Override public JobVO retry(Long id) { - JobPO jobPO = jobRepository.getReferenceById(id); - if (jobPO.getState() != JobState.FAILED) { - throw new ApiException(ApiExceptionEnum.JOB_NOT_RETRYABLE); - } - - for (StagePO stagePO : jobPO.getStagePOList()) { - for (TaskPO taskPO : stagePO.getTaskPOList()) { - taskPO.setState(JobState.PENDING); - taskRepository.save(taskPO); - } - - stagePO.setState(JobState.PENDING); - stageRepository.save(stagePO); - } - - jobPO.setState(JobState.PENDING); - jobRepository.save(jobPO); - jobScheduler.submit(jobPO); - - return JobConverter.INSTANCE.fromPO2VO(jobPO); + throw new RuntimeException("Api is in maintenance"); +// JobPO jobPO = jobRepository.getReferenceById(id); +// if (jobPO.getState() != JobState.FAILED) { +// throw new ApiException(ApiExceptionEnum.JOB_NOT_RETRYABLE); +// } +// +// for (StagePO stagePO : jobPO.getStagePOList()) { +// for (TaskPO taskPO : stagePO.getTaskPOList()) { +// taskPO.setState(JobState.PENDING); +// taskRepository.save(taskPO); +// } +// +// stagePO.setState(JobState.PENDING); +// stageRepository.save(stagePO); +// } +// +// jobPO.setState(JobState.PENDING); +// jobRepository.save(jobPO); +// jobScheduler.submit(jobPO); +// +// return JobConverter.INSTANCE.fromPO2VO(jobPO); } } 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 30889a0e..a9dfadd9 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java @@ -18,6 +18,8 @@ */ package org.apache.bigtop.manager.server.service.impl; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.common.constants.ComponentCategories; import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.common.utils.JsonUtils; @@ -39,19 +41,16 @@ import org.apache.bigtop.manager.server.model.vo.QuickLinkVO; import org.apache.bigtop.manager.server.model.vo.ServiceVO; import org.apache.bigtop.manager.server.service.ServiceService; - import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; -import lombok.extern.slf4j.Slf4j; - -import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j -@org.springframework.stereotype.Service +@Service public class ServiceServiceImpl implements ServiceService { @Resource diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql index a2f16cf7..af99237e 100644 --- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql +++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql @@ -201,6 +201,7 @@ CREATE TABLE `task` `command_script` VARCHAR(255), `component_name` VARCHAR(255), `content` LONGTEXT, + `context` LONGTEXT NOT NULL, `create_by` BIGINT, `create_time` DATETIME, `custom_command` VARCHAR(255), From 68b1f6f3de1c4546e1ba9a44ae6ebacf64507343 Mon Sep 17 00:00:00 2001 From: Zhiguo Wu Date: Fri, 2 Aug 2024 17:47:09 +0800 Subject: [PATCH 2/8] fix bug --- .../manager/server/command/job/AbstractJob.java | 15 +++++++++++---- .../server/command/job/ClusterCreateJob.java | 6 ++++-- .../bigtop/manager/server/command/job/Job.java | 2 +- .../server/command/stage/AbstractStage.java | 10 ++++++++-- .../manager/server/command/stage/Stage.java | 2 +- .../command/task/AbstractComponentTask.java | 3 +-- .../manager/server/command/task/AbstractTask.java | 13 ++++++++++--- .../bigtop/manager/server/command/task/Task.java | 2 +- .../server/service/impl/CommandServiceImpl.java | 6 +++--- .../stack/core/executor/StackExecutor.java | 2 +- 10 files changed, 41 insertions(+), 20 deletions(-) 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 e34c1876..380cb0fa 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 @@ -30,7 +30,11 @@ public abstract class AbstractJob implements Job { protected List stages; protected ClusterPO clusterPO; - protected JobPO jobPO; + + /** + * Do not use this directly, please use {@link #getJobPO()} to make sure it's initialized. + */ + private JobPO jobPO; public AbstractJob(JobContext jobContext) { this.jobContext = jobContext; @@ -59,6 +63,7 @@ protected void beforeCreateStages() { @Override public void beforeRun() { + JobPO jobPO = getJobPO(); jobPO.setState(JobState.PROCESSING); jobRepository.save(jobPO); } @@ -88,25 +93,27 @@ public void run() { @Override public void onSuccess() { + JobPO jobPO = getJobPO(); jobPO.setState(JobState.SUCCESSFUL); jobRepository.save(jobPO); } @Override public void onFailure() { + JobPO jobPO = getJobPO(); List stagePOList = new ArrayList<>(); List taskPOList = new ArrayList<>(); jobPO.setState(JobState.FAILED); for (Stage stage : getStages()) { - StagePO stagePO = stage.toStagePO(); + StagePO stagePO = stage.getStagePO(); if (stagePO.getState() == JobState.PENDING) { stagePO.setState(JobState.CANCELED); stagePOList.add(stagePO); for (Task task : stage.getTasks()) { - TaskPO taskPO = task.toTaskPO(); + TaskPO taskPO = task.getTaskPO(); taskPO.setState(JobState.CANCELED); taskPOList.add(taskPO); } @@ -129,7 +136,7 @@ public List getStages() { } @Override - public JobPO toJobPO() { + public JobPO getJobPO() { if (jobPO == null) { jobPO = new JobPO(); jobPO.setName(getName()); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java index c0ad4a95..94d9c8f0 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java @@ -2,6 +2,7 @@ import org.apache.bigtop.manager.common.enums.MaintainState; import org.apache.bigtop.manager.dao.po.ClusterPO; +import org.apache.bigtop.manager.dao.po.JobPO; import org.apache.bigtop.manager.dao.po.StagePO; import org.apache.bigtop.manager.dao.po.TaskPO; import org.apache.bigtop.manager.server.command.job.factory.JobContext; @@ -62,16 +63,17 @@ public void onSuccess() { clusterRepository.save(clusterPO); // Link job to cluster after cluster successfully added + JobPO jobPO = getJobPO(); jobPO.setClusterPO(clusterPO); jobRepository.save(jobPO); for (Stage stage : getStages()) { - StagePO stagePO = stage.toStagePO(); + StagePO stagePO = stage.getStagePO(); stagePO.setClusterPO(clusterPO); stageRepository.save(stagePO); for (Task task : stage.getTasks()) { - TaskPO taskPO = task.toTaskPO(); + TaskPO taskPO = task.getTaskPO(); taskPO.setClusterPO(clusterPO); taskRepository.save(taskPO); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java index af372fd4..579f0162 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java @@ -40,5 +40,5 @@ public interface Job { List getStages(); - JobPO toJobPO(); + JobPO getJobPO(); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java index 37e99cab..96266e5c 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java @@ -19,7 +19,10 @@ public abstract class AbstractStage implements Stage { protected StageContext stageContext; protected List tasks; - protected StagePO stagePO; + /** + * Do not use this directly, please use {@link #getStagePO()} to make sure it's initialized. + */ + private StagePO stagePO; public AbstractStage(StageContext stageContext) { this.stageContext = stageContext; @@ -52,6 +55,7 @@ protected String getComponentName() { @Override public void beforeRun() { + StagePO stagePO = getStagePO(); stagePO.setState(JobState.PROCESSING); stageRepository.save(stagePO); } @@ -87,12 +91,14 @@ public Boolean run() { @Override public void onSuccess() { + StagePO stagePO = getStagePO(); stagePO.setState(JobState.SUCCESSFUL); stageRepository.save(stagePO); } @Override public void onFailure() { + StagePO stagePO = getStagePO(); stagePO.setState(JobState.FAILED); stageRepository.save(stagePO); } @@ -108,7 +114,7 @@ public List getTasks() { } @Override - public StagePO toStagePO() { + public StagePO getStagePO() { if (stagePO == null) { stagePO = new StagePO(); stagePO.setName(getName()); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java index fe1f5b98..4ec3e007 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java @@ -22,5 +22,5 @@ public interface Stage { List getTasks(); - StagePO toStagePO(); + StagePO getStagePO(); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java index 341c5b2b..0f3f76a0 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java @@ -1,6 +1,5 @@ package org.apache.bigtop.manager.server.command.task; -import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload; import org.apache.bigtop.manager.common.message.entity.pojo.CustomCommandInfo; import org.apache.bigtop.manager.common.message.entity.pojo.OSSpecificInfo; @@ -38,7 +37,7 @@ protected void injectBeans() { protected CommandRequest getCommandRequest() { CommandPayload commandPayload = new CommandPayload(); commandPayload.setServiceName(taskContext.getServiceName()); - commandPayload.setCommand(Command.CHECK); + commandPayload.setCommand(getCommand()); commandPayload.setServiceUser(taskContext.getServiceUser()); commandPayload.setServiceGroup(taskContext.getServiceGroup()); commandPayload.setStackName(taskContext.getStackName()); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java index de7ce6d5..fd15794e 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java @@ -20,7 +20,11 @@ public abstract class AbstractTask implements Task { protected TaskContext taskContext; protected CommandRequest commandRequest; - protected TaskPO taskPO; + + /** + * Do not use this directly, please use {@link #getTaskPO()} to make sure it's initialized. + */ + private TaskPO taskPO; public AbstractTask(TaskContext taskContext) { this.taskContext = taskContext; @@ -42,6 +46,7 @@ protected String getCustomCommand() { @Override public void beforeRun() { + TaskPO taskPO = getTaskPO(); taskPO.setState(JobState.PROCESSING); taskRepository.save(taskPO); } @@ -51,7 +56,7 @@ public Boolean run() { beforeRun(); CommandRequest.Builder builder = CommandRequest.newBuilder(getCommandRequest()); - builder.setTaskId(taskPO.getId()); + builder.setTaskId(getTaskPO().getId()); commandRequest = builder.build(); CommandServiceGrpc.CommandServiceBlockingStub stub = GrpcClient.getBlockingStub( @@ -71,6 +76,7 @@ public Boolean run() { @Override public void onSuccess() { + TaskPO taskPO = getTaskPO(); taskPO.setContent(ProtobufUtil.toJson(commandRequest)); taskPO.setState(JobState.SUCCESSFUL); taskRepository.save(taskPO); @@ -78,6 +84,7 @@ public void onSuccess() { @Override public void onFailure() { + TaskPO taskPO = getTaskPO(); taskPO.setContent(ProtobufUtil.toJson(commandRequest)); taskPO.setState(JobState.FAILED); taskRepository.save(taskPO); @@ -89,7 +96,7 @@ public TaskContext getTaskContext() { } @Override - public TaskPO toTaskPO() { + public TaskPO getTaskPO() { if (taskPO == null) { taskPO = new TaskPO(); taskPO.setName(getName()); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java index a636c3c7..23f0bce2 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java @@ -16,5 +16,5 @@ public interface Task { TaskContext getTaskContext(); - TaskPO toTaskPO(); + TaskPO getTaskPO(); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java index d15002e0..d756d899 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/CommandServiceImpl.java @@ -96,14 +96,14 @@ protected JobPO saveJob(Job job) { Long clusterId = job.getJobContext().getCommandDTO().getClusterId(); ClusterPO clusterPO = clusterId == null ? null : clusterRepository.getReferenceById(clusterId); - JobPO jobPO = job.toJobPO(); + JobPO jobPO = job.getJobPO(); jobPO.setClusterPO(clusterPO); jobPO.setState(JobState.PENDING); jobRepository.save(jobPO); for (int i = 0; i < job.getStages().size(); i++) { Stage stage = job.getStages().get(i); - StagePO stagePO = stage.toStagePO(); + StagePO stagePO = stage.getStagePO(); stagePO.setClusterPO(clusterPO); stagePO.setJobPO(jobPO); stagePO.setOrder(i + 1); @@ -112,7 +112,7 @@ protected JobPO saveJob(Job job) { for (int j = 0; j < stage.getTasks().size(); j++) { Task task = stage.getTasks().get(j); - TaskPO taskPO = task.toTaskPO(); + TaskPO taskPO = task.getTaskPO(); taskPO.setClusterPO(clusterPO); taskPO.setJobPO(jobPO); taskPO.setStagePO(stagePO); diff --git a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java index 55da1caa..33d54b9d 100644 --- a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java +++ b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/executor/StackExecutor.java @@ -110,7 +110,7 @@ public static ShellResult execute(CommandPayload commandPayload) { return result; } catch (Exception e) { - log.info("Error executing command, payload: {}", commandPayload, e); + log.error("Error executing command, payload: {}", commandPayload, e); return ShellResult.fail(); } } From 76afa7b0e7945eed051bd5c770c3aae12f94afc4 Mon Sep 17 00:00:00 2001 From: Zhiguo Wu Date: Sun, 4 Aug 2024 13:51:21 +0800 Subject: [PATCH 3/8] fix job retry function --- .../manager/grpc/utils/ProtobufUtil.java | 2 +- .../server/command/job/AbstractJob.java | 5 + .../manager/server/command/job/Job.java | 2 + .../server/command/job/ServiceInstallJob.java | 23 ++-- .../server/command/stage/AbstractStage.java | 5 + .../manager/server/command/stage/Stage.java | 2 + .../server/command/task/AbstractTask.java | 5 + .../manager/server/command/task/Task.java | 2 + .../model/dto/command/ServiceCommandDTO.java | 2 + .../model/req/command/ServiceCommandReq.java | 3 + .../server/service/impl/JobServiceImpl.java | 117 ++++++++++++++---- .../service-add/choose-services.vue | 25 ++-- .../src/components/service-add/index.vue | 1 + 13 files changed, 149 insertions(+), 45 deletions(-) diff --git a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/utils/ProtobufUtil.java b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/utils/ProtobufUtil.java index dc212e9b..6ee9450f 100644 --- a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/utils/ProtobufUtil.java +++ b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/utils/ProtobufUtil.java @@ -38,7 +38,7 @@ public static T fromJson(String json, Class claz public static String toJson(T message) { try { - return JsonFormat.printer().print(message); + return JsonFormat.printer().omittingInsignificantWhitespace().print(message); } catch (Exception e) { throw new RuntimeException(e); } 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 380cb0fa..3a7ac424 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 @@ -135,6 +135,11 @@ public List getStages() { return stages; } + @Override + public void loadJobPO(JobPO jobPO) { + this.jobPO = jobPO; + } + @Override public JobPO getJobPO() { if (jobPO == null) { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java index 579f0162..a34f5826 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/Job.java @@ -40,5 +40,7 @@ public interface Job { List getStages(); + void loadJobPO(JobPO jobPO); + JobPO getJobPO(); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java index 4081e4b3..ffc1fb19 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ServiceInstallJob.java @@ -47,7 +47,7 @@ protected void createStages() { // Install components super.createInstallStages(); - // Distribute caches after installed + // Update cache files after installed super.createCacheStage(); // Start all master components @@ -78,14 +78,17 @@ protected List findHostnamesByComponentName(String componentName) { for (ComponentHostDTO componentHost : componentHosts) { if (componentHost.getComponentName().equals(componentName)) { List hostnames = new ArrayList<>(componentHost.getHostnames()); - List existHostnames = hostComponentRepository - .findAllByComponentPOClusterPOIdAndComponentPOComponentNameAndHostPOHostnameIn( - clusterPO.getId(), componentName, hostnames) - .stream() - .map(hostComponent -> hostComponent.getHostPO().getHostname()) - .toList(); - - hostnames.removeAll(existHostnames); + if (serviceCommand.getInstalled()) { + List existHostnames = hostComponentRepository + .findAllByComponentPOClusterPOIdAndComponentPOComponentNameAndHostPOHostnameIn( + clusterPO.getId(), componentName, hostnames) + .stream() + .map(hostComponent -> hostComponent.getHostPO().getHostname()) + .toList(); + + hostnames.removeAll(existHostnames); + } + return hostnames; } } @@ -119,7 +122,7 @@ private void upsertService(ServicePO servicePO, ServiceCommandDTO serviceCommand String stackName = clusterPO.getStackPO().getStackName(); String stackVersion = clusterPO.getStackPO().getStackVersion(); - // 1. Persist service + // 1. Persist service and components if (servicePO == null) { ServiceDTO serviceDTO = StackUtils.getServiceDTO(stackName, stackVersion, serviceName); servicePO = ServiceConverter.INSTANCE.fromDTO2PO(serviceDTO, clusterPO); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java index 96266e5c..46dcfff6 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java @@ -113,6 +113,11 @@ public List getTasks() { return tasks; } + @Override + public void loadStagePO(StagePO stagePO) { + this.stagePO = stagePO; + } + @Override public StagePO getStagePO() { if (stagePO == null) { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java index 4ec3e007..fa0d412e 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/Stage.java @@ -22,5 +22,7 @@ public interface Stage { List getTasks(); + void loadStagePO(StagePO stagePO); + StagePO getStagePO(); } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java index fd15794e..313dec91 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java @@ -95,6 +95,11 @@ public TaskContext getTaskContext() { return taskContext; } + @Override + public void loadTaskPO(TaskPO taskPO) { + this.taskPO = taskPO; + } + @Override public TaskPO getTaskPO() { if (taskPO == null) { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java index 23f0bce2..90537259 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/Task.java @@ -16,5 +16,7 @@ public interface Task { TaskContext getTaskContext(); + void loadTaskPO(TaskPO taskPO); + TaskPO getTaskPO(); } 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 ea687df2..4ffa1e90 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 String configDesc; private Integer version; 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 ebb015bc..499c605f 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; + @Schema(description = "If service installed", example = "true") + private Boolean installed; + @Schema(description = "Config Description", example = "Initial config for zookeeper") private String configDesc; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java index 117366b4..ad429295 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java @@ -18,12 +18,24 @@ */ package org.apache.bigtop.manager.server.service.impl; -import jakarta.annotation.Resource; +import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.common.utils.JsonUtils; import org.apache.bigtop.manager.dao.po.JobPO; +import org.apache.bigtop.manager.dao.po.StagePO; +import org.apache.bigtop.manager.dao.po.TaskPO; import org.apache.bigtop.manager.dao.repository.JobRepository; import org.apache.bigtop.manager.dao.repository.StageRepository; import org.apache.bigtop.manager.dao.repository.TaskRepository; +import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.Job; +import org.apache.bigtop.manager.server.command.job.factory.JobContext; +import org.apache.bigtop.manager.server.command.job.factory.JobFactories; +import org.apache.bigtop.manager.server.command.job.factory.JobFactory; import org.apache.bigtop.manager.server.command.scheduler.JobScheduler; +import org.apache.bigtop.manager.server.command.stage.Stage; +import org.apache.bigtop.manager.server.command.task.Task; +import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; +import org.apache.bigtop.manager.server.exception.ApiException; import org.apache.bigtop.manager.server.model.converter.JobConverter; import org.apache.bigtop.manager.server.model.query.PageQuery; import org.apache.bigtop.manager.server.model.vo.JobVO; @@ -31,11 +43,16 @@ import org.apache.bigtop.manager.server.service.JobService; import org.apache.bigtop.manager.server.utils.ClusterUtils; import org.apache.bigtop.manager.server.utils.PageUtils; + import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; + +import java.util.List; + @Service public class JobServiceImpl implements JobService { @@ -73,26 +90,82 @@ public JobVO get(Long id) { @Override public JobVO retry(Long id) { - throw new RuntimeException("Api is in maintenance"); -// JobPO jobPO = jobRepository.getReferenceById(id); -// if (jobPO.getState() != JobState.FAILED) { -// throw new ApiException(ApiExceptionEnum.JOB_NOT_RETRYABLE); -// } -// -// for (StagePO stagePO : jobPO.getStagePOList()) { -// for (TaskPO taskPO : stagePO.getTaskPOList()) { -// taskPO.setState(JobState.PENDING); -// taskRepository.save(taskPO); -// } -// -// stagePO.setState(JobState.PENDING); -// stageRepository.save(stagePO); -// } -// -// jobPO.setState(JobState.PENDING); -// jobRepository.save(jobPO); -// jobScheduler.submit(jobPO); -// -// return JobConverter.INSTANCE.fromPO2VO(jobPO); + JobPO jobPO = jobRepository.getReferenceById(id); + if (jobPO.getState() != JobState.FAILED) { + throw new ApiException(ApiExceptionEnum.JOB_NOT_RETRYABLE); + } + + resetJobStatusInDB(jobPO); + Job job = recreateJob(jobPO); + jobScheduler.submit(job); + + return JobConverter.INSTANCE.fromPO2VO(jobPO); + } + + private void resetJobStatusInDB(JobPO jobPO) { + for (StagePO stagePO : jobPO.getStagePOList()) { + for (TaskPO taskPO : stagePO.getTaskPOList()) { + taskPO.setState(JobState.PENDING); + taskRepository.save(taskPO); + } + + stagePO.setState(JobState.PENDING); + stageRepository.save(stagePO); + } + + jobPO.setState(JobState.PENDING); + jobRepository.save(jobPO); + } + + private Job recreateJob(JobPO jobPO) { + JobContext jobContext = JsonUtils.readFromString(jobPO.getContext(), JobContext.class); + CommandIdentifier commandIdentifier = new CommandIdentifier( + jobContext.getCommandDTO().getCommandLevel(), + jobContext.getCommandDTO().getCommand()); + JobFactory jobFactory = JobFactories.getJobFactory(commandIdentifier); + Job job = jobFactory.createJob(jobContext); + + job.loadJobPO(jobPO); + for (int i = 0; i < job.getStages().size(); i++) { + Stage stage = job.getStages().get(i); + StagePO stagePO = findCorrectStagePO(jobPO.getStagePOList(), i + 1); + if (stagePO == null) { + throw new ApiException(ApiExceptionEnum.JOB_NOT_RETRYABLE); + } + + stage.loadStagePO(stagePO); + + for (int j = 0; j < stage.getTasks().size(); j++) { + Task task = stage.getTasks().get(j); + TaskPO taskPO = findCorrectTaskPO(stagePO.getTaskPOList(), task.getTaskContext().getHostname()); + if (taskPO == null) { + throw new ApiException(ApiExceptionEnum.JOB_NOT_RETRYABLE); + } + + task.loadTaskPO(taskPO); + } + } + + return job; + } + + private StagePO findCorrectStagePO(List stagePOList, Integer order) { + for (StagePO stagePO : stagePOList) { + if (stagePO.getOrder().equals(order)) { + return stagePO; + } + } + + return null; + } + + private TaskPO findCorrectTaskPO(List taskPOList, String hostname) { + for (TaskPO taskPO : taskPOList) { + if (taskPO.getHostname().equals(hostname)) { + return taskPO; + } + } + + return null; } } diff --git a/bigtop-manager-ui/src/components/service-add/choose-services.vue b/bigtop-manager-ui/src/components/service-add/choose-services.vue index b1161357..3b193dc8 100644 --- a/bigtop-manager-ui/src/components/service-add/choose-services.vue +++ b/bigtop-manager-ui/src/components/service-add/choose-services.vue @@ -18,18 +18,18 @@ -->