diff --git a/bigtop-manager-agent/pom.xml b/bigtop-manager-agent/pom.xml index e42589c99d072e94cbc443aff0f9e7d5ae8ae24c..192d66a1a026284d2c5426063f2fcea8458f7005 100644 --- a/bigtop-manager-agent/pom.xml +++ b/bigtop-manager-agent/pom.xml @@ -97,6 +97,7 @@ + org.apache.maven.plugins maven-assembly-plugin diff --git a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/AgentApplication.java b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/AgentApplication.java index 080d27eb02a0ccc903c0f775aed7a855c677417c..dfa74390a7828cc4588224d4314c7a340cde1cb5 100644 --- a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/AgentApplication.java +++ b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/AgentApplication.java @@ -3,7 +3,7 @@ package org.apache.bigtop.manager.agent; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication(scanBasePackages = "org.apache.bigtop.manager") +@SpringBootApplication(scanBasePackages = {"org.apache.bigtop.manager.agent", "org.apache.bigtop.manager.common"}) public class AgentApplication { public static void main(String[] args) { diff --git a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/CommandPayload.java b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/CommandPayload.java index aaa647f4e1be2d75d1f0f3ed37b324405749db5d..a73e50d00af5e603a53d9e59a44bb884decf68a9 100644 --- a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/CommandPayload.java +++ b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/CommandPayload.java @@ -1,13 +1,14 @@ package org.apache.bigtop.manager.common.message.type; -import lombok.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.message.type.pojo.CustomCommandInfo; import org.apache.bigtop.manager.common.message.type.pojo.OSSpecificInfo; import org.apache.bigtop.manager.common.message.type.pojo.ScriptInfo; import java.util.List; -import java.util.Map; @Data @ToString(callSuper = true) diff --git a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/pojo/ClusterInfo.java b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/pojo/ClusterInfo.java index c54201730458d1332e9438f5ba187bb7d2afeba3..208dbc28f0d5cf3b451c855abf7c8413409ac18a 100644 --- a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/pojo/ClusterInfo.java +++ b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/type/pojo/ClusterInfo.java @@ -3,7 +3,6 @@ package org.apache.bigtop.manager.common.message.type.pojo; import lombok.Data; import java.util.List; -import java.util.Set; @Data public class ClusterInfo { @@ -20,5 +19,5 @@ public class ClusterInfo { private String repoTemplate; - private Set packages; + private List packages; } diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Job.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Job.java index 7bd4034b282d5e09997b80f76955cb29c4589327..3d3395f37bbd9ebb3303cc9a63c97439f63632b0 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Job.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Job.java @@ -26,6 +26,11 @@ public class Job extends BaseEntity { @Column(name = "name") private String name; + @Lob + @Basic(fetch = FetchType.LAZY) + @Column(name = "payload", length = 16777216) + private String payload; + @ManyToOne @JoinColumn(name = "cluster_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Cluster cluster; diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Stage.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Stage.java index ae2b96f1f8240a516b70b3f7e9effcbda7d26ddc..5a349ce676227e058e22791683f00f38edb561c1 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Stage.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Stage.java @@ -38,8 +38,8 @@ public class Stage extends BaseEntity { @Lob @Basic(fetch = FetchType.LAZY) - @Column(name = "payload", length = 16777216) - private String payload; + @Column(name = "context", length = 16777216) + private String context; @ManyToOne @JoinColumn(name = "job_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @@ -52,8 +52,4 @@ public class Stage extends BaseEntity { @ToString.Exclude @OneToMany(mappedBy = "stage") private List tasks; - - @Column(name = "callback_class_name") - private String callbackClassName; - } diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostComponentRepository.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostComponentRepository.java index 079270065cbd6cdbac5e703dd1ac18d85e8beee8..5401c6e2104bc14a4d4c765d1572f3391d95871e 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostComponentRepository.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostComponentRepository.java @@ -10,6 +10,8 @@ public interface HostComponentRepository extends JpaRepository findAllByComponentClusterIdAndComponentComponentName(Long clusterId, String componentName); + HostComponent findByComponentClusterIdAndComponentComponentNameAndHostHostname(Long clusterId, String componentName, String hostnames); + List findAllByComponentClusterIdAndComponentComponentNameAndHostHostnameIn(Long clusterId, String componentName, List hostnames); List findAllByComponentClusterId(Long clusterId); diff --git a/bigtop-manager-server/pom.xml b/bigtop-manager-server/pom.xml index 9704f661ae87a7ebaa68acb6db56ea1af355382a..ed88f5f391b2e584497eac5f7975b1043c5a59da 100644 --- a/bigtop-manager-server/pom.xml +++ b/bigtop-manager-server/pom.xml @@ -200,6 +200,7 @@ + org.apache.maven.plugins maven-assembly-plugin diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java index 308d1badc79c6243f245bd35d0557251f0a35b09..e5261f1db986d46af0b184530ea6bea252c4e718 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java @@ -11,9 +11,9 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @EnableAsync @EnableJpaAuditing -@SpringBootApplication(scanBasePackages = {"org.apache.bigtop.manager"}) -@EnableJpaRepositories("org.apache.bigtop.manager") -@EntityScan("org.apache.bigtop.manager") +@SpringBootApplication(scanBasePackages = {"org.apache.bigtop.manager.server", "org.apache.bigtop.manager.common"}) +@EnableJpaRepositories("org.apache.bigtop.manager.dao.repository") +@EntityScan("org.apache.bigtop.manager.dao.entity") public class ServerApplication { public static void main(String[] args) { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/CommandIdentifier.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/CommandIdentifier.java similarity index 87% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/CommandIdentifier.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/CommandIdentifier.java index 4b6e52eb72e9b287f75abc86da1a9e9564e90201..3960fd4c9d961c7805f7936f9fbb808bedc59053 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/CommandIdentifier.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/CommandIdentifier.java @@ -1,4 +1,4 @@ -package org.apache.bigtop.manager.server.job; +package org.apache.bigtop.manager.server.command; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/event/CommandEvent.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/event/CommandEvent.java similarity index 82% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/event/CommandEvent.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/event/CommandEvent.java index 5683d0e970781305976614b1fb987d19f6ff724f..f93923a2ef954f6493312d0a84ead52de9969c86 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/event/CommandEvent.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/event/CommandEvent.java @@ -1,4 +1,4 @@ -package org.apache.bigtop.manager.server.job.event; +package org.apache.bigtop.manager.server.command.event; import lombok.Getter; import lombok.Setter; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/AbstractJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/AbstractJobFactory.java similarity index 81% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/AbstractJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/AbstractJobFactory.java index 0e25468f119de476f5d80e31509d181f63119c3d..0064bf546bba1b02404fe95f0ce7e20ecb0c5976 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/AbstractJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/AbstractJobFactory.java @@ -1,6 +1,7 @@ -package org.apache.bigtop.manager.server.job.factory; +package org.apache.bigtop.manager.server.command.job.factory; import jakarta.annotation.Resource; +import org.apache.bigtop.manager.common.utils.JsonUtils; import org.apache.bigtop.manager.common.enums.JobState; import org.apache.bigtop.manager.dao.entity.Cluster; import org.apache.bigtop.manager.dao.entity.Job; @@ -11,6 +12,7 @@ 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 java.util.ArrayList; import java.util.List; public abstract class AbstractJobFactory implements JobFactory { @@ -33,6 +35,8 @@ public abstract class AbstractJobFactory implements JobFactory { protected Job job; + protected List stages = new ArrayList<>(); + @Override public Job createJob(JobContext jobContext) { this.jobContext = jobContext; @@ -41,7 +45,7 @@ public abstract class AbstractJobFactory implements JobFactory { initJob(); // Create stages and tasks for job - job.setStages(createStagesAndTasks()); + createStagesAndTasks(); // Save job saveJob(); @@ -49,7 +53,7 @@ public abstract class AbstractJobFactory implements JobFactory { return this.job; } - protected abstract List createStagesAndTasks(); + protected abstract void createStagesAndTasks(); private void initJob() { Long clusterId = jobContext.getCommandDTO().getClusterId(); @@ -59,6 +63,8 @@ public abstract class AbstractJobFactory implements JobFactory { job.setName(jobContext.getCommandDTO().getContext()); job.setState(JobState.PENDING); job.setCluster(cluster); + job.setPayload(JsonUtils.writeAsString(jobContext.getCommandDTO())); + job.setStages(stages); } protected void saveJob() { @@ -69,12 +75,14 @@ public abstract class AbstractJobFactory implements JobFactory { stage.setCluster(cluster); stage.setJob(job); stage.setStageOrder(i + 1); + stage.setState(JobState.PENDING); stageRepository.save(stage); for (Task task : stage.getTasks()) { task.setCluster(cluster); task.setJob(job); task.setStage(stage); + task.setState(JobState.PENDING); taskRepository.save(task); } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobContext.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobContext.java similarity index 77% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobContext.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobContext.java index b603be65606870f52da515948278a93344a4f88b..da03c5c4022fd3446e16007a7a155d8553baa7c2 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobContext.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobContext.java @@ -1,4 +1,4 @@ -package org.apache.bigtop.manager.server.job.factory; +package org.apache.bigtop.manager.server.command.job.factory; import lombok.Data; import org.apache.bigtop.manager.server.model.dto.ClusterDTO; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobFactories.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactories.java similarity index 93% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobFactories.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactories.java index c520cc5fcbe402d31a24d5d17afd1cdb85725f58..276823bdaa4d335d88d6cd946ce783885ab6463f 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobFactories.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactories.java @@ -1,10 +1,10 @@ -package org.apache.bigtop.manager.server.job.factory; +package org.apache.bigtop.manager.server.command.job.factory; import lombok.extern.slf4j.Slf4j; import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.server.exception.ApiException; import org.apache.bigtop.manager.server.holder.SpringContextHolder; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import java.util.HashMap; import java.util.Map; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactory.java similarity index 57% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactory.java index 2af17fa5ef5faabacc152d2169a7c7afbea8eb9e..c29cb4382fd86fd88c3fe4acbf4204e74933d941 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/JobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/JobFactory.java @@ -1,6 +1,6 @@ -package org.apache.bigtop.manager.server.job.factory; +package org.apache.bigtop.manager.server.command.job.factory; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.dao.entity.Job; public interface JobFactory { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/cluster/AbstractClusterJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/AbstractClusterJobFactory.java similarity index 35% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/cluster/AbstractClusterJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/AbstractClusterJobFactory.java index 7c50bebd00a2ba0aafb934d2213b125de2a82989..5747b791c67eb279fa60dbb76b002f0455b10ffa 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/cluster/AbstractClusterJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/AbstractClusterJobFactory.java @@ -1,6 +1,6 @@ -package org.apache.bigtop.manager.server.job.factory.cluster; +package org.apache.bigtop.manager.server.command.job.factory.cluster; -import org.apache.bigtop.manager.server.job.factory.AbstractJobFactory; +import org.apache.bigtop.manager.server.command.job.factory.AbstractJobFactory; public abstract class AbstractClusterJobFactory extends AbstractJobFactory { 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 new file mode 100644 index 0000000000000000000000000000000000000000..9dcfdd89ce643174f4ae89f3362cf30fd63bf7dd --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/cluster/ClusterCreateJobFactory.java @@ -0,0 +1,30 @@ +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.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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ClusterCreateJobFactory extends AbstractClusterJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.CLUSTER, Command.CREATE); + } + + @Override + public void createStagesAndTasks() { + StageContext stageContext = StageContext.fromPayload(JsonUtils.writeAsString(jobContext.getCommandDTO())); + stages.add(StageFactories.getStageFactory(StageType.HOST_CHECK).createStage(stageContext)); + stages.add(StageFactories.getStageFactory(StageType.HOST_CACHE).createStage(stageContext)); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/AbstractComponentJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/AbstractComponentJobFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..06664f287c7eaf26cd7793ce0df95333dfb1d930 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/AbstractComponentJobFactory.java @@ -0,0 +1,7 @@ +package org.apache.bigtop.manager.server.command.job.factory.component; + +import org.apache.bigtop.manager.server.command.job.factory.AbstractJobFactory; + +public abstract class AbstractComponentJobFactory extends AbstractJobFactory { + +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentCustomJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentInstallJobFactory.java similarity index 61% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentCustomJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentInstallJobFactory.java index 1e0da1e4dce02a636c6f5c0e3f68019065334ef3..5123fe8c9c04c0f6405f1b0805ed30954134cb6f 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentCustomJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentInstallJobFactory.java @@ -1,20 +1,24 @@ -package org.apache.bigtop.manager.server.job.factory.component; +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.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @Slf4j @org.springframework.stereotype.Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ComponentCustomJobFactory extends AbstractComponentJobFactory implements StageCallback { +public class ComponentInstallJobFactory extends AbstractComponentJobFactory { @Override public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.COMPONENT, Command.CUSTOM_COMMAND); + return new CommandIdentifier(CommandLevel.COMPONENT, Command.INSTALL); + } + + @Override + public void createStagesAndTasks() { + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentRestartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentRestartJobFactory.java similarity index 71% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentRestartJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentRestartJobFactory.java index 7d00ead0703eba881091f29be69e9e92608e3f6e..7f35745a36f340d040569fd4b15f0b3577a08e99 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentRestartJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentRestartJobFactory.java @@ -1,20 +1,24 @@ -package org.apache.bigtop.manager.server.job.factory.component; +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.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @Slf4j @org.springframework.stereotype.Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ComponentRestartJobFactory extends AbstractComponentJobFactory implements StageCallback { +public class ComponentRestartJobFactory extends AbstractComponentJobFactory { @Override public CommandIdentifier getCommandIdentifier() { return new CommandIdentifier(CommandLevel.COMPONENT, Command.RESTART); } + + @Override + public void createStagesAndTasks() { + + } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..ad3a46a8c3f23e0935f03d43d140d9d8ee804a1b --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStartJobFactory.java @@ -0,0 +1,24 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStartJobFactory extends AbstractComponentJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.COMPONENT, Command.START); + } + + @Override + public void createStagesAndTasks() { + + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..7f381321b3b3e405d6b87e78baf608dc54e8ca69 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/component/ComponentStopJobFactory.java @@ -0,0 +1,24 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStopJobFactory extends AbstractComponentJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.COMPONENT, Command.STOP); + } + + @Override + public void createStagesAndTasks() { + + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/host/AbstractHostJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/AbstractHostJobFactory.java similarity index 34% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/host/AbstractHostJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/AbstractHostJobFactory.java index d8e5eece4771b3298096fbad06ca420cd5abe96b..20e49eb953d99b4bcc0a3d5a379fb609de12acdc 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/host/AbstractHostJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/AbstractHostJobFactory.java @@ -1,6 +1,6 @@ -package org.apache.bigtop.manager.server.job.factory.host; +package org.apache.bigtop.manager.server.command.job.factory.host; -import org.apache.bigtop.manager.server.job.factory.AbstractJobFactory; +import org.apache.bigtop.manager.server.command.job.factory.AbstractJobFactory; public abstract class AbstractHostJobFactory extends AbstractJobFactory { 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 new file mode 100644 index 0000000000000000000000000000000000000000..a013b1010403b01232c919ba0e89e06180aaa169 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/host/HostAddJobFactory.java @@ -0,0 +1,29 @@ +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.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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class HostAddJobFactory extends AbstractHostJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.HOST, Command.INSTALL); + } + + public void createStagesAndTasks() { + StageContext stageContext = StageContext.fromPayload(JsonUtils.writeAsString(jobContext.getCommandDTO())); + stages.add(StageFactories.getStageFactory(StageType.HOST_CHECK).createStage(stageContext)); + stages.add(StageFactories.getStageFactory(StageType.HOST_CACHE).createStage(stageContext)); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/AbstractServiceJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/AbstractServiceJobFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..04de2f5e6116094be717b8f10b81e03f32570f78 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/AbstractServiceJobFactory.java @@ -0,0 +1,215 @@ +package org.apache.bigtop.manager.server.command.job.factory.service; + +import jakarta.annotation.Resource; +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.server.command.job.factory.AbstractJobFactory; +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.exception.ServerException; +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.StackDTO; +import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; +import org.apache.bigtop.manager.dao.entity.Component; +import org.apache.bigtop.manager.dao.entity.Host; +import org.apache.bigtop.manager.dao.entity.HostComponent; +import org.apache.bigtop.manager.dao.repository.ComponentRepository; +import org.apache.bigtop.manager.dao.repository.HostComponentRepository; +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.lang3.tuple.ImmutablePair; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * A Service Job can be seen as a collection of multiple Components and Hosts, + * so it can directly inherit from AbstractComponentJobFactory. + */ +public abstract class AbstractServiceJobFactory extends AbstractJobFactory { + + @Resource + private ComponentRepository componentRepository; + + @Resource + private HostComponentRepository hostComponentRepository; + + protected String stackName; + + protected String stackVersion; + + protected Map serviceNameToDTO; + + protected Map componentNameToDTO; + + protected DAG dag; + + protected void initAttrs() { + stackName = cluster.getStack().getStackName(); + stackVersion = cluster.getStack().getStackVersion(); + + Map>> stackKeyMap = StackUtils.getStackKeyMap(); + ImmutablePair> immutablePair = stackKeyMap.get(StackUtils.fullStackName(stackName, stackVersion)); + + serviceNameToDTO = immutablePair.getRight() + .stream() + .collect(Collectors.toMap(ServiceDTO::getServiceName, Function.identity())); + + componentNameToDTO = immutablePair.getRight() + .stream() + .flatMap(serviceDTO -> serviceDTO.getComponents().stream()) + .collect(Collectors.toMap(ComponentDTO::getComponentName, Function.identity())); + + dag = StackUtils.getStackDagMap().get(StackUtils.fullStackName(stackName, stackVersion)); + } + + protected StageContext createStageContext(String serviceName, String componentName) { + return createStageContext(serviceName, componentName, findHostnamesByComponentName(componentName)); + } + + protected StageContext createStageContext(String serviceName, String componentName, List hostnames) { + ServiceDTO serviceDTO = serviceNameToDTO.get(serviceName); + ComponentDTO componentDTO = componentNameToDTO.get(componentName); + + StageContext stageContext = StageContext.fromPayload(JsonUtils.writeAsString(jobContext.getCommandDTO())); + 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 components = componentRepository.findAllByClusterIdAndServiceServiceNameIn(cluster.getId(), serviceNames); + + return components.stream().map(Component::getComponentName).toList(); + } + + protected String findServiceNameByComponentName(String componentName) { + for (ServiceDTO serviceDTO : serviceNameToDTO.values()) { + for (ComponentDTO componentDTO : serviceDTO.getComponents()) { + if (componentDTO.getComponentName().equals(componentName)) { + return serviceDTO.getServiceName(); + } + } + } + + return null; + } + + protected Boolean isMasterComponent(String componentName) { + ComponentDTO componentDTO = componentNameToDTO.get(componentName); + return componentDTO.getCategory().equalsIgnoreCase("master"); + } + + protected List findHostnamesByComponentName(String componentName) { + List hostComponents = hostComponentRepository.findAllByComponentClusterIdAndComponentComponentName(cluster.getId(), componentName); + if (hostComponents == null) { + return new ArrayList<>(); + } else { + return hostComponents.stream().map(HostComponent::getHost).map(Host::getHostname).toList(); + } + } + + protected void createCacheStage() { + StageContext stageContext = StageContext.fromPayload(JsonUtils.writeAsString(jobContext.getCommandDTO())); + stageContext.setStackName(stackName); + stageContext.setStackVersion(stackVersion); + stages.add(StageFactories.getStageFactory(StageType.HOST_CACHE).createStage(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); + + StageContext stageContext = createStageContext(serviceName, componentName); + stages.add(StageFactories.getStageFactory(StageType.COMPONENT_INSTALL).createStage(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)) { + continue; + } + + StageContext stageContext = createStageContext(serviceName, componentName); + stages.add(StageFactories.getStageFactory(StageType.COMPONENT_START).createStage(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)) { + continue; + } + + StageContext stageContext = createStageContext(serviceName, componentName); + stages.add(StageFactories.getStageFactory(StageType.COMPONENT_STOP).createStage(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); + List hostnames = findHostnamesByComponentName(componentName); + + if (!isMasterComponent(componentName)) { + continue; + } + + StageContext stageContext = createStageContext(serviceName, componentName, List.of(hostnames.get(0))); + stages.add(StageFactories.getStageFactory(StageType.COMPONENT_CHECK).createStage(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/factory/service/ServiceConfigureJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceConfigureJobFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c2b43bad13c3a4df86a8fc25a49b7a48e91bcf88 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceConfigureJobFactory.java @@ -0,0 +1,26 @@ +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.enums.CommandLevel; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceConfigureJobFactory extends AbstractServiceJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.CONFIGURE); + } + + @Override + public void createStagesAndTasks() { + super.initAttrs(); + + super.createCacheStage(); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..4483b65852938b05da55153945e248cff5a81371 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceInstallJobFactory.java @@ -0,0 +1,72 @@ +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.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 java.util.ArrayList; +import java.util.List; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceInstallJobFactory extends AbstractServiceJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.INSTALL); + } + + /** + * create job and persist it to database + */ + @Override + protected void createStagesAndTasks() { + super.initAttrs(); + + // Install components + super.createInstallStages(); + + // Cache configs when 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)) { + return componentHost.getHostnames(); + } + } + } + + return new ArrayList<>(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceRestartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceRestartJobFactory.java similarity index 65% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceRestartJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceRestartJobFactory.java index 4f296543098424d4e3a5ff7450b8c2da62315a67..d5ec8d5a84425550b77e4e53d7bac8048c0242bf 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceRestartJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceRestartJobFactory.java @@ -1,20 +1,28 @@ -package org.apache.bigtop.manager.server.job.factory.service; +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.enums.CommandLevel; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @Slf4j @org.springframework.stereotype.Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ServiceRestartJobFactory extends AbstractServiceJobFactory implements StageCallback { +public class ServiceRestartJobFactory extends AbstractServiceJobFactory { @Override public CommandIdentifier getCommandIdentifier() { return new CommandIdentifier(CommandLevel.SERVICE, Command.RESTART); } + + @Override + protected void createStagesAndTasks() { + super.initAttrs(); + + super.createStopStages(); + + super.createStartStages(); + } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..fdee2fd148a69afe693857f64db8e045f856724e --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStartJobFactory.java @@ -0,0 +1,26 @@ +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.enums.CommandLevel; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceStartJobFactory extends AbstractServiceJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.START); + } + + @Override + protected void createStagesAndTasks() { + super.initAttrs(); + + super.createStartStages(); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..66b4e4402aaa94522ce7035f97b8e7e61a18d6b9 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/factory/service/ServiceStopJobFactory.java @@ -0,0 +1,26 @@ +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.enums.CommandLevel; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceStopJobFactory extends AbstractServiceJobFactory { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.STOP); + } + + @Override + protected void createStagesAndTasks() { + super.initAttrs(); + + super.createStopStages(); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/AbstractJobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/AbstractJobRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..9605efe784857ac398d3f19593b532c8a4b50a21 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/AbstractJobRunner.java @@ -0,0 +1,99 @@ +package org.apache.bigtop.manager.server.command.job.runner; + +import jakarta.annotation.Resource; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.server.command.stage.runner.StageRunner; +import org.apache.bigtop.manager.server.command.stage.runner.StageRunners; +import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.server.model.dto.CommandDTO; +import org.apache.bigtop.manager.dao.entity.Job; +import org.apache.bigtop.manager.dao.entity.Stage; +import org.apache.bigtop.manager.dao.entity.Task; +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 java.util.Comparator; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +public abstract class AbstractJobRunner implements JobRunner { + + @Resource + private JobRepository jobRepository; + + @Resource + private StageRepository stageRepository; + + @Resource + private TaskRepository taskRepository; + + protected Job job; + + @Override + public void setJob(Job job) { + this.job = job; + } + + @Override + public void run() { + beforeRun(); + + // Sort stage + List stages = job.getStages(); + stages.sort(Comparator.comparingInt(Stage::getStageOrder)); + + boolean success = true; + LinkedBlockingQueue queue = new LinkedBlockingQueue<>(stages); + while (!queue.isEmpty()) { + Stage stage = queue.poll(); + StageRunner runner = StageRunners.getStageRunner(stage); + runner.run(); + + if (stage.getState() == JobState.FAILED) { + success = false; + break; + } + } + + if (success) { + onSuccess(); + } else { + onFailure(); + } + } + + @Override + public void beforeRun() { + job.setState(JobState.PROCESSING); + jobRepository.save(job); + } + + @Override + public void onSuccess() { + job.setState(JobState.SUCCESSFUL); + jobRepository.save(job); + } + + @Override + public void onFailure() { + job.setState(JobState.FAILED); + jobRepository.save(job); + + for (Stage stage : job.getStages()) { + if (stage.getState() == JobState.PENDING) { + stage.setState(JobState.CANCELED); + stageRepository.save(stage); + + for (Task task : stage.getTasks()) { + task.setState(JobState.CANCELED); + taskRepository.save(task); + } + } + } + } + + protected CommandDTO getCommandDTO() { + return JsonUtils.readFromString(job.getPayload(), CommandDTO.class); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/JobRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/JobRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..17486a00c7b5a45c257206cdd805083c2da75115 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/JobRunner.java @@ -0,0 +1,19 @@ +package org.apache.bigtop.manager.server.command.job.runner; + +import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.dao.entity.Job; + +public interface JobRunner { + + CommandIdentifier getCommandIdentifier(); + + void setJob(Job job); + + void beforeRun(); + + void run(); + + void onSuccess(); + + void onFailure(); +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/JobRunners.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/JobRunners.java new file mode 100644 index 0000000000000000000000000000000000000000..4bfffab1779e7dd4dc9ea7fce31e63ffe92264f9 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/JobRunners.java @@ -0,0 +1,60 @@ +package org.apache.bigtop.manager.server.command.job.runner; + +import lombok.extern.slf4j.Slf4j; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; +import org.apache.bigtop.manager.server.exception.ApiException; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.server.model.dto.CommandDTO; +import org.apache.bigtop.manager.dao.entity.Job; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +@Slf4j +public class JobRunners { + + private static final AtomicBoolean LOADED = new AtomicBoolean(false); + + private static final Map JOB_RUNNERS = new HashMap<>(); + + public static JobRunner getJobRunner(Job job) { + if (!LOADED.get()) { + load(); + } + + CommandDTO commandDTO = JsonUtils.readFromString(job.getPayload(), CommandDTO.class); + CommandIdentifier identifier = new CommandIdentifier(commandDTO.getCommandLevel(), commandDTO.getCommand()); + if (!JOB_RUNNERS.containsKey(identifier)) { + throw new ApiException(ApiExceptionEnum.COMMAND_NOT_SUPPORTED, identifier.getCommand().toLowerCase(), identifier.getCommandLevel().toLowerCase()); + } + + String beanName = JOB_RUNNERS.get(identifier); + JobRunner runner = SpringContextHolder.getApplicationContext().getBean(beanName, JobRunner.class); + runner.setJob(job); + + return runner; + } + + private static synchronized void load() { + if (LOADED.get()) { + return; + } + + for (Map.Entry entry : SpringContextHolder.getJobRunners().entrySet()) { + String beanName = entry.getKey(); + JobRunner jobRunner = entry.getValue(); + if (JOB_RUNNERS.containsKey(jobRunner.getCommandIdentifier())) { + log.error("Duplicate JobRunner with identifier: {}", jobRunner.getCommandIdentifier()); + continue; + } + + JOB_RUNNERS.put(jobRunner.getCommandIdentifier(), beanName); + log.info("Load JobRunner: {} with identifier: {}", jobRunner.getClass().getName(), jobRunner.getCommandIdentifier()); + } + + LOADED.set(true); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceConfigureJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/cluster/ClusterCreateJobRunner.java similarity index 32% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceConfigureJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/cluster/ClusterCreateJobRunner.java index a3fddcdf659d8609cb97a2b0694ca7aea07b44af..a7025011acadd1ff45134ddff34ecc195dc37533 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceConfigureJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/cluster/ClusterCreateJobRunner.java @@ -1,61 +1,70 @@ -package org.apache.bigtop.manager.server.job.factory.service; +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.utils.JsonUtils; +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.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.helper.HostCacheStageHelper; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; +import org.apache.bigtop.manager.server.model.dto.ClusterDTO; import org.apache.bigtop.manager.server.model.dto.CommandDTO; -import org.apache.bigtop.manager.server.model.dto.ServiceConfigDTO; -import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; +import org.apache.bigtop.manager.server.model.mapper.ClusterMapper; import org.apache.bigtop.manager.dao.entity.Cluster; import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.repository.ClusterRepository; -import org.apache.bigtop.manager.server.service.ConfigService; -import org.springframework.beans.BeanUtils; +import org.apache.bigtop.manager.dao.entity.Task; +import org.apache.bigtop.manager.dao.repository.*; +import org.apache.bigtop.manager.server.service.ClusterService; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; -import java.util.List; - @Slf4j @org.springframework.stereotype.Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ServiceConfigureJobFactory extends AbstractServiceJobFactory implements StageCallback { +public class ClusterCreateJobRunner extends AbstractJobRunner { @Resource - private HostCacheStageHelper hostCacheStageHelper; + private ClusterService clusterService; @Resource private ClusterRepository clusterRepository; @Resource - private ConfigService configService; + private JobRepository jobRepository; + + @Resource + private StageRepository stageRepository; + + @Resource + private TaskRepository taskRepository; @Override public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.SERVICE, Command.CONFIGURE); + return new CommandIdentifier(CommandLevel.CLUSTER, Command.CREATE); } @Override - public List createStagesAndTasks() { - String callbackClassName = this.getClass().getName(); - String payload = JsonUtils.writeAsString(jobContext.getCommandDTO()); - return List.of(hostCacheStageHelper.createStage(cluster.getId(), callbackClassName, payload)); - } + public void onSuccess() { + super.onSuccess(); - @Override - public void beforeStage(Stage stage) { - CommandDTO commandDTO = JsonUtils.readFromString(stage.getPayload(), CommandDTO.class); - - Cluster cluster = clusterRepository.getReferenceById(commandDTO.getClusterId()); - for (ServiceCommandDTO serviceCommand : commandDTO.getServiceCommands()) { - ServiceConfigDTO serviceConfigDTO = new ServiceConfigDTO(); - BeanUtils.copyProperties(serviceCommand, serviceConfigDTO); - configService.updateConfig(cluster, serviceConfigDTO); + // Save Cluster + CommandDTO commandDTO = JsonUtils.readFromString(job.getPayload(), CommandDTO.class); + ClusterDTO clusterDTO = ClusterMapper.INSTANCE.fromCommand2DTO(commandDTO.getClusterCommand()); + clusterService.save(clusterDTO); + + // Link job to cluster after cluster successfully added + Cluster cluster = clusterRepository.findByClusterName(commandDTO.getClusterCommand().getClusterName()).orElse(new Cluster()); + job.setCluster(cluster); + jobRepository.save(job); + + for (Stage stage : job.getStages()) { + stage.setCluster(cluster); + stageRepository.save(stage); + + for (Task task : stage.getTasks()) { + task.setCluster(cluster); + taskRepository.save(task); + } } } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..525bbc712ccbe11c01f34b9c7e4b25657a8bba82 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentInstallJobRunner.java @@ -0,0 +1,20 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentInstallJobRunner extends AbstractJobRunner { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.COMPONENT, Command.INSTALL); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..3b8887dec4d32fbc1b8de127310b8c822d278207 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentRestartJobRunner.java @@ -0,0 +1,20 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentRestartJobRunner extends AbstractJobRunner { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.COMPONENT, Command.RESTART); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..4dd46108d1bbae36d2a0ec32d705b4a4e38b453d --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStartJobRunner.java @@ -0,0 +1,20 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStartJobRunner extends AbstractJobRunner { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.COMPONENT, Command.START); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..cf4b0bc43d74d32ba37ba26c5c893de42e354bfa --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/component/ComponentStopJobRunner.java @@ -0,0 +1,20 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStopJobRunner extends AbstractJobRunner { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.COMPONENT, Command.STOP); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..4b0dd6c447726e3632b59fbe28cbea835efa97e4 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/host/HostAddJobRunner.java @@ -0,0 +1,41 @@ +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.common.utils.JsonUtils; +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.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 java.util.List; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class HostAddJobRunner extends AbstractJobRunner { + + @Resource + private HostService hostService; + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.HOST, Command.INSTALL); + } + + @Override + public void onSuccess() { + super.onSuccess(); + + CommandDTO commandDTO = JsonUtils.readFromString(job.getPayload(), CommandDTO.class); + List hostCommands = commandDTO.getHostCommands(); + + List hostnames = hostCommands.stream().map(HostCommandDTO::getHostname).toList(); + hostService.batchSave(job.getCluster().getId(), hostnames); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceCustomJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceConfigureJobRunner.java similarity index 62% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceCustomJobFactory.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceConfigureJobRunner.java index 574d5d86a78ab6e2a0cf019e5347cb999ec408bd..003ecdc2bdb1d971c6e9c64725751b51e5f21ab9 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceCustomJobFactory.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceConfigureJobRunner.java @@ -1,20 +1,20 @@ -package org.apache.bigtop.manager.server.job.factory.service; +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.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @Slf4j @org.springframework.stereotype.Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ServiceCustomJobFactory extends AbstractServiceJobFactory implements StageCallback { +public class ServiceConfigureJobRunner extends AbstractJobRunner { @Override public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.SERVICE, Command.CUSTOM_COMMAND); + return new CommandIdentifier(CommandLevel.SERVICE, Command.CONFIGURE); } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..6d9118c3466cc307fcb5373ede68f762d6552540 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceInstallJobRunner.java @@ -0,0 +1,32 @@ +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.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.job.runner.AbstractJobRunner; +import org.apache.bigtop.manager.server.enums.CommandLevel; +import org.apache.bigtop.manager.server.service.ServiceService; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceInstallJobRunner extends AbstractJobRunner { + + @Resource + private ServiceService serviceService; + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.INSTALL); + } + + @Override + public void beforeRun() { + super.beforeRun(); + + serviceService.saveByCommand(getCommandDTO()); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..842a559583cc4b8ad5209df14704abbde0d0a51a --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceRestartJobRunner.java @@ -0,0 +1,20 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceRestartJobRunner extends AbstractJobRunner { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.RESTART); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..a08095f9f92a335a4213851845e6a170d6db5e6a --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStartJobRunner.java @@ -0,0 +1,20 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceStartJobRunner extends AbstractJobRunner { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.START); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..edc378cce6c6ed6a07c2e0c17b0c16873fed5c1a --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/runner/service/ServiceStopJobRunner.java @@ -0,0 +1,20 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceStopJobRunner extends AbstractJobRunner { + + @Override + public CommandIdentifier getCommandIdentifier() { + return new CommandIdentifier(CommandLevel.SERVICE, Command.STOP); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/scheduler/DefaultJobScheduler.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/scheduler/DefaultJobScheduler.java new file mode 100644 index 0000000000000000000000000000000000000000..f26268afe97291faf411cd5ff409b64ce88f727a --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/scheduler/DefaultJobScheduler.java @@ -0,0 +1,53 @@ +package org.apache.bigtop.manager.server.command.job.scheduler; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +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.dao.entity.Job; +import org.springframework.stereotype.Component; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +@Slf4j +@Component +public class DefaultJobScheduler implements JobScheduler { + + private final LinkedBlockingQueue queue = new LinkedBlockingQueue<>(); + + private final Executor executor = Executors.newSingleThreadExecutor(); + + private volatile boolean running = true; + + @Override + public void submit(Job job) { + queue.offer(job); + } + + @Override + public void start() { + running = true; + } + + @Override + public void stop() { + running = false; + } + + @PostConstruct + public void init() { + executor.execute(() -> { + while (running) { + try { + Job job = queue.take(); + JobRunner runner = JobRunners.getJobRunner(job); + runner.run(); + } catch (InterruptedException e) { + log.warn("Error when polling new job", e); + } + } + }); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/scheduler/JobScheduler.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/scheduler/JobScheduler.java new file mode 100644 index 0000000000000000000000000000000000000000..25856e86a3088ee9a3fca69ac6bc94987bab2ce7 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/scheduler/JobScheduler.java @@ -0,0 +1,28 @@ +package org.apache.bigtop.manager.server.command.job.scheduler; + +import org.apache.bigtop.manager.dao.entity.Job; + +/** + * JobScheduler interface for job management. + * This interface provides methods to submit, start, and stop jobs. + */ +public interface JobScheduler { + + /** + * Submits a job to the job scheduler. + * @param job The job to be submitted. + */ + void submit(Job job); + + /** + * Starts the job scheduler. + * This method should be called after all jobs have been submitted. + */ + void start(); + + /** + * Stops the job scheduler. + * This method should be called to gracefully stop the job scheduler. + */ + void stop(); +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ClusterCreateValidator.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ClusterCreateValidator.java similarity index 91% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ClusterCreateValidator.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ClusterCreateValidator.java index 32c2c9d2e3614ffc36862990f3fec4e468c860ec..286f9be7c29e99f534c1b47c7c275d2186443295 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ClusterCreateValidator.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ClusterCreateValidator.java @@ -1,11 +1,11 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import jakarta.annotation.Resource; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.server.enums.CommandLevel; import org.apache.bigtop.manager.server.exception.ApiException; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.model.dto.command.ClusterCommandDTO; import org.apache.bigtop.manager.dao.entity.Cluster; import org.apache.bigtop.manager.dao.repository.ClusterRepository; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ClusterHostValidator.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ClusterHostValidator.java similarity index 91% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ClusterHostValidator.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ClusterHostValidator.java index f2a1872f47b6dd513da6e9ccb065e33d0f0dc360..bb77cda04eb83597b020e3a353952bd386629055 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ClusterHostValidator.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ClusterHostValidator.java @@ -1,11 +1,11 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import jakarta.annotation.Resource; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.server.enums.CommandLevel; import org.apache.bigtop.manager.server.exception.ApiException; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.model.dto.command.ClusterCommandDTO; import org.apache.bigtop.manager.dao.entity.Host; import org.apache.bigtop.manager.dao.repository.HostRepository; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/CommandValidator.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/CommandValidator.java similarity index 55% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/CommandValidator.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/CommandValidator.java index 993a4445268bfa9bfd4b2cf1e4463d6c9f90ab7b..43d9d4f6a745b359b086e0d4fe05c8df89b886fe 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/CommandValidator.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/CommandValidator.java @@ -1,6 +1,6 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import java.util.List; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/HostAddValidator.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/HostAddValidator.java similarity index 91% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/HostAddValidator.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/HostAddValidator.java index 40f9a1969e176978d3add1a5ba4d4c0831a769fa..03a2ff02a434c581b036bb390c9e80f57ab51982 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/HostAddValidator.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/HostAddValidator.java @@ -1,11 +1,11 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import jakarta.annotation.Resource; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.server.enums.CommandLevel; import org.apache.bigtop.manager.server.exception.ApiException; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.model.dto.command.HostCommandDTO; import org.apache.bigtop.manager.dao.entity.Host; import org.apache.bigtop.manager.dao.repository.HostRepository; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/RequiredServicesValidator.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/RequiredServicesValidator.java similarity index 96% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/RequiredServicesValidator.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/RequiredServicesValidator.java index 3016699dd7313561fbaff04b2ede2fa584003b36..2cdbb3d2b3ea33728300dd590cb3ea9f8e027ecb 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/RequiredServicesValidator.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/RequiredServicesValidator.java @@ -1,11 +1,11 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import jakarta.annotation.Resource; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.server.enums.CommandLevel; import org.apache.bigtop.manager.server.exception.ApiException; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.model.dto.CommandDTO; import org.apache.bigtop.manager.server.model.dto.ServiceDTO; import org.apache.bigtop.manager.server.model.dto.StackDTO; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ServiceHostValidator.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ServiceHostValidator.java similarity index 92% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ServiceHostValidator.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ServiceHostValidator.java index 2f85fc7b5a8da4f0856531c7a60222f391c049e1..2113b9e54d7e377e7c065b778e135bd2b00ddea4 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ServiceHostValidator.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ServiceHostValidator.java @@ -1,11 +1,11 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import jakarta.annotation.Resource; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.server.enums.CommandLevel; import org.apache.bigtop.manager.server.exception.ApiException; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.model.dto.CommandDTO; import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; import org.apache.bigtop.manager.dao.entity.Host; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/StackValidator.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/StackValidator.java similarity index 91% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/StackValidator.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/StackValidator.java index 0a8997a365722220dfe72a3a615961f579c4b634..0890e85cacfb063612642370eedd76219c903116 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/StackValidator.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/StackValidator.java @@ -1,11 +1,11 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import jakarta.annotation.Resource; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.server.enums.CommandLevel; import org.apache.bigtop.manager.server.exception.ApiException; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import org.apache.bigtop.manager.server.model.dto.command.ClusterCommandDTO; import org.apache.bigtop.manager.dao.entity.Stack; import org.apache.bigtop.manager.dao.repository.StackRepository; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ValidatorContext.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ValidatorContext.java similarity index 74% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ValidatorContext.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ValidatorContext.java index 0bd4c532c725209c22b4f3cd691442fba5e584bb..6f2f90f6ceef8c1b14cfd17db905feb9c82b99da 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ValidatorContext.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ValidatorContext.java @@ -1,4 +1,4 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import lombok.Data; import org.apache.bigtop.manager.server.model.dto.CommandDTO; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ValidatorExecutionChain.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ValidatorExecutionChain.java similarity index 81% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ValidatorExecutionChain.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ValidatorExecutionChain.java index 89ee04b4f8aeec8cf0cd6b6a3ec7a8b4183be91a..305b7c6e0d88b893ada94e1cc1f35d5956210b62 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/validator/ValidatorExecutionChain.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/validator/ValidatorExecutionChain.java @@ -1,7 +1,7 @@ -package org.apache.bigtop.manager.server.job.validator; +package org.apache.bigtop.manager.server.command.job.validator; import org.apache.bigtop.manager.server.holder.SpringContextHolder; -import org.apache.bigtop.manager.server.job.CommandIdentifier; +import org.apache.bigtop.manager.server.command.CommandIdentifier; import java.util.List; diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/listener/CommandEventListener.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/listener/CommandEventListener.java similarity index 38% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/listener/CommandEventListener.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/listener/CommandEventListener.java index 70b91eba12f27104fc32ad65d9933fc3aa968fcf..07c4134051ec7e4282e78ca013c384683d4a67ff 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/listener/CommandEventListener.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/listener/CommandEventListener.java @@ -14,24 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.bigtop.manager.server.job.listener; +package org.apache.bigtop.manager.server.command.listener; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.server.enums.CommandLevel; -import org.apache.bigtop.manager.server.enums.JobStrategyType; -import org.apache.bigtop.manager.server.job.event.CommandEvent; -import org.apache.bigtop.manager.server.job.strategy.AsyncJobStrategy; -import org.apache.bigtop.manager.server.model.dto.CommandDTO; -import org.apache.bigtop.manager.dao.entity.Cluster; +import org.apache.bigtop.manager.server.command.event.CommandEvent; +import org.apache.bigtop.manager.server.command.job.scheduler.JobScheduler; import org.apache.bigtop.manager.dao.entity.Job; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; -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.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionalEventListener; @@ -44,55 +34,14 @@ public class CommandEventListener { private JobRepository jobRepository; @Resource - private StageRepository stageRepository; - - @Resource - private TaskRepository taskRepository; - - @Resource - private ClusterRepository clusterRepository; - - @Resource - private AsyncJobStrategy asyncJobStrategy; + private JobScheduler jobScheduler; @Async @TransactionalEventListener public void listen(CommandEvent event) { - log.info("listen CommandEvent: {}", event); - CommandDTO commandDTO = (CommandDTO) event.getSource(); Long jobId = event.getJobId(); Job job = jobRepository.getReferenceById(jobId); - Boolean failed = asyncJobStrategy.handle(job, JobStrategyType.OVER_ON_FAIL); - log.info("[CommandEventListener] failed: {}", failed); - - // Reload job - job = jobRepository.getReferenceById(jobId); - - if (!failed) { - afterJobSuccess(job, commandDTO); - } - } - - private void afterJobSuccess(Job job, CommandDTO commandDTO) { - CommandLevel commandLevel = commandDTO.getCommandLevel(); - Command command = commandDTO.getCommand(); - if (commandLevel == CommandLevel.CLUSTER && command == Command.CREATE) { - // Link job to cluster after cluster successfully added - Cluster cluster = clusterRepository.findByClusterName(commandDTO.getClusterCommand().getClusterName()).orElse(new Cluster()); - job.setCluster(cluster); - - for (Stage stage : job.getStages()) { - stage.setCluster(cluster); - for (Task task : stage.getTasks()) { - task.setCluster(cluster); - } - - taskRepository.saveAll(stage.getTasks()); - } - - stageRepository.saveAll(job.getStages()); - jobRepository.save(job); - } + jobScheduler.submit(job); } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/AbstractStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/AbstractStageFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..87f9df435fdb2a7c074577a4b68d22bd3ba4a509 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/AbstractStageFactory.java @@ -0,0 +1,26 @@ +package org.apache.bigtop.manager.server.command.stage.factory; + +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.dao.entity.Stage; + +public abstract class AbstractStageFactory implements StageFactory { + + protected StageContext context; + + protected Stage stage; + + @Override + public Stage createStage(StageContext context) { + this.context = context; + this.context.setStageType(getStageType()); + + this.stage = new Stage(); + this.stage.setContext(JsonUtils.writeAsString(context)); + + doCreateStage(); + + return this.stage; + } + + protected abstract void doCreateStage(); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..ce516117b8a28524f83c9639300bed88acdd4ad4 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageContext.java @@ -0,0 +1,75 @@ +package org.apache.bigtop.manager.server.command.stage.factory; + +import lombok.Data; +import org.apache.bigtop.manager.common.utils.JsonUtils; +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.RepoDTO; +import org.apache.bigtop.manager.server.model.dto.ServiceDTO; +import org.apache.bigtop.manager.server.model.dto.command.ClusterCommandDTO; +import org.apache.bigtop.manager.server.model.dto.command.HostCommandDTO; + +import java.util.List; + +@Data +public class StageContext { + + private StageType stageType; + + private Long clusterId; + + private String clusterName; + + private String stackName; + + private String stackVersion; + + private List hostnames; + + private ServiceDTO serviceDTO; + + private ComponentDTO componentDTO; + + private List repoInfoList; + + public static StageContext fromPayload(String payload) { + StageContext context = new StageContext(); + CommandDTO commandDTO = JsonUtils.readFromString(payload, CommandDTO.class); + + context.setClusterId(commandDTO.getClusterId()); + + switch (commandDTO.getCommandLevel()) { + case CLUSTER -> fromClusterCommandPayload(context, commandDTO); + case HOST -> fromHostCommandPayload(context, commandDTO); + case SERVICE -> fromServiceCommandPayload(context, commandDTO); + case COMPONENT -> fromComponentCommandPayload(context, commandDTO); + } + + return context; + } + + private static void fromClusterCommandPayload(StageContext context, CommandDTO commandDTO) { + ClusterCommandDTO clusterCommand = commandDTO.getClusterCommand(); + + context.setClusterName(clusterCommand.getClusterName()); + context.setStackName(clusterCommand.getStackName()); + context.setStackVersion(clusterCommand.getStackVersion()); + context.setHostnames(clusterCommand.getHostnames()); + context.setRepoInfoList(clusterCommand.getRepoInfoList()); + } + + private static void fromHostCommandPayload(StageContext context, CommandDTO commandDTO) { + List hostCommands = commandDTO.getHostCommands(); + + List hostnames = hostCommands.stream().map(HostCommandDTO::getHostname).toList(); + context.setHostnames(hostnames); + } + + private static void fromServiceCommandPayload(StageContext context, CommandDTO commandDTO) { + // No need to set anything here, we should deal with this in the service job factory + } + + private static void fromComponentCommandPayload(StageContext context, CommandDTO commandDTO) { + // No need to set anything here, we should deal with this in the component job factory + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageFactories.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageFactories.java new file mode 100644 index 0000000000000000000000000000000000000000..e3803025dbc17ad4783e3e13f6b4a895cf9b8cf9 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageFactories.java @@ -0,0 +1,45 @@ +package org.apache.bigtop.manager.server.command.stage.factory; + +import lombok.extern.slf4j.Slf4j; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +@Slf4j +public class StageFactories { + + private static final AtomicBoolean LOADED = new AtomicBoolean(false); + + private static final Map STAGE_FACTORIES = new HashMap<>(); + + public static StageFactory getStageFactory(StageType stageType) { + if (!LOADED.get()) { + load(); + } + + String beanName = STAGE_FACTORIES.get(stageType); + return SpringContextHolder.getApplicationContext().getBean(beanName, StageFactory.class); + } + + private static synchronized void load() { + if (LOADED.get()) { + return; + } + + for (Map.Entry entry : SpringContextHolder.getStageFactories().entrySet()) { + String beanName = entry.getKey(); + StageFactory stageFactory = entry.getValue(); + if (STAGE_FACTORIES.containsKey(stageFactory.getStageType())) { + log.error("Duplicate StageLifecycle with type: {}", stageFactory.getStageType()); + continue; + } + + STAGE_FACTORIES.put(stageFactory.getStageType(), beanName); + log.info("Load StageLifecycle: {} with type: {}", stageFactory.getClass().getName(), stageFactory.getStageType()); + } + + LOADED.set(true); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..7be1863d6e0114fe831e70bfc7ca2e1227e97d03 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageFactory.java @@ -0,0 +1,24 @@ +package org.apache.bigtop.manager.server.command.stage.factory; + +import org.apache.bigtop.manager.dao.entity.Stage; + +/** + * Stage factory. + */ +public interface StageFactory { + + /** + * Gets the type of the stage. + * + * @return the type of the stage + */ + StageType getStageType(); + + /** + * Creates a stage. + * + * @param context the stage context + * @return the stage + */ + Stage createStage(StageContext context); +} \ No newline at end of file diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageType.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageType.java new file mode 100644 index 0000000000000000000000000000000000000000..e4e377c2b056371a22a74e00932ad9e09418fbd8 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/StageType.java @@ -0,0 +1,21 @@ +package org.apache.bigtop.manager.server.command.stage.factory; + +public enum StageType { + + HOST_CHECK, + + HOST_CACHE, + + COMPONENT_INSTALL, + + COMPONENT_START, + + COMPONENT_STOP, + + COMPONENT_CHECK, + + SERVICE_CHECK, + + SERVICE_CONFIGURE, + ; +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/AbstractComponentStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/AbstractComponentStageFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..ee405fb6310320419a04bed2a59f784d98452da7 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/AbstractComponentStageFactory.java @@ -0,0 +1,141 @@ +package org.apache.bigtop.manager.server.command.stage.factory.component; + +import jakarta.annotation.Resource; +import org.apache.bigtop.manager.common.enums.Command; +import org.apache.bigtop.manager.common.enums.MessageType; +import org.apache.bigtop.manager.common.message.type.CommandPayload; +import org.apache.bigtop.manager.common.message.type.RequestMessage; +import org.apache.bigtop.manager.common.message.type.pojo.CustomCommandInfo; +import org.apache.bigtop.manager.common.message.type.pojo.OSSpecificInfo; +import org.apache.bigtop.manager.common.message.type.pojo.ScriptInfo; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.server.command.stage.factory.AbstractStageFactory; +import org.apache.bigtop.manager.server.model.dto.*; +import org.apache.bigtop.manager.dao.entity.Cluster; +import org.apache.bigtop.manager.dao.entity.Task; +import org.apache.bigtop.manager.dao.repository.ClusterRepository; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractComponentStageFactory extends AbstractStageFactory { + + @Resource + private ClusterRepository clusterRepository; + + protected Cluster cluster; + + @Override + public void doCreateStage() { + cluster = clusterRepository.getReferenceById(context.getClusterId()); + + Command command = getCommand(); + ServiceDTO serviceDTO = context.getServiceDTO(); + ComponentDTO componentDTO = context.getComponentDTO(); + + stage.setName(StringUtils.capitalize(command.toLowerCase()) + " " + componentDTO.getDisplayName()); + stage.setServiceName(serviceDTO.getServiceName()); + stage.setComponentName(componentDTO.getComponentName()); + + List tasks = new ArrayList<>(); + for (String hostname : context.getHostnames()) { + Task task = new Task(); + + // Required fields + task.setName(stage.getName() + " on " + hostname); + task.setHostname(hostname); + task.setCommand(command); + task.setServiceName(serviceDTO.getServiceName()); + task.setStackName(context.getStackName()); + task.setStackVersion(context.getStackVersion()); + + // Context fields + task.setComponentName(componentDTO.getComponentName()); + task.setServiceUser(serviceDTO.getServiceUser()); + task.setServiceGroup(serviceDTO.getServiceGroup()); + task.setCustomCommands(JsonUtils.writeAsString(componentDTO.getCustomCommands())); + task.setCommandScript(JsonUtils.writeAsString(componentDTO.getCommandScript())); + + RequestMessage requestMessage = getMessage(serviceDTO, componentDTO, hostname, command); + task.setContent(JsonUtils.writeAsString(requestMessage)); + task.setMessageId(requestMessage.getMessageId()); + + tasks.add(task); + } + + stage.setTasks(tasks); + } + + protected abstract Command getCommand(); + + private RequestMessage getMessage(ServiceDTO serviceDTO, ComponentDTO componentDTO, String hostname, Command command) { + CommandPayload commandPayload = new CommandPayload(); + commandPayload.setServiceName(serviceDTO.getServiceName()); + commandPayload.setCommand(command); + commandPayload.setServiceUser(serviceDTO.getServiceUser()); + commandPayload.setServiceGroup(serviceDTO.getServiceGroup()); + commandPayload.setStackName(context.getStackName()); + commandPayload.setStackVersion(context.getStackVersion()); + commandPayload.setComponentName(componentDTO.getComponentName()); + commandPayload.setRoot(cluster.getRoot()); + commandPayload.setHostname(hostname); + + commandPayload.setCustomCommands(convertCustomCommandInfo(componentDTO.getCustomCommands())); + commandPayload.setOsSpecifics(convertOSSpecificInfo(serviceDTO.getOsSpecifics())); + commandPayload.setCommandScript(convertScriptInfo(componentDTO.getCommandScript())); + + + RequestMessage requestMessage = new RequestMessage(); + requestMessage.setMessageType(MessageType.COMMAND); + requestMessage.setHostname(hostname); + requestMessage.setMessagePayload(JsonUtils.writeAsString(commandPayload)); + + return requestMessage; + } + + 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/stage/factory/component/ComponentCheckStageFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentCheckStageFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..1f029e96cc8e1e5f330854a7dc1157bf2d29af53 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentCheckStageFactory.java @@ -0,0 +1,23 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentCheckStageFactory extends AbstractComponentStageFactory { + + @Override + public StageType getStageType() { + return StageType.COMPONENT_CHECK; + } + + @Override + protected Command getCommand() { + return Command.CHECK; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..c577d08ddf19da912a5c2b203d4077cf1e171f22 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentInstallStageFactory.java @@ -0,0 +1,23 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentInstallStageFactory extends AbstractComponentStageFactory { + + @Override + public StageType getStageType() { + return StageType.COMPONENT_INSTALL; + } + + @Override + protected Command getCommand() { + return Command.INSTALL; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..63741b5841a2377fb2f2d9b802b9bd1a18b74d3e --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStartStageFactory.java @@ -0,0 +1,23 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStartStageFactory extends AbstractComponentStageFactory { + + @Override + public StageType getStageType() { + return StageType.COMPONENT_START; + } + + @Override + protected Command getCommand() { + return Command.START; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..ae80c64caadd7df1379f2cceaaaa11f44f8c422d --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/component/ComponentStopStageFactory.java @@ -0,0 +1,23 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStopStageFactory extends AbstractComponentStageFactory { + + @Override + public StageType getStageType() { + return StageType.COMPONENT_STOP; + } + + @Override + protected Command getCommand() { + return Command.STOP; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/helper/HostCacheStageHelper.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCacheStageFactory.java similarity index 63% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/helper/HostCacheStageHelper.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCacheStageFactory.java index d5a6958ac0bdfdde10b54f40db5aee92d85ccf57..b16e555a755ebf3f140b2ea78a079a3840d3449b 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/helper/HostCacheStageHelper.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCacheStageFactory.java @@ -1,9 +1,9 @@ -package org.apache.bigtop.manager.server.job.helper; +package org.apache.bigtop.manager.server.command.stage.factory.host; import com.fasterxml.jackson.core.type.TypeReference; -import com.google.common.collect.Sets; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.apache.bigtop.manager.common.constants.Constants; import org.apache.bigtop.manager.common.enums.Command; import org.apache.bigtop.manager.common.enums.MessageType; import org.apache.bigtop.manager.common.message.type.HostCachePayload; @@ -12,13 +12,19 @@ import org.apache.bigtop.manager.common.message.type.pojo.ClusterInfo; import org.apache.bigtop.manager.common.message.type.pojo.ComponentInfo; import org.apache.bigtop.manager.common.message.type.pojo.RepoInfo; import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.server.command.stage.factory.AbstractStageFactory; +import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.server.model.dto.PropertyDTO; +import org.apache.bigtop.manager.server.model.dto.ServiceDTO; +import org.apache.bigtop.manager.server.model.dto.StackDTO; import org.apache.bigtop.manager.server.model.mapper.RepoMapper; import org.apache.bigtop.manager.dao.entity.*; import org.apache.bigtop.manager.dao.repository.*; import org.apache.bigtop.manager.server.utils.StackConfigUtils; -import org.apache.commons.lang3.StringUtils; +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 java.util.*; import java.util.stream.Collectors; @@ -28,7 +34,8 @@ import static org.apache.bigtop.manager.common.constants.Constants.CACHE_STAGE_N @Slf4j @org.springframework.stereotype.Component -public class HostCacheStageHelper { +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class HostCacheStageFactory extends AbstractStageFactory { @Resource private ClusterRepository clusterRepository; @@ -54,33 +61,46 @@ public class HostCacheStageHelper { @Resource private ComponentRepository componentRepository; - public Stage createStage(Long clusterId, String callbackClassName, String payload) { - Cluster cluster = clusterRepository.getReferenceById(clusterId); - createCache(cluster); + private ClusterInfo clusterInfo; - List hostList = hostRepository.findAllByClusterId(clusterId); - List hostnames = hostList.stream().map(Host::getHostname).toList(); + private Map componentInfoMap; + + private Map> serviceConfigMap; + + private Map> hostMap; + + private List repoList; + + private Map> userMap; + + private Map settingsMap; - Stage hostCacheStage = new Stage(); - hostCacheStage.setName(CACHE_STAGE_NAME); - hostCacheStage.setState(JobState.PENDING); + @Override + public StageType getStageType() { + return StageType.HOST_CACHE; + } - if (StringUtils.isNotEmpty(callbackClassName)) { - hostCacheStage.setCallbackClassName(callbackClassName); + @Override + public void doCreateStage() { + List hostnames = new ArrayList<>(); + if (context.getClusterId() == null) { + genEmptyCaches(); + hostnames.addAll(context.getHostnames()); } else { - hostCacheStage.setCallbackClassName(this.getClass().getName()); + genCaches(); + hostnames.addAll(context.getHostnames() == null ? List.of() : context.getHostnames()); + hostnames.addAll(hostRepository.findAllByClusterId(context.getClusterId()).stream().map(Host::getHostname).toList()); } - if (StringUtils.isNotEmpty(callbackClassName)) { - hostCacheStage.setPayload(payload); - } + stage.setName(CACHE_STAGE_NAME); List tasks = new ArrayList<>(); + hostnames = hostnames.stream().distinct().toList(); for (String hostname : hostnames) { Task task = new Task(); task.setName("Cache host for " + hostname); - task.setStackName(cluster.getStack().getStackName()); - task.setStackVersion(cluster.getStack().getStackVersion()); + task.setStackName(context.getStackName()); + task.setStackVersion(context.getStackVersion()); task.setHostname(hostname); task.setServiceName("cluster"); task.setServiceUser("root"); @@ -88,37 +108,22 @@ public class HostCacheStageHelper { task.setComponentName("bigtop-manager-agent"); task.setCommand(Command.CUSTOM_COMMAND); task.setCustomCommand("cache_host"); - task.setState(JobState.PENDING); RequestMessage requestMessage = getMessage(hostname); + log.info("[HostCacheJobFactory-requestMessage]: {}", requestMessage); task.setContent(JsonUtils.writeAsString(requestMessage)); task.setMessageId(requestMessage.getMessageId()); - tasks.add(task); } - hostCacheStage.setTasks(tasks); - return hostCacheStage; + stage.setTasks(tasks); } - private ClusterInfo clusterInfo; - - private Map componentInfoMap; - - private Map> serviceConfigMap; - - private Map> hostMap; + private void genCaches() { + Cluster cluster = clusterRepository.getReferenceById(context.getClusterId()); - private List repoList; - - private Map> userMap; - - private Map settingsMap; - - public void createCache(Cluster cluster) { Long clusterId = cluster.getId(); - String clusterName = cluster.getClusterName(); String stackName = cluster.getStack().getStackName(); String stackVersion = cluster.getStack().getStackVersion(); @@ -130,7 +135,7 @@ public class HostCacheStageHelper { Iterable settings = settingRepository.findAll(); List hostList = hostRepository.findAllByClusterId(clusterId); - //Wrapper clusterInfo for HostCacheMessage + // Wrapper clusterInfo for HostCacheMessage clusterInfo = new ClusterInfo(); clusterInfo.setClusterName(clusterName); clusterInfo.setStackName(stackName); @@ -138,20 +143,13 @@ public class HostCacheStageHelper { clusterInfo.setUserGroup(cluster.getUserGroup()); clusterInfo.setRepoTemplate(cluster.getRepoTemplate()); clusterInfo.setRoot(cluster.getRoot()); + clusterInfo.setPackages(List.of(cluster.getPackages().split(","))); - try { - Set packages = Sets.newHashSet(cluster.getPackages().split(",")); - clusterInfo.setPackages(packages); - } catch (Exception e) { - log.warn("no packages"); - } - - //Wrapper serviceConfigMap for HostCacheMessage + // Wrapper serviceConfigMap for HostCacheMessage serviceConfigMap = new HashMap<>(); serviceConfigMappingList.forEach(scm -> { ServiceConfig sc = scm.getServiceConfig(); - List properties = JsonUtils.readFromString(sc.getPropertiesJson(), new TypeReference<>() { - }); + List properties = JsonUtils.readFromString(sc.getPropertiesJson(), new TypeReference<>() {}); String configMapStr = JsonUtils.writeAsString(StackConfigUtils.extractConfigMap(properties)); if (serviceConfigMap.containsKey(sc.getService().getServiceName())) { @@ -163,7 +161,7 @@ public class HostCacheStageHelper { } }); - //Wrapper hostMap for HostCacheMessage + // Wrapper hostMap for HostCacheMessage hostMap = new HashMap<>(); hostComponents.forEach(x -> { if (hostMap.containsKey(x.getComponent().getComponentName())) { @@ -179,22 +177,22 @@ public class HostCacheStageHelper { Set hostNameSet = hostList.stream().map(Host::getHostname).collect(Collectors.toSet()); hostMap.put(ALL_HOST_KEY, hostNameSet); - //Wrapper repoList for HostCacheMessage + // Wrapper repoList for HostCacheMessage repoList = new ArrayList<>(); repos.forEach(repo -> { RepoInfo repoInfo = RepoMapper.INSTANCE.fromEntity2Message(repo); repoList.add(repoInfo); }); - //Wrapper userMap for HostCacheMessage + // Wrapper userMap for HostCacheMessage userMap = new HashMap<>(); services.forEach(x -> userMap.put(x.getServiceUser(), Set.of(x.getServiceGroup()))); - //Wrapper settings for HostCacheMessage + // Wrapper settings for HostCacheMessage settingsMap = new HashMap<>(); settings.forEach(x -> settingsMap.put(x.getTypeName(), x.getConfigData())); - //Wrapper componentInfoList for HostCacheMessage + // Wrapper componentInfoList for HostCacheMessage componentInfoMap = new HashMap<>(); List componentList = componentRepository.findAll(); componentList.forEach(c -> { @@ -209,63 +207,51 @@ public class HostCacheStageHelper { }); } - public RequestMessage getMessage(String hostname) { - return getMessage(hostname, - settingsMap, - clusterInfo, - serviceConfigMap, - hostMap, - repoList, - userMap, - componentInfoMap); + private void genEmptyCaches() { + componentInfoMap = new HashMap<>(); + serviceConfigMap = new HashMap<>(); + hostMap = new HashMap<>(); + userMap = new HashMap<>(); + settingsMap = new HashMap<>(); + + String fullStackName = StackUtils.fullStackName(context.getStackName(), context.getStackVersion()); + ImmutablePair> immutablePair = StackUtils.getStackKeyMap().get(fullStackName); + StackDTO stackDTO = immutablePair.getLeft(); + List serviceDTOList = immutablePair.getRight(); + + repoList = RepoMapper.INSTANCE.fromDTO2Message(context.getRepoInfoList()); + clusterInfo = new ClusterInfo(); + clusterInfo.setClusterName(context.getClusterName()); + clusterInfo.setStackName(context.getStackName()); + clusterInfo.setStackVersion(context.getStackVersion()); + clusterInfo.setUserGroup(stackDTO.getUserGroup()); + clusterInfo.setRepoTemplate(stackDTO.getRepoTemplate()); + clusterInfo.setRoot(stackDTO.getRoot()); + + List hostnames = context.getHostnames(); + hostMap.put(Constants.ALL_HOST_KEY, new HashSet<>(hostnames)); + + for (ServiceDTO serviceDTO : serviceDTOList) { + userMap.put(serviceDTO.getServiceUser(), Set.of(serviceDTO.getServiceGroup())); + } } - public RequestMessage getMessage(String hostname, - Map settingsMap, - ClusterInfo clusterInfo, - Map> serviceConfigMap, - Map> hostMap, - List repoList, - Map> userMap, - Map componentInfoMap) { - HostCachePayload hostCachePayload = getMessagePayload( - hostname, - settingsMap, - clusterInfo, - serviceConfigMap, - hostMap, - repoList, - userMap, - componentInfoMap); - RequestMessage requestMessage = new RequestMessage(); + private RequestMessage getMessage(String hostname) { + HostCachePayload messagePayload = new HostCachePayload(); + messagePayload.setHostname(hostname); + messagePayload.setClusterInfo(clusterInfo); + messagePayload.setConfigurations(serviceConfigMap); + messagePayload.setClusterHostInfo(hostMap); + messagePayload.setRepoInfo(repoList); + messagePayload.setSettings(settingsMap); + messagePayload.setUserInfo(userMap); + messagePayload.setComponentInfo(componentInfoMap); + RequestMessage requestMessage = new RequestMessage(); requestMessage.setMessageType(MessageType.HOST_CACHE); requestMessage.setHostname(hostname); + requestMessage.setMessagePayload(JsonUtils.writeAsString(messagePayload)); - requestMessage.setMessagePayload(JsonUtils.writeAsString(hostCachePayload)); return requestMessage; } - - private HostCachePayload getMessagePayload( - String hostname, - Map settingsMap, - ClusterInfo clusterInfo, - Map> serviceConfigMap, - Map> hostMap, - List repoList, - Map> userMap, - Map componentInfoMap) { - HostCachePayload hostCacheMessage = new HostCachePayload(); - hostCacheMessage.setHostname(hostname); - - hostCacheMessage.setClusterInfo(clusterInfo); - hostCacheMessage.setConfigurations(serviceConfigMap); - hostCacheMessage.setClusterHostInfo(hostMap); - hostCacheMessage.setRepoInfo(repoList); - hostCacheMessage.setSettings(settingsMap); - hostCacheMessage.setUserInfo(userMap); - hostCacheMessage.setComponentInfo(componentInfoMap); - return hostCacheMessage; - } - } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/helper/HostCheckStageHelper.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCheckStageFactory.java similarity index 50% rename from bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/helper/HostCheckStageHelper.java rename to bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCheckStageFactory.java index 6b31ba8e5452f96984c80d378804d9e2c0cd762b..f30dc212201f05136d8851803407dcd700908ea5 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/helper/HostCheckStageHelper.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/host/HostCheckStageFactory.java @@ -1,4 +1,4 @@ -package org.apache.bigtop.manager.server.job.helper; +package org.apache.bigtop.manager.server.command.stage.factory.host; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -8,46 +8,47 @@ import org.apache.bigtop.manager.common.message.type.HostCheckPayload; import org.apache.bigtop.manager.common.message.type.RequestMessage; import org.apache.bigtop.manager.common.message.type.pojo.HostCheckType; import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.common.enums.JobState; +import org.apache.bigtop.manager.server.command.stage.factory.AbstractStageFactory; +import org.apache.bigtop.manager.server.command.stage.factory.StageType; import org.apache.bigtop.manager.dao.entity.Cluster; -import org.apache.bigtop.manager.dao.entity.Job; -import org.apache.bigtop.manager.dao.entity.Stage; import org.apache.bigtop.manager.dao.entity.Task; import org.apache.bigtop.manager.dao.repository.ClusterRepository; -import org.apache.bigtop.manager.dao.repository.StageRepository; -import org.apache.bigtop.manager.dao.repository.TaskRepository; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; import java.util.ArrayList; import java.util.List; @Slf4j @org.springframework.stereotype.Component -public class HostCheckStageHelper { +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class HostCheckStageFactory extends AbstractStageFactory { @Resource private ClusterRepository clusterRepository; - public Stage createStage(Long clusterId, List hostnames, String callbackClassName) { - Cluster cluster = clusterRepository.getReferenceById(clusterId); - - String stackName = cluster.getStack().getStackName(); - String stackVersion = cluster.getStack().getStackVersion(); - return createStage(stackName, stackVersion, hostnames, callbackClassName); + public StageType getStageType() { + return StageType.HOST_CHECK; } - public Stage createStage(String stackName, String stackVersion, List hostnames, String callbackClassName) { + @Override + public void doCreateStage() { + if (context.getClusterId() != null) { + Cluster cluster = clusterRepository.getReferenceById(context.getClusterId()); + + context.setStackName(cluster.getStack().getStackName()); + context.setStackVersion(cluster.getStack().getStackVersion()); + } + // Create stages - Stage hostCheckStage = new Stage(); - hostCheckStage.setName("Check Hosts"); - hostCheckStage.setState(JobState.PENDING); - hostCheckStage.setCallbackClassName(callbackClassName); + stage.setName("Check Hosts"); List tasks = new ArrayList<>(); - for (String hostname : hostnames) { + for (String hostname : context.getHostnames()) { Task task = new Task(); task.setName("Check host for " + hostname); - task.setStackName(stackName); - task.setStackVersion(stackVersion); + task.setStackName(context.getStackName()); + task.setStackVersion(context.getStackVersion()); task.setHostname(hostname); task.setServiceName("cluster"); task.setServiceUser("root"); @@ -55,7 +56,6 @@ public class HostCheckStageHelper { task.setComponentName("bigtop-manager-agent"); task.setCommand(Command.CUSTOM_COMMAND); task.setCustomCommand("check_host"); - task.setState(JobState.PENDING); RequestMessage requestMessage = createMessage(hostname); task.setContent(JsonUtils.writeAsString(requestMessage)); @@ -64,25 +64,19 @@ public class HostCheckStageHelper { tasks.add(task); } - hostCheckStage.setTasks(tasks); - return hostCheckStage; + stage.setTasks(tasks); } - public RequestMessage createMessage(String hostname) { - HostCheckPayload hostCheckPayload = createMessagePayload(hostname); - RequestMessage requestMessage = new RequestMessage(); + private RequestMessage createMessage(String hostname) { + HostCheckPayload messagePayload = new HostCheckPayload(); + messagePayload.setHostCheckTypes(HostCheckType.values()); + messagePayload.setHostname(hostname); + RequestMessage requestMessage = new RequestMessage(); requestMessage.setMessageType(MessageType.HOST_CHECK); requestMessage.setHostname(hostname); + requestMessage.setMessagePayload(JsonUtils.writeAsString(messagePayload)); - requestMessage.setMessagePayload(JsonUtils.writeAsString(hostCheckPayload)); return requestMessage; } - - public HostCheckPayload createMessagePayload(String hostname) { - HostCheckPayload hostCheckMessage = new HostCheckPayload(); - hostCheckMessage.setHostCheckTypes(HostCheckType.values()); - hostCheckMessage.setHostname(hostname); - return hostCheckMessage; - } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..96e1c677eef8f93c1d2496e043a7e0fd8f4bab14 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/factory/service/ServiceConfigureStageFactory.java @@ -0,0 +1,22 @@ +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceConfigureStageFactory extends AbstractStageFactory { + + @Override + public StageType getStageType() { + return StageType.SERVICE_CONFIGURE; + } + + @Override + public void doCreateStage() { + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..96e0692be19b8d369d2910d8f9ebd6c4652f324f --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/AbstractStageRunner.java @@ -0,0 +1,273 @@ +package org.apache.bigtop.manager.server.command.stage.runner; + +import com.fasterxml.jackson.core.type.TypeReference; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.bigtop.manager.common.constants.MessageConstants; +import org.apache.bigtop.manager.common.enums.MessageType; +import org.apache.bigtop.manager.common.message.type.BaseCommandMessage; +import org.apache.bigtop.manager.common.message.type.HostCachePayload; +import org.apache.bigtop.manager.common.message.type.RequestMessage; +import org.apache.bigtop.manager.common.message.type.ResultMessage; +import org.apache.bigtop.manager.common.message.type.pojo.ClusterInfo; +import org.apache.bigtop.manager.common.message.type.pojo.ComponentInfo; +import org.apache.bigtop.manager.common.message.type.pojo.RepoInfo; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.server.enums.CommandLevel; +import org.apache.bigtop.manager.common.enums.JobState; +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.PropertyDTO; +import org.apache.bigtop.manager.server.model.mapper.RepoMapper; +import org.apache.bigtop.manager.dao.entity.*; +import org.apache.bigtop.manager.dao.repository.*; +import org.apache.bigtop.manager.server.utils.StackConfigUtils; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static org.apache.bigtop.manager.common.constants.Constants.*; + +@Slf4j +public abstract class AbstractStageRunner implements StageRunner { + + @Resource + private StageRepository stageRepository; + + @Resource + private TaskRepository taskRepository; + + @Resource + private HostComponentRepository hostComponentRepository; + + @Resource + private ServiceRepository serviceRepository; + + @Resource + private ServiceConfigMappingRepository serviceConfigMappingRepository; + + @Resource + private RepoRepository repoRepository; + + @Resource + private SettingRepository settingRepository; + + @Resource + private HostRepository hostRepository; + + @Resource + private ComponentRepository componentRepository; + + protected Stage stage; + + @Override + public void setStage(Stage stage) { + this.stage = stage; + } + + @Override + public void run() { + beforeRun(); + + List> futures = new ArrayList<>(); + for (Task task : stage.getTasks()) { + beforeRunTask(task); + + // TODO temp code, need to remove this + String content = task.getContent(); + CommandDTO commandDTO = JsonUtils.readFromString(task.getJob().getPayload(), CommandDTO.class); + if (commandDTO.getCommandLevel() != CommandLevel.CLUSTER && stage.getName().equals(CACHE_STAGE_NAME)) { + content = generatePayload(task); + } + // End temp code + + BaseCommandMessage message = JsonUtils.readFromString(content, RequestMessage.class); + message.setTaskId(task.getId()); + message.setStageId(stage.getId()); + message.setJobId(stage.getJob().getId()); + + futures.add(CompletableFuture.supplyAsync(() -> { + ResultMessage res = SpringContextHolder.getServerWebSocket().sendMessage(task.getHostname(), message); + + log.info("Execute task {} completed: {}", task.getId(), res); + boolean taskSuccess = res.getCode() == MessageConstants.SUCCESS_CODE; + + if (taskSuccess) { + onTaskSuccess(task); + } else { + onTaskFailure(task); + } + + return taskSuccess; + })); + } + + List taskResults = futures.stream().map((future) -> { + try { + return future.get(COMMAND_MESSAGE_RESPONSE_TIMEOUT, TimeUnit.MILLISECONDS); + } catch (Exception e) { + log.error("Error running task", e); + return false; + } + }).toList(); + + boolean allTaskSuccess = taskResults.stream().allMatch(Boolean::booleanValue); + if (allTaskSuccess) { + onSuccess(); + } else { + onFailure(); + } + } + + @Override + public void beforeRun() { + stage.setState(JobState.PROCESSING); + stageRepository.save(stage); + } + + @Override + public void onSuccess() { + stage.setState(JobState.SUCCESSFUL); + stageRepository.save(stage); + } + + @Override + public void onFailure() { + stage.setState(JobState.FAILED); + stageRepository.save(stage); + } + + @Override + public void beforeRunTask(Task task) { + task.setState(JobState.PROCESSING); + taskRepository.save(task); + } + + @Override + public void onTaskSuccess(Task task) { + task.setState(JobState.SUCCESSFUL); + taskRepository.save(task); + } + + @Override + public void onTaskFailure(Task task) { + task.setState(JobState.FAILED); + taskRepository.save(task); + } + + public String generatePayload(Task task) { + Cluster cluster = task.getCluster(); + RequestMessage requestMessage = getMessage(cluster, task.getHostname()); + log.info("[generatePayload]-[HostCacheJobFactory-requestMessage]: {}", requestMessage); + return JsonUtils.writeAsString(requestMessage); + } + + public RequestMessage getMessage(Cluster cluster, String hostname) { + ClusterInfo clusterInfo = new ClusterInfo(); + Map componentInfoMap = new HashMap<>(); + Map> serviceConfigMap = new HashMap<>(); + Map> hostMap = new HashMap<>(); + List repoList = new ArrayList<>(); + Map> userMap = new HashMap<>(); + Map settingsMap = new HashMap<>(); + + + Long clusterId = cluster.getId(); + + String clusterName = cluster.getClusterName(); + String stackName = cluster.getStack().getStackName(); + String stackVersion = cluster.getStack().getStackVersion(); + + List services = serviceRepository.findAllByClusterId(clusterId); + List serviceConfigMappingList = serviceConfigMappingRepository.findAllGroupLastest(clusterId); + List hostComponents = hostComponentRepository.findAllByComponentClusterId(clusterId); + List repos = repoRepository.findAllByCluster(cluster); + Iterable settings = settingRepository.findAll(); + List hostList = hostRepository.findAllByClusterId(clusterId); + + //Wrapper clusterInfo for HostCacheMessage + clusterInfo.setClusterName(clusterName); + clusterInfo.setStackName(stackName); + clusterInfo.setStackVersion(stackVersion); + clusterInfo.setUserGroup(cluster.getUserGroup()); + clusterInfo.setRepoTemplate(cluster.getRepoTemplate()); + clusterInfo.setRoot(cluster.getRoot()); + clusterInfo.setPackages(Arrays.asList(cluster.getPackages().split(","))); + + //Wrapper serviceConfigMap for HostCacheMessage + serviceConfigMappingList.forEach(scm -> { + ServiceConfig sc = scm.getServiceConfig(); + List properties = JsonUtils.readFromString(sc.getPropertiesJson(), new TypeReference<>() { + }); + String configMapStr = JsonUtils.writeAsString(StackConfigUtils.extractConfigMap(properties)); + + if (serviceConfigMap.containsKey(sc.getService().getServiceName())) { + serviceConfigMap.get(sc.getService().getServiceName()).put(sc.getTypeName(), configMapStr); + } else { + Map hashMap = new HashMap<>(); + hashMap.put(sc.getTypeName(), configMapStr); + serviceConfigMap.put(sc.getService().getServiceName(), hashMap); + } + }); + + //Wrapper hostMap for HostCacheMessage + hostComponents.forEach(x -> { + if (hostMap.containsKey(x.getComponent().getComponentName())) { + hostMap.get(x.getComponent().getComponentName()).add(x.getHost().getHostname()); + } else { + Set set = new HashSet<>(); + set.add(x.getHost().getHostname()); + hostMap.put(x.getComponent().getComponentName(), set); + } + hostMap.get(x.getComponent().getComponentName()).add(x.getHost().getHostname()); + }); + + Set hostNameSet = hostList.stream().map(Host::getHostname).collect(Collectors.toSet()); + hostMap.put(ALL_HOST_KEY, hostNameSet); + + //Wrapper repoList for HostCacheMessage + repos.forEach(repo -> { + RepoInfo repoInfo = RepoMapper.INSTANCE.fromEntity2Message(repo); + repoList.add(repoInfo); + }); + + //Wrapper userMap for HostCacheMessage + services.forEach(x -> userMap.put(x.getServiceUser(), Set.of(x.getServiceGroup()))); + + //Wrapper settings for HostCacheMessage + settings.forEach(x -> settingsMap.put(x.getTypeName(), x.getConfigData())); + + //Wrapper componentInfoList for HostCacheMessage + List componentList = componentRepository.findAll(); + componentList.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.getService().getServiceName()); + componentInfoMap.put(c.getComponentName(), componentInfo); + }); + + HostCachePayload hostCachePayload = new HostCachePayload(); + hostCachePayload.setHostname(hostname); + + hostCachePayload.setClusterInfo(clusterInfo); + hostCachePayload.setConfigurations(serviceConfigMap); + hostCachePayload.setClusterHostInfo(hostMap); + hostCachePayload.setRepoInfo(repoList); + hostCachePayload.setSettings(settingsMap); + hostCachePayload.setUserInfo(userMap); + hostCachePayload.setComponentInfo(componentInfoMap); + + RequestMessage requestMessage = new RequestMessage(); + requestMessage.setMessageType(MessageType.HOST_CACHE); + requestMessage.setHostname(hostname); + requestMessage.setMessagePayload(JsonUtils.writeAsString(hostCachePayload)); + + return requestMessage; + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/StageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/StageRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..c23a83f936c08cc822007c85fd6e6cff95120339 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/StageRunner.java @@ -0,0 +1,26 @@ +package org.apache.bigtop.manager.server.command.stage.runner; + +import org.apache.bigtop.manager.server.command.stage.factory.StageType; +import org.apache.bigtop.manager.dao.entity.Stage; +import org.apache.bigtop.manager.dao.entity.Task; + +public interface StageRunner { + + StageType getStageType(); + + void setStage(Stage stage); + + void beforeRun(); + + void run(); + + void onSuccess(); + + void onFailure(); + + void beforeRunTask(Task task); + + void onTaskSuccess(Task task); + + void onTaskFailure(Task task); +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/StageRunners.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/StageRunners.java new file mode 100644 index 0000000000000000000000000000000000000000..4c0ff5e80f847e3391b594af7a0c6106904a7627 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/StageRunners.java @@ -0,0 +1,55 @@ +package org.apache.bigtop.manager.server.command.stage.runner; + +import lombok.extern.slf4j.Slf4j; +import org.apache.bigtop.manager.common.utils.JsonUtils; +import org.apache.bigtop.manager.server.command.stage.factory.StageContext; +import org.apache.bigtop.manager.server.command.stage.factory.StageType; +import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.dao.entity.Stage; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +@Slf4j +public class StageRunners { + + private static final AtomicBoolean LOADED = new AtomicBoolean(false); + + private static final Map STAGE_RUNNERS = new HashMap<>(); + + public static StageRunner getStageRunner(Stage stage) { + if (!LOADED.get()) { + load(); + } + + StageContext context = JsonUtils.readFromString(stage.getContext(), StageContext.class); + StageType stageType = context.getStageType(); + + String beanName = STAGE_RUNNERS.get(stageType); + StageRunner runner = SpringContextHolder.getApplicationContext().getBean(beanName, StageRunner.class); + runner.setStage(stage); + + return runner; + } + + private static synchronized void load() { + if (LOADED.get()) { + return; + } + + for (Map.Entry entry : SpringContextHolder.getStageRunners().entrySet()) { + String beanName = entry.getKey(); + StageRunner stageRunner = entry.getValue(); + if (STAGE_RUNNERS.containsKey(stageRunner.getStageType())) { + log.error("Duplicate StageLifecycle with type: {}", stageRunner.getStageType()); + continue; + } + + STAGE_RUNNERS.put(stageRunner.getStageType(), beanName); + log.info("Load StageLifecycle: {} with type: {}", stageRunner.getClass().getName(), stageRunner.getStageType()); + } + + LOADED.set(true); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..c4a9afb47d86e4ded7829f9bb67ca8c0a36a9e40 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentCheckStageRunner.java @@ -0,0 +1,20 @@ +package org.apache.bigtop.manager.server.command.stage.runner.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.apache.bigtop.manager.server.command.stage.factory.component.AbstractComponentStageFactory; +import org.apache.bigtop.manager.server.command.stage.runner.AbstractStageRunner; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentCheckStageRunner extends AbstractStageRunner { + + @Override + public StageType getStageType() { + return StageType.COMPONENT_CHECK; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..cd97216e37fd04113cebf8054d6f763f75b94a1d --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentInstallStageRunner.java @@ -0,0 +1,38 @@ +package org.apache.bigtop.manager.server.command.stage.runner.component; + +import jakarta.annotation.Resource; +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.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.entity.HostComponent; +import org.apache.bigtop.manager.dao.entity.Task; +import org.apache.bigtop.manager.dao.repository.HostComponentRepository; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentInstallStageRunner extends AbstractStageRunner { + + @Resource + private HostComponentRepository hostComponentRepository; + + @Override + public StageType getStageType() { + return StageType.COMPONENT_INSTALL; + } + + @Override + public void onTaskSuccess(Task task) { + super.onTaskSuccess(task); + + Long clusterId = task.getCluster().getId(); + String componentName = task.getComponentName(); + String hostname = task.getHostname(); + HostComponent hostComponent = hostComponentRepository.findByComponentClusterIdAndComponentComponentNameAndHostHostname(clusterId, componentName, hostname); + hostComponent.setState(MaintainState.INSTALLED); + hostComponentRepository.save(hostComponent); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..2fef6ae5cdaefc53e695c10bd85aedf819d18fb9 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStartStageRunner.java @@ -0,0 +1,43 @@ +package org.apache.bigtop.manager.server.command.stage.runner.component; + +import jakarta.annotation.Resource; +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.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.entity.HostComponent; +import org.apache.bigtop.manager.dao.entity.Task; +import org.apache.bigtop.manager.dao.repository.HostComponentRepository; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStartStageRunner extends AbstractStageRunner { + + @Resource + private HostComponentRepository hostComponentRepository; + + @Override + public StageType getStageType() { + return StageType.COMPONENT_START; + } + + @Override + public void onTaskSuccess(Task task) { + super.onTaskSuccess(task); + + Long clusterId = task.getCluster().getId(); + String componentName = task.getComponentName(); + String hostname = task.getHostname(); + HostComponent hostComponent = hostComponentRepository.findByComponentClusterIdAndComponentComponentNameAndHostHostname(clusterId, componentName, hostname); + hostComponent.setState(MaintainState.STARTED); + hostComponentRepository.save(hostComponent); + } + + @Override + public void onSuccess() { + super.onSuccess(); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..035046bb2f8edf65dcc5bacc3beb7a2dc08c5cef --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/component/ComponentStopStageRunner.java @@ -0,0 +1,39 @@ +package org.apache.bigtop.manager.server.command.stage.runner.component; + +import jakarta.annotation.Resource; +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.apache.bigtop.manager.common.enums.MaintainState; +import org.apache.bigtop.manager.dao.entity.HostComponent; +import org.apache.bigtop.manager.dao.entity.Task; +import org.apache.bigtop.manager.dao.repository.HostComponentRepository; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ComponentStopStageRunner extends AbstractStageRunner { + + @Resource + private HostComponentRepository hostComponentRepository; + + + @Override + public StageType getStageType() { + return StageType.COMPONENT_STOP; + } + + @Override + public void onTaskSuccess(Task task) { + super.onTaskSuccess(task); + + Long clusterId = task.getCluster().getId(); + String componentName = task.getComponentName(); + String hostname = task.getHostname(); + HostComponent hostComponent = hostComponentRepository.findByComponentClusterIdAndComponentComponentNameAndHostHostname(clusterId, componentName, hostname); + hostComponent.setState(MaintainState.STOPPED); + hostComponentRepository.save(hostComponent); + } +} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCacheStageRunner.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCacheStageRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..af65d48da18682fbe54203b2b4f525cf6f003265 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCacheStageRunner.java @@ -0,0 +1,18 @@ +package org.apache.bigtop.manager.server.command.stage.runner.host; + +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class HostCacheStageRunner extends AbstractStageRunner { + + @Override + public StageType getStageType() { + return StageType.HOST_CACHE; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..fd11f78bdc735149e182898895d165f877b57b6b --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/host/HostCheckStageRunner.java @@ -0,0 +1,17 @@ +package org.apache.bigtop.manager.server.command.stage.runner.host; + +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class HostCheckStageRunner extends AbstractStageRunner { + + public StageType getStageType() { + return StageType.HOST_CHECK; + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..8c6c0110705d0183034eb46f5daf6244f92199f6 --- /dev/null +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/runner/service/ServiceConfigureStageRunner.java @@ -0,0 +1,18 @@ +package org.apache.bigtop.manager.server.command.stage.runner.service; + +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; + +@Slf4j +@org.springframework.stereotype.Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ServiceConfigureStageRunner extends AbstractStageRunner { + + @Override + public StageType getStageType() { + return StageType.SERVICE_CONFIGURE; + } +} 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 d54ee3eada4c94b4fb9d3942c112b2c57ef70109..f5c9980cc853587df378ddfd285dd706dd063ca7 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 @@ -18,8 +18,11 @@ package org.apache.bigtop.manager.server.holder; import jakarta.annotation.Nonnull; import lombok.Getter; -import org.apache.bigtop.manager.server.job.factory.JobFactory; -import org.apache.bigtop.manager.server.job.validator.CommandValidator; +import org.apache.bigtop.manager.server.command.job.factory.JobFactory; +import org.apache.bigtop.manager.server.command.job.runner.JobRunner; +import org.apache.bigtop.manager.server.command.stage.factory.StageFactory; +import org.apache.bigtop.manager.server.command.job.validator.CommandValidator; +import org.apache.bigtop.manager.server.command.stage.runner.StageRunner; import org.apache.bigtop.manager.server.ws.ServerWebSocketHandler; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -49,4 +52,16 @@ public class SpringContextHolder implements ApplicationContextAware { public static Map getJobFactories() { return applicationContext.getBeansOfType(JobFactory.class); } + + public static Map getJobRunners() { + return applicationContext.getBeansOfType(JobRunner.class); + } + + public static Map getStageFactories() { + return applicationContext.getBeansOfType(StageFactory.class); + } + + public static Map getStageRunners() { + return applicationContext.getBeansOfType(StageRunner.class); + } } diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/cluster/ClusterCreateJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/cluster/ClusterCreateJobFactory.java deleted file mode 100644 index 8c8a86f9c90255905ff1b7c52548b69ed328b6dd..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/cluster/ClusterCreateJobFactory.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.cluster; - -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.constants.Constants; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.common.message.type.RequestMessage; -import org.apache.bigtop.manager.common.message.type.pojo.ClusterInfo; -import org.apache.bigtop.manager.common.message.type.pojo.ComponentInfo; -import org.apache.bigtop.manager.common.message.type.pojo.RepoInfo; -import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.server.enums.CommandLevel; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.helper.HostCacheStageHelper; -import org.apache.bigtop.manager.server.job.helper.HostCheckStageHelper; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.server.model.dto.ClusterDTO; -import org.apache.bigtop.manager.server.model.dto.ServiceDTO; -import org.apache.bigtop.manager.server.model.dto.StackDTO; -import org.apache.bigtop.manager.server.model.dto.command.ClusterCommandDTO; -import org.apache.bigtop.manager.server.model.mapper.RepoMapper; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; -import org.apache.bigtop.manager.server.service.ClusterService; -import org.apache.bigtop.manager.server.utils.StackUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; - -import java.util.*; - -import static org.apache.bigtop.manager.common.constants.Constants.CACHE_STAGE_NAME; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ClusterCreateJobFactory extends AbstractClusterJobFactory implements StageCallback { - - @Resource - private HostCheckStageHelper hostCheckStageHelper; - - @Resource - private HostCacheStageHelper hostCacheStageHelper; - - @Resource - private ClusterService clusterService; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.CLUSTER, Command.CREATE); - } - - @Override - public List createStagesAndTasks() { - List stages = new ArrayList<>(); - String callbackClassName = this.getClass().getName(); - ClusterCommandDTO clusterCommand = jobContext.getCommandDTO().getClusterCommand(); - List hostnames = clusterCommand.getHostnames(); - - stages.add(hostCheckStageHelper.createStage(clusterCommand.getStackName(), clusterCommand.getStackVersion(), hostnames, callbackClassName)); - stages.add(createCacheStage(clusterCommand, callbackClassName, JsonUtils.writeAsString(clusterCommand))); - - return stages; - } - - @Override - public void beforeStage(Stage stage) { - if (stage.getName().equals(CACHE_STAGE_NAME)) { - ClusterCommandDTO clusterCommand = JsonUtils.readFromString(stage.getPayload(), ClusterCommandDTO.class); - ClusterDTO clusterDTO = new ClusterDTO(); - BeanUtils.copyProperties(clusterCommand, clusterDTO); - - clusterService.save(clusterDTO); - } - } - - public Stage createCacheStage(ClusterCommandDTO clusterCommand, String callbackClassName, String payload) { - Map componentInfoMap = new HashMap<>(); - Map> serviceConfigMap = new HashMap<>(); - Map> hostMap = new HashMap<>(); - Map> userMap = new HashMap<>(); - Map settingsMap = new HashMap<>(); - - String fullStackName = StackUtils.fullStackName(clusterCommand.getStackName(), clusterCommand.getStackVersion()); - ImmutablePair> immutablePair = StackUtils.getStackKeyMap().get(fullStackName); - StackDTO stackDTO = immutablePair.getLeft(); - List serviceDTOList = immutablePair.getRight(); - - List repoList = RepoMapper.INSTANCE.fromDTO2Message(clusterCommand.getRepoInfoList()); - ClusterInfo clusterInfo = new ClusterInfo(); - clusterInfo.setClusterName(clusterCommand.getClusterName()); - clusterInfo.setStackName(clusterCommand.getStackName()); - clusterInfo.setStackVersion(clusterCommand.getStackVersion()); - clusterInfo.setUserGroup(stackDTO.getUserGroup()); - clusterInfo.setRepoTemplate(stackDTO.getRepoTemplate()); - clusterInfo.setRoot(stackDTO.getRoot()); - - List hostnames = clusterCommand.getHostnames(); - hostMap.put(Constants.ALL_HOST_KEY, new HashSet<>(hostnames)); - - for (ServiceDTO serviceDTO : serviceDTOList) { - userMap.put(serviceDTO.getServiceUser(), Set.of(serviceDTO.getServiceGroup())); - } - - Stage hostCacheStage = new Stage(); - hostCacheStage.setName(CACHE_STAGE_NAME); - hostCacheStage.setState(JobState.PENDING); - hostCacheStage.setCallbackClassName(callbackClassName); - hostCacheStage.setPayload(payload); - - List tasks = new ArrayList<>(); - for (String hostname : hostnames) { - Task task = new Task(); - task.setName("Cache host for " + hostname); - task.setStackName(clusterCommand.getStackName()); - task.setStackVersion(clusterCommand.getStackVersion()); - task.setHostname(hostname); - task.setServiceName("cluster"); - task.setServiceUser("root"); - task.setServiceGroup("root"); - task.setComponentName("bigtop-manager-agent"); - task.setCommand(Command.CUSTOM_COMMAND); - task.setCustomCommand("cache_host"); - task.setState(JobState.PENDING); - - RequestMessage requestMessage = hostCacheStageHelper.getMessage( - hostname, - settingsMap, - clusterInfo, - serviceConfigMap, - hostMap, - repoList, - userMap, - componentInfoMap); - - log.info("[HostCacheJobFactory-requestMessage]: {}", requestMessage); - task.setContent(JsonUtils.writeAsString(requestMessage)); - task.setMessageId(requestMessage.getMessageId()); - tasks.add(task); - } - - hostCacheStage.setTasks(tasks); - return hostCacheStage; - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/AbstractComponentJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/AbstractComponentJobFactory.java deleted file mode 100644 index 17f6574608f0839f3213845bd8d96fbfca2557af..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/AbstractComponentJobFactory.java +++ /dev/null @@ -1,204 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.component; - -import com.fasterxml.jackson.core.type.TypeReference; -import jakarta.annotation.Resource; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.common.enums.MessageType; -import org.apache.bigtop.manager.common.message.type.CommandPayload; -import org.apache.bigtop.manager.common.message.type.RequestMessage; -import org.apache.bigtop.manager.common.message.type.pojo.ScriptInfo; -import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.server.exception.ApiException; -import org.apache.bigtop.manager.server.exception.ServerException; -import org.apache.bigtop.manager.server.job.factory.AbstractJobFactory; -import org.apache.bigtop.manager.server.model.dto.CommandDTO; -import org.apache.bigtop.manager.server.model.dto.command.ComponentCommandDTO; -import org.apache.bigtop.manager.dao.entity.Component; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; -import org.apache.bigtop.manager.dao.repository.ComponentRepository; -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.text.CaseUtils; -import org.springframework.beans.BeanUtils; - -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -public abstract class AbstractComponentJobFactory extends AbstractJobFactory { - - @Resource - private ComponentRepository componentRepository; - - @Override - protected List createStagesAndTasks() { - return createStages(getClass().getName()); - } - - protected List createStages(String callbackClassName) { - return createStages(callbackClassName, jobContext.getCommandDTO().getCommand()); - } - - protected List createStages(String callbackClassName, Command command) { - CommandDTO commandDTO = jobContext.getCommandDTO(); - String customCommand = commandDTO.getCustomCommand(); - - List sortedCommandWrappers = getSortedCommandWrappers(command); - Map> componentHostMapping = getComponentHostMapping(command); - - List stages = new ArrayList<>(); - for (ComponentCommandWrapper componentCommandWrapper : sortedCommandWrappers) { - String componentName = componentCommandWrapper.getComponentName(); - Component component = componentCommandWrapper.getComponent(); - if (component == null) { - throw new ApiException(ApiExceptionEnum.COMPONENT_NOT_FOUND); - } - - Stage stage = createStage(callbackClassName, componentCommandWrapper, component, command); - stages.add(stage); - - // Generate task list - List tasks = new ArrayList<>(); - List hostnames = componentHostMapping.get(componentName); - for (String hostname : hostnames) { - Task task = createTask(component, hostname, command, customCommand); - tasks.add(task); - } - - stage.setTasks(tasks); - } - - return stages; - } - - protected Map> getComponentHostMapping(Command command) { - List componentCommands = jobContext.getCommandDTO().getComponentCommands(); - return componentCommands.stream().collect(Collectors.toMap(ComponentCommandDTO::getComponentName, ComponentCommandDTO::getHostnames)); - } - - protected List getComponents() { - List componentCommands = jobContext.getCommandDTO().getComponentCommands(); - List componentNames = componentCommands.stream().map(ComponentCommandDTO::getComponentName).toList(); - - return componentRepository.findAllByClusterIdAndComponentNameIn(cluster.getId(), componentNames); - } - - private List getSortedCommandWrappers(Command command) { - String stackName = cluster.getStack().getStackName(); - String stackVersion = cluster.getStack().getStackVersion(); - String fullStackName = StackUtils.fullStackName(stackName, stackVersion); - - DAG dag = StackUtils.getStackDagMap().get(fullStackName); - try { - Map commandWrapperMap = getCommandWrappers(command).stream() - .collect(Collectors.toMap(ComponentCommandWrapper::toString, Function.identity())); - - List orderedList = dag.topologicalSort(); - List todoList = new ArrayList<>(commandWrapperMap.keySet()); - - orderedList.retainAll(todoList); - todoList.removeAll(orderedList); - orderedList.addAll(todoList); - - return orderedList.stream().map(commandWrapperMap::get).collect(Collectors.toList()); - } catch (Exception e) { - throw new ServerException(e); - } - } - - private List getCommandWrappers(Command command) { - return getComponents().stream() - .map(component -> new ComponentCommandWrapper(component.getComponentName(), command, component)) - .collect(Collectors.toList()); - } - - private Stage createStage(String callbackClassName, ComponentCommandWrapper componentCommandWrapper, Component component, Command command) { - Stage stage = new Stage(); - stage.setState(JobState.PENDING); - stage.setName(componentCommandWrapper.toDisplayString()); - stage.setServiceName(component.getService().getServiceName()); - stage.setComponentName(component.getComponentName()); - - // Set stage callback - stage.setCallbackClassName(callbackClassName); - - if (command == jobContext.getCommandDTO().getCommand()) { - stage.setPayload(JsonUtils.writeAsString(jobContext.getCommandDTO())); - } else { - CommandDTO commandDTO = new CommandDTO(); - BeanUtils.copyProperties(jobContext.getCommandDTO(), commandDTO); - commandDTO.setCommand(command); - stage.setPayload(JsonUtils.writeAsString(commandDTO)); - } - - return stage; - } - - private Task createTask(Component component, String hostname, Command command, String customCommand) { - Task task = new Task(); - - task.setName(MessageFormat.format("{0} for {1} and {2}", - CaseUtils.toCamelCase(command.name(), true), component.getDisplayName(), hostname)); - - // Required fields - task.setHostname(hostname); - task.setCommand(command); - task.setServiceName(component.getService().getServiceName()); - task.setStackName(component.getCluster().getStack().getStackName()); - task.setStackVersion(component.getCluster().getStack().getStackVersion()); - - // Context fields - task.setComponentName(component.getComponentName()); - task.setServiceUser(component.getService().getServiceUser()); - task.setServiceGroup(component.getService().getServiceGroup()); - task.setCustomCommands(component.getCustomCommands()); - task.setCustomCommand(customCommand); - task.setCommandScript(component.getCommandScript()); - - // extra fields - task.setState(JobState.PENDING); - - RequestMessage requestMessage = getMessage(component, hostname, command, customCommand); - task.setContent(JsonUtils.writeAsString(requestMessage)); - task.setMessageId(requestMessage.getMessageId()); - - return task; - } - - private RequestMessage getMessage(Component component, String hostname, Command command, String customCommand) { - RequestMessage requestMessage = new RequestMessage(); - requestMessage.setMessageType(MessageType.COMMAND); - requestMessage.setHostname(hostname); - requestMessage.setMessagePayload(JsonUtils.writeAsString(getMessagePayload(component, hostname, command, customCommand))); - - return requestMessage; - } - - private CommandPayload getMessagePayload(Component component, String hostname, Command command, String customCommand) { - CommandPayload commandPayload = new CommandPayload(); - commandPayload.setServiceName(component.getService().getServiceName()); - commandPayload.setCommand(command); - commandPayload.setCustomCommand(customCommand); - commandPayload.setServiceUser(component.getService().getServiceUser()); - commandPayload.setServiceGroup(component.getService().getServiceGroup()); - commandPayload.setStackName(component.getCluster().getStack().getStackName()); - commandPayload.setStackVersion(component.getCluster().getStack().getStackVersion()); - commandPayload.setRoot(component.getService().getCluster().getRoot()); - commandPayload.setComponentName(component.getComponentName()); - commandPayload.setHostname(hostname); - - commandPayload.setCustomCommands(JsonUtils.readFromString(component.getCustomCommands(), new TypeReference<>() {})); - commandPayload.setOsSpecifics(JsonUtils.readFromString(component.getService().getOsSpecifics(), new TypeReference<>() {})); - commandPayload.setCommandScript(JsonUtils.readFromString(component.getCommandScript(), ScriptInfo.class)); - - return commandPayload; - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentInstallJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentInstallJobFactory.java deleted file mode 100644 index 83ec262b5be822535e209837280f078428e02791..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentInstallJobFactory.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.component; - -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.common.message.type.RequestMessage; -import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.server.enums.CommandLevel; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.helper.HostCacheStageHelper; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.server.model.dto.CommandDTO; -import org.apache.bigtop.manager.dao.entity.Cluster; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; -import org.apache.bigtop.manager.server.service.HostComponentService; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; - -import java.util.List; - -import static org.apache.bigtop.manager.common.constants.Constants.CACHE_STAGE_NAME; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ComponentInstallJobFactory extends AbstractComponentJobFactory implements StageCallback { - - @Resource - private HostCacheStageHelper hostCacheStageHelper; - - @Resource - private HostComponentService hostComponentService; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.COMPONENT, Command.INSTALL); - } - - @Override - public List createStagesAndTasks() { - List stages = super.createStagesAndTasks(); - - String callbackClassName = this.getClass().getName(); - String payload = JsonUtils.writeAsString(jobContext.getCommandDTO()); - stages.add(hostCacheStageHelper.createStage(cluster.getId(), callbackClassName, payload)); - - return stages; - } - - @Override - public void beforeStage(Stage stage) { - CommandDTO commandDTO = JsonUtils.readFromString(stage.getPayload(), CommandDTO.class); - if (stage.getName().equals(CACHE_STAGE_NAME) && commandDTO.getCommand() == Command.INSTALL && commandDTO.getCommandLevel() == CommandLevel.COMPONENT) { - hostComponentService.saveByCommand(commandDTO); - } - } - - @Override - public String generatePayload(Task task) { - Cluster cluster = task.getCluster(); - hostCacheStageHelper.createCache(cluster); - RequestMessage requestMessage = hostCacheStageHelper.getMessage(task.getHostname()); - log.info("[generatePayload]-[HostCacheJobFactory-requestMessage]: {}", requestMessage); - return JsonUtils.writeAsString(requestMessage); - } - -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentStartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentStartJobFactory.java deleted file mode 100644 index 6403dd2096f514153757140141758d4ee5e435c6..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentStartJobFactory.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.component; - -import jakarta.annotation.Resource; -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.enums.CommandLevel; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.common.enums.MaintainState; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.server.model.dto.CommandDTO; -import org.apache.bigtop.manager.server.model.dto.command.ComponentCommandDTO; -import org.apache.bigtop.manager.dao.entity.HostComponent; -import org.apache.bigtop.manager.dao.entity.Service; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.repository.HostComponentRepository; -import org.apache.bigtop.manager.dao.repository.ServiceRepository; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; - -import java.util.List; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ComponentStartJobFactory extends AbstractComponentJobFactory implements StageCallback { - - @Resource - private ServiceRepository serviceRepository; - - @Resource - private HostComponentRepository hostComponentRepository; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.COMPONENT, Command.START); - } - - @Override - public void afterStage(Stage stage) { - Long clusterId = stage.getCluster().getId(); - String componentName = stage.getComponentName(); - CommandDTO commandDTO = JsonUtils.readFromString(stage.getPayload(), CommandDTO.class); - List componentCommands = commandDTO.getComponentCommands(); - List hostnames = componentCommands - .stream() - .filter(x -> x.getComponentName().equals(componentName)) - .flatMap(x -> x.getHostnames().stream()) - .toList(); - - if (stage.getState() == JobState.SUCCESSFUL) { - List hostComponents = hostComponentRepository - .findAllByComponentClusterIdAndComponentComponentNameAndHostHostnameIn(clusterId, componentName, hostnames); - Service service = hostComponents.get(0).getComponent().getService(); - - // Update the state of the host component - hostComponents.forEach(hostComponent -> hostComponent.setState(MaintainState.STARTED)); - hostComponentRepository.saveAll(hostComponents); - - if (hostComponents.stream().allMatch(x -> x.getState() == MaintainState.STARTED)) { - service.setState(MaintainState.STARTED); - } - serviceRepository.save(service); - } - } - -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentStopJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentStopJobFactory.java deleted file mode 100644 index d0553dd7311180d71f95cf6dd593d15b43035d92..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/component/ComponentStopJobFactory.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.component; - -import jakarta.annotation.Resource; -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.enums.CommandLevel; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.common.enums.MaintainState; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.server.model.dto.CommandDTO; -import org.apache.bigtop.manager.server.model.dto.command.ComponentCommandDTO; -import org.apache.bigtop.manager.dao.entity.*; -import org.apache.bigtop.manager.dao.repository.HostComponentRepository; -import org.apache.bigtop.manager.dao.repository.ServiceRepository; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; - -import java.util.List; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ComponentStopJobFactory extends AbstractComponentJobFactory implements StageCallback { - - @Resource - private ServiceRepository serviceRepository; - - @Resource - private HostComponentRepository hostComponentRepository; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.COMPONENT, Command.STOP); - } - - @Override - public void afterStage(Stage stage) { - Long clusterId = stage.getCluster().getId(); - String componentName = stage.getComponentName(); - CommandDTO commandDTO = JsonUtils.readFromString(stage.getPayload(), CommandDTO.class); - List componentCommands = commandDTO.getComponentCommands(); - List hostnames = componentCommands - .stream() - .filter(x -> x.getComponentName().equals(componentName)) - .flatMap(x -> x.getHostnames().stream()) - .toList(); - - if (stage.getState() == JobState.SUCCESSFUL) { - List hostComponents = hostComponentRepository - .findAllByComponentClusterIdAndComponentComponentNameAndHostHostnameIn(clusterId, componentName, hostnames); - Service service = hostComponents.get(0).getComponent().getService(); - - // Update the state of the host component - hostComponents.forEach(hostComponent -> hostComponent.setState(MaintainState.STOPPED)); - hostComponentRepository.saveAll(hostComponents); - - if (hostComponents.stream().allMatch(x -> x.getState() == MaintainState.STOPPED)) { - service.setState(MaintainState.STOPPED); - } - serviceRepository.save(service); - } - } - -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/host/HostAddJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/host/HostAddJobFactory.java deleted file mode 100644 index f5ecbeb7681cbc575180baa676916fd0324a5136..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/host/HostAddJobFactory.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.apache.bigtop.manager.server.job.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.type.RequestMessage; -import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.server.enums.CommandLevel; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.helper.HostCacheStageHelper; -import org.apache.bigtop.manager.server.job.helper.HostCheckStageHelper; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.server.model.dto.command.HostCommandDTO; -import org.apache.bigtop.manager.dao.entity.Cluster; -import org.apache.bigtop.manager.dao.entity.Host; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; -import org.apache.bigtop.manager.dao.repository.*; -import org.apache.bigtop.manager.server.service.HostService; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; - -import java.util.ArrayList; -import java.util.List; - -import static org.apache.bigtop.manager.common.constants.Constants.CACHE_STAGE_NAME; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class HostAddJobFactory extends AbstractHostJobFactory implements StageCallback { - - @Resource - private HostRepository hostRepository; - - @Resource - private HostCacheStageHelper hostCacheStageHelper; - - @Resource - private HostService hostService; - - @Resource - private HostCheckStageHelper hostCheckStageHelper; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.HOST, Command.INSTALL); - } - - @Override - public List createStagesAndTasks() { - List stages = new ArrayList<>(); - String callbackClassName = this.getClass().getName(); - Long clusterId = jobContext.getCommandDTO().getClusterId(); - List hostnames = jobContext.getCommandDTO().getHostCommands().stream().map(HostCommandDTO::getHostname).toList(); - - // Create stages - stages.add(hostCheckStageHelper.createStage(clusterId, hostnames, callbackClassName)); - stages.add(createStage(callbackClassName, JsonUtils.writeAsString(hostnames))); - - return stages; - } - - public Stage createStage(String callbackClassName, String payload) { - hostCacheStageHelper.createCache(cluster); - - List hostList = hostRepository.findAllByClusterId(cluster.getId()); - List hostnames = new ArrayList<>(hostList.stream().map(Host::getHostname).toList()); - hostnames.addAll(JsonUtils.readFromString(payload)); - - Stage hostCacheStage = new Stage(); - hostCacheStage.setName(CACHE_STAGE_NAME); - hostCacheStage.setState(JobState.PENDING); - - if (StringUtils.isNotEmpty(callbackClassName)) { - hostCacheStage.setCallbackClassName(callbackClassName); - } else { - hostCacheStage.setCallbackClassName(this.getClass().getName()); - } - - if (StringUtils.isNotEmpty(callbackClassName)) { - hostCacheStage.setPayload(payload); - } - - List tasks = new ArrayList<>(); - for (String hostname : hostnames) { - Task task = new Task(); - task.setName("Cache host for " + hostname); - task.setStackName(cluster.getStack().getStackName()); - task.setStackVersion(cluster.getStack().getStackVersion()); - task.setHostname(hostname); - task.setServiceName("cluster"); - task.setServiceUser("root"); - task.setServiceGroup("root"); - task.setComponentName("bigtop-manager-agent"); - task.setCommand(Command.CUSTOM_COMMAND); - task.setCustomCommand("cache_host"); - task.setState(JobState.PENDING); - - RequestMessage requestMessage = hostCheckStageHelper.createMessage(hostname); - log.info("[HostCacheJobFactory-requestMessage]: {}", requestMessage); - task.setContent(JsonUtils.writeAsString(requestMessage)); - task.setMessageId(requestMessage.getMessageId()); - - tasks.add(task); - } - - hostCacheStage.setTasks(tasks); - return hostCacheStage; - } - - @Override - public void beforeStage(Stage stage) { - Cluster cluster = stage.getCluster(); - if (stage.getName().equals(CACHE_STAGE_NAME)) { - List hostnames = JsonUtils.readFromString(stage.getPayload()); - hostService.batchSave(cluster.getId(), hostnames); - } - } - - @Override - public String generatePayload(Task task) { - Cluster cluster = task.getCluster(); - hostCacheStageHelper.createCache(cluster); - RequestMessage requestMessage = hostCacheStageHelper.getMessage(task.getHostname()); - log.info("[generatePayload]-[HostCacheJobFactory-requestMessage]: {}", requestMessage); - return JsonUtils.writeAsString(requestMessage); - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/AbstractServiceJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/AbstractServiceJobFactory.java deleted file mode 100644 index 84734990296ef242d49710493cf1504b66ef7687..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/AbstractServiceJobFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.service; - -import jakarta.annotation.Resource; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.server.job.factory.component.AbstractComponentJobFactory; -import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; -import org.apache.bigtop.manager.dao.entity.Component; -import org.apache.bigtop.manager.dao.entity.HostComponent; -import org.apache.bigtop.manager.dao.repository.ComponentRepository; -import org.apache.bigtop.manager.dao.repository.HostComponentRepository; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * A Service Job can be seen as a collection of multiple Components and Hosts, - * so it can directly inherit from AbstractComponentJobFactory. - */ -public abstract class AbstractServiceJobFactory extends AbstractComponentJobFactory { - - @Resource - private ComponentRepository componentRepository; - - @Resource - private HostComponentRepository hostComponentRepository; - - protected Map> getComponentHostMapping(Command command) { - Map> componentHostMapping = new HashMap<>(); - for (Component component : getComponents()) { - String componentName = component.getComponentName(); - List hostComponentList = hostComponentRepository - .findAllByComponentClusterIdAndComponentComponentName(cluster.getId(), componentName); - - List hostnames = hostComponentList.stream().map(x -> x.getHost().getHostname()).toList(); - componentHostMapping.put(componentName, hostnames); - } - - return componentHostMapping; - } - - protected List getComponents() { - Long clusterId = jobContext.getCommandDTO().getClusterId(); - List serviceNameList = jobContext.getCommandDTO().getServiceCommands() - .stream() - .map(ServiceCommandDTO::getServiceName) - .toList(); - - return componentRepository.findAllByClusterIdAndServiceServiceNameIn(clusterId, serviceNameList); - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceInstallJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceInstallJobFactory.java deleted file mode 100644 index bbecb882185b77addc1446e581d518863cfc2534..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceInstallJobFactory.java +++ /dev/null @@ -1,167 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.service; - -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.common.message.type.RequestMessage; -import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.server.enums.CommandLevel; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.common.enums.MaintainState; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.helper.HostCacheStageHelper; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.server.model.dto.*; -import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; -import org.apache.bigtop.manager.server.model.mapper.ComponentMapper; -import org.apache.bigtop.manager.server.model.mapper.ServiceMapper; -import org.apache.bigtop.manager.dao.entity.*; -import org.apache.bigtop.manager.dao.repository.HostComponentRepository; -import org.apache.bigtop.manager.dao.repository.ServiceRepository; -import org.apache.bigtop.manager.server.service.ServiceService; -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 java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.apache.bigtop.manager.common.constants.Constants.CACHE_STAGE_NAME; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ServiceInstallJobFactory extends AbstractServiceJobFactory implements StageCallback { - - @Resource - private ServiceRepository serviceRepository; - - @Resource - private HostComponentRepository hostComponentRepository; - - @Resource - private ServiceService serviceService; - - @Resource - private HostCacheStageHelper hostCacheStageHelper; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.SERVICE, Command.INSTALL); - } - - /** - * create job and persist it to database - */ - @Override - protected List createStagesAndTasks() { - // Install all required components in service - List stages = super.createStagesAndTasks(); - - String callbackClassName = this.getClass().getName(); - - // cache stage - String payload = JsonUtils.writeAsString(jobContext.getCommandDTO()); - stages.add(hostCacheStageHelper.createStage(cluster.getId(), callbackClassName, payload)); - - // Start all required components in service - stages.addAll(createStages(callbackClassName, Command.START)); - - // Check all required components in service - stages.addAll(createStages(callbackClassName, Command.CHECK)); - - return stages; - } - - @Override - protected Map> getComponentHostMapping(Command command) { - return jobContext.getCommandDTO().getServiceCommands().stream() - .flatMap(serviceCommand -> serviceCommand.getComponentHosts().stream()) - .collect(Collectors.toMap(ComponentHostDTO::getComponentName, componentHostDTO -> { - if (command == Command.CHECK) { - return List.of(componentHostDTO.getHostnames().get(0)); - } else { - return componentHostDTO.getHostnames(); - } - })); - } - - @Override - protected List getComponents() { - List components = new ArrayList<>(); - CommandDTO commandDTO = jobContext.getCommandDTO(); - Long clusterId = commandDTO.getClusterId(); - - String stackName = cluster.getStack().getStackName(); - String stackVersion = cluster.getStack().getStackVersion(); - - Map>> stackKeyMap = StackUtils.getStackKeyMap(); - - ImmutablePair> immutablePair = stackKeyMap.get(StackUtils.fullStackName(stackName, stackVersion)); - Map serviceNameToDTO = immutablePair.getRight() - .stream() - .collect(Collectors.toMap(ServiceDTO::getServiceName, Function.identity())); - - // Persist service, component and hostComponent metadata to database - for (ServiceCommandDTO serviceCommand : commandDTO.getServiceCommands()) { - String serviceName = serviceCommand.getServiceName(); - Optional serviceOptional = serviceRepository.findByClusterIdAndServiceName(clusterId, serviceName); - if (serviceOptional.isPresent()) { - continue; - } - - ServiceDTO serviceDTO = serviceNameToDTO.get(serviceName); - Service service = ServiceMapper.INSTANCE.fromDTO2Entity(serviceDTO, cluster); - List componentDTOList = serviceDTO.getComponents(); - for (ComponentDTO componentDTO : componentDTOList) { - Component component = ComponentMapper.INSTANCE.fromDTO2Entity(componentDTO, service, cluster); - components.add(component); - } - } - - return components; - } - - @Override - public void beforeStage(Stage stage) { - CommandDTO commandDTO = JsonUtils.readFromString(stage.getPayload(), CommandDTO.class); - if (stage.getName().equals(CACHE_STAGE_NAME) && commandDTO.getCommand() == Command.INSTALL && commandDTO.getCommandLevel() == CommandLevel.SERVICE) { - serviceService.saveByCommand(commandDTO); - } - } - - @Override - public String generatePayload(Task task) { - Cluster cluster = task.getCluster(); - hostCacheStageHelper.createCache(cluster); - RequestMessage requestMessage = hostCacheStageHelper.getMessage(task.getHostname()); - log.info("[generatePayload]-[HostCacheJobFactory-requestMessage]: {}", requestMessage); - return JsonUtils.writeAsString(requestMessage); - } - - @Override - public void afterStage(Stage stage) { - Long clusterId = stage.getCluster().getId(); - String componentName = stage.getComponentName(); - CommandDTO commandDTO = JsonUtils.readFromString(stage.getPayload(), CommandDTO.class); - Command command = commandDTO.getCommand(); - - if (stage.getState() == JobState.SUCCESSFUL && command == Command.START) { - List hostComponents = hostComponentRepository.findAllByComponentClusterIdAndComponentComponentName(clusterId, componentName); - Service service = hostComponents.get(0).getComponent().getService(); - - hostComponents.forEach(hostComponent -> hostComponent.setState(MaintainState.STARTED)); - hostComponentRepository.saveAll(hostComponents); - - if (hostComponents.stream().allMatch(x -> x.getState() == MaintainState.STARTED)) { - service.setState(MaintainState.STARTED); - } - serviceRepository.save(service); - } - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceStartJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceStartJobFactory.java deleted file mode 100644 index 65ab202a0fe955f38cde7ef9203694614664c20f..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceStartJobFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.service; - -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.server.enums.CommandLevel; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.common.enums.MaintainState; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.dao.entity.HostComponent; -import org.apache.bigtop.manager.dao.entity.Service; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.repository.HostComponentRepository; -import org.apache.bigtop.manager.dao.repository.ServiceRepository; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; - -import java.util.List; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ServiceStartJobFactory extends AbstractServiceJobFactory implements StageCallback { - - @Resource - private ServiceRepository serviceRepository; - - @Resource - private HostComponentRepository hostComponentRepository; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.SERVICE, Command.START); - } - - @Override - public void afterStage(Stage stage) { - Long clusterId = stage.getCluster().getId(); - String componentName = stage.getComponentName(); - - if (stage.getState() == JobState.SUCCESSFUL) { - List hostComponents = hostComponentRepository.findAllByComponentClusterIdAndComponentComponentName(clusterId, componentName); - Service service = hostComponents.get(0).getComponent().getService(); - - hostComponents.forEach(hostComponent -> hostComponent.setState(MaintainState.STARTED)); - hostComponentRepository.saveAll(hostComponents); - - if (hostComponents.stream().allMatch(x -> x.getState() == MaintainState.STARTED)) { - service.setState(MaintainState.STARTED); - } - serviceRepository.save(service); - } - } - -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceStopJobFactory.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceStopJobFactory.java deleted file mode 100644 index 5716f2b181c9ad472028cbc66c07166d2b477866..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/factory/service/ServiceStopJobFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.apache.bigtop.manager.server.job.factory.service; - -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.enums.Command; -import org.apache.bigtop.manager.server.enums.CommandLevel; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.common.enums.MaintainState; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.strategy.StageCallback; -import org.apache.bigtop.manager.dao.entity.HostComponent; -import org.apache.bigtop.manager.dao.entity.Service; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.repository.HostComponentRepository; -import org.apache.bigtop.manager.dao.repository.ServiceRepository; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; - -import java.util.List; - -@Slf4j -@org.springframework.stereotype.Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ServiceStopJobFactory extends AbstractServiceJobFactory implements StageCallback { - - @Resource - private ServiceRepository serviceRepository; - - @Resource - private HostComponentRepository hostComponentRepository; - - @Override - public CommandIdentifier getCommandIdentifier() { - return new CommandIdentifier(CommandLevel.SERVICE, Command.STOP); - } - - @Override - public void afterStage(Stage stage) { - Long clusterId = stage.getCluster().getId(); - String componentName = stage.getComponentName(); - - if (stage.getState() == JobState.SUCCESSFUL) { - List hostComponents = hostComponentRepository.findAllByComponentClusterIdAndComponentComponentName(clusterId, componentName); - Service service = hostComponents.get(0).getComponent().getService(); - - hostComponents.forEach(hostComponent -> hostComponent.setState(MaintainState.STOPPED)); - hostComponentRepository.saveAll(hostComponents); - - if (hostComponents.stream().allMatch(x -> x.getState() == MaintainState.STOPPED)) { - service.setState(MaintainState.STOPPED); - } - serviceRepository.save(service); - } - } - -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/AbstractJobStrategy.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/AbstractJobStrategy.java deleted file mode 100644 index 3c0df5bebdc982e7ee91173ef4d9e6aae43ed352..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/AbstractJobStrategy.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.apache.bigtop.manager.server.job.strategy; - -import jakarta.annotation.Resource; -import org.apache.bigtop.manager.server.exception.ServerException; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.springframework.context.ApplicationContext; - -public abstract class AbstractJobStrategy implements JobStrategy { - @Resource - private ApplicationContext applicationContext; - - public StageCallback getStageCallback(Stage stage) { - String callbackClassName = stage.getCallbackClassName(); - if (callbackClassName != null) { - try { - Class clazz = Class.forName(callbackClassName); - if (StageCallback.class.isAssignableFrom(clazz)) { - return (StageCallback) applicationContext.getBean(clazz); - } - } catch (Exception e) { - throw new ServerException(e); - } - } - return null; - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/AsyncJobStrategy.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/AsyncJobStrategy.java deleted file mode 100644 index c0e0b15cfeb88cec123fc437a611835fa5372283..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/AsyncJobStrategy.java +++ /dev/null @@ -1,184 +0,0 @@ -package org.apache.bigtop.manager.server.job.strategy; - -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.constants.MessageConstants; -import org.apache.bigtop.manager.common.message.type.BaseCommandMessage; -import org.apache.bigtop.manager.common.message.type.RequestMessage; -import org.apache.bigtop.manager.common.message.type.ResultMessage; -import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.server.enums.JobStrategyType; -import org.apache.bigtop.manager.server.holder.SpringContextHolder; -import org.apache.bigtop.manager.dao.entity.CommandLog; -import org.apache.bigtop.manager.dao.entity.Job; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; -import org.apache.bigtop.manager.dao.repository.CommandLogRepository; -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.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -import static org.apache.bigtop.manager.common.constants.Constants.CACHE_STAGE_NAME; -import static org.apache.bigtop.manager.common.constants.Constants.COMMAND_MESSAGE_RESPONSE_TIMEOUT; - -@Slf4j -@Component -public class AsyncJobStrategy extends AbstractJobStrategy { - - @Resource - private JobRepository jobRepository; - - @Resource - private StageRepository stageRepository; - - @Resource - private TaskRepository taskRepository; - - @Resource - private CommandLogRepository commandLogRepository; - - private CountDownLatch countDownLatch; - - private AtomicBoolean failed; - - @Override - public Boolean handle(Job job, JobStrategyType strategyType) { - failed = new AtomicBoolean(false); - List stageCompletedList = new ArrayList<>(); - - // Job state change to processing - job.setState(JobState.PROCESSING); - jobRepository.save(job); - - // Sort stage - List stages = job.getStages(); - stages.sort(Comparator.comparingInt(Stage::getStageOrder)); - - LinkedBlockingQueue pipeLineQueue = new LinkedBlockingQueue<>(stages); - while (!pipeLineQueue.isEmpty()) { - Stage stage = pipeLineQueue.poll(); - - // Stage state change to processing - stage.setState(JobState.PROCESSING); - stageRepository.save(stage); - StageCallback stageCallback = getStageCallback(stage); - - if (stageCallback != null) { - stageCallback.beforeStage(stage); - } - - countDownLatch = new CountDownLatch(stage.getTasks().size()); - for (Task task : stage.getTasks()) { - // Task state change to processing - task.setState(JobState.PROCESSING); - taskRepository.save(task); - - String content = task.getContent(); - if (stageCallback != null && stage.getName().equals(CACHE_STAGE_NAME)) { - content = stageCallback.generatePayload(task); - } - - BaseCommandMessage message = JsonUtils.readFromString(content, RequestMessage.class); - message.setTaskId(task.getId()); - message.setStageId(stage.getId()); - message.setJobId(job.getId()); - log.info("[AsyncJobStrategy] [BaseCommandMessage]: {}", message); - - SpringContextHolder.getServerWebSocket().sendMessage(task.getHostname(), message, this::call); - } - - boolean timeoutFlag = false; - try { - timeoutFlag = countDownLatch.await(COMMAND_MESSAGE_RESPONSE_TIMEOUT, TimeUnit.MILLISECONDS); - } catch (Exception e) { - stage.setState(JobState.FAILED); - } - - if (timeoutFlag && !failed.get()) { - stage.setState(JobState.SUCCESSFUL); - } else { - log.error("stage failed or timeout, cancel remain stages, [timeoutFlag: {}], [failed: {}]", timeoutFlag, failed); - stage.setState(JobState.FAILED); - if (strategyType == JobStrategyType.OVER_ON_FAIL) { - releaseRemainStages(pipeLineQueue); - } - } - stageCompletedList.add(stage); - stageRepository.save(stage); - - if (stageCallback != null) { - stageCallback.afterStage(stage); - } - } - - boolean stageSuccessful = stageCompletedList.stream().allMatch(stage -> stage.getState() == JobState.SUCCESSFUL); - if (stageSuccessful) { - job.setState(JobState.SUCCESSFUL); - } else { - job.setState(JobState.FAILED); - } - jobRepository.save(job); - return failed.get(); - } - - - /** - * callback - */ - public void call(ResultMessage resultMessage) { - log.info("Execute RequestMessage completed, {}", resultMessage); - Task task = taskRepository.getReferenceById(resultMessage.getTaskId()); - - if (resultMessage.getCode() == MessageConstants.SUCCESS_CODE) { - task.setState(JobState.SUCCESSFUL); - } else { - task.setState(JobState.FAILED); - failed.set(true); - } - taskRepository.save(task); - saveCommandLog(resultMessage.getResult(), task); - - countDownLatch.countDown(); - } - - - /** - * Release remaining Stages - * Execute when failed or timeout - */ - private void releaseRemainStages(LinkedBlockingQueue pipeLineQueue) { - if (!pipeLineQueue.isEmpty()) { - List remainStages = new ArrayList<>(pipeLineQueue.size()); - pipeLineQueue.drainTo(remainStages); - for (Stage stage : remainStages) { - // Setting the status of the remaining stages to CANCELED - stage.setState(JobState.CANCELED); - stageRepository.save(stage); - - stage.getTasks().forEach(t -> t.setState(JobState.CANCELED)); - taskRepository.saveAll(stage.getTasks()); - } - } - } - - private void saveCommandLog(String result, Task task) { - CommandLog commandLog = new CommandLog(); - commandLog.setTask(task); - commandLog.setStage(task.getStage()); - commandLog.setJob(task.getJob()); - commandLog.setHostname(task.getHostname()); - commandLog.setResult(result); - commandLogRepository.save(commandLog); - } - -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/JobStrategy.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/JobStrategy.java deleted file mode 100644 index aae83862809f8dc3f53c8178cdb1fe523bc907c0..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/JobStrategy.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.apache.bigtop.manager.server.job.strategy; - -import org.apache.bigtop.manager.server.enums.JobStrategyType; -import org.apache.bigtop.manager.dao.entity.Job; - -public interface JobStrategy { - Boolean handle(Job job, JobStrategyType strategyType); -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/StageCallback.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/StageCallback.java deleted file mode 100644 index 56fbac634a72151b35f73a021ecf6b48786fbc0c..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/StageCallback.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.apache.bigtop.manager.server.job.strategy; - -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; - -public interface StageCallback { - - default void beforeStage(Stage stage) { - } - - default void afterStage(Stage stage) { - } - - default String generatePayload(Task task) { - return task.getContent(); - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/SyncJobStrategy.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/SyncJobStrategy.java deleted file mode 100644 index 8816066431b7dae9817fff35a5898af76ebe34d7..0000000000000000000000000000000000000000 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/job/strategy/SyncJobStrategy.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.apache.bigtop.manager.server.job.strategy; - -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.common.constants.MessageConstants; -import org.apache.bigtop.manager.common.message.type.BaseCommandMessage; -import org.apache.bigtop.manager.common.message.type.RequestMessage; -import org.apache.bigtop.manager.common.message.type.ResultMessage; -import org.apache.bigtop.manager.common.utils.JsonUtils; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.server.enums.JobStrategyType; -import org.apache.bigtop.manager.server.holder.SpringContextHolder; -import org.apache.bigtop.manager.dao.entity.Job; -import org.apache.bigtop.manager.dao.entity.Stage; -import org.apache.bigtop.manager.dao.entity.Task; -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.springframework.stereotype.Component; - -import java.util.Comparator; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import static org.apache.bigtop.manager.common.constants.Constants.CACHE_STAGE_NAME; - -@Slf4j -@Component -public class SyncJobStrategy extends AbstractJobStrategy { - - @Resource - private JobRepository jobRepository; - - @Resource - private StageRepository stageRepository; - - @Resource - private TaskRepository taskRepository; - - @Override - public Boolean handle(Job job, JobStrategyType strategyType) { - AtomicBoolean failed = new AtomicBoolean(false); - List stages = job.getStages(); - - // Sort stage - stages.sort(Comparator.comparingInt(Stage::getStageOrder)); - - job.setState(JobState.PROCESSING); - jobRepository.save(job); - for (Stage stage : stages) { - stage.setState(JobState.PROCESSING); - stageRepository.save(stage); - - StageCallback stageCallback = getStageCallback(stage); - if (stageCallback != null) { - stageCallback.beforeStage(stage); - } - - List tasks = stage.getTasks(); - for (Task task : tasks) { - task.setState(JobState.PROCESSING); - taskRepository.save(task); - - String content = task.getContent(); - if (stageCallback != null && stage.getName().equals(CACHE_STAGE_NAME)) { - content = stageCallback.generatePayload(task); - } - BaseCommandMessage message = JsonUtils.readFromString(content, RequestMessage.class); - log.info("[SyncJobStrategy] [BaseCommandMessage]: {}", message); - String hostname = task.getHostname(); - ResultMessage res = SpringContextHolder.getServerWebSocket().sendMessage(hostname, message); - if (res == null || res.getCode() != MessageConstants.SUCCESS_CODE) { - task.setState(JobState.FAILED); - failed.set(true); - } else { - task.setState(JobState.SUCCESSFUL); - } - taskRepository.save(task); - - if (failed.get() && strategyType == JobStrategyType.OVER_ON_FAIL) { - break; - } - } - - if (failed.get()) { - stage.setState(JobState.FAILED); - } else { - stage.setState(JobState.SUCCESSFUL); - } - stageRepository.save(stage); - - if (stageCallback != null) { - stageCallback.afterStage(stage); - } - - if (failed.get() && strategyType == JobStrategyType.OVER_ON_FAIL) { - break; - } - } - if (failed.get()) { - job.setState(JobState.FAILED); - } else { - job.setState(JobState.SUCCESSFUL); - } - jobRepository.save(job); - - return failed.get(); - } -} diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ClusterMapper.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ClusterMapper.java index d3285e3a5a3d0d4bd32737518f3623c6f6ef87c6..98a6bd1a9ac9b2f7037338d29bda4dc1cdc28fc9 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ClusterMapper.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ClusterMapper.java @@ -2,6 +2,7 @@ package org.apache.bigtop.manager.server.model.mapper; import org.apache.bigtop.manager.server.model.dto.ClusterDTO; import org.apache.bigtop.manager.server.model.dto.StackDTO; +import org.apache.bigtop.manager.server.model.dto.command.ClusterCommandDTO; import org.apache.bigtop.manager.server.model.req.ClusterReq; import org.apache.bigtop.manager.server.model.vo.ClusterVO; import org.apache.bigtop.manager.dao.entity.Cluster; @@ -18,6 +19,8 @@ public interface ClusterMapper { ClusterDTO fromReq2DTO(ClusterReq clusterReq); + ClusterDTO fromCommand2DTO(ClusterCommandDTO clusterCommandDTO); + Cluster fromDTO2Entity(ClusterDTO clusterDTO); @Mapping(target = "stackName", source = "cluster.stack.stackName") diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/JobMapper.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/JobMapper.java index f9a502abd3578a6dc33b21df13b1449fe05abd7f..86beae6c476d31398ee7a6c73ccea62c8945878f 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/JobMapper.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/JobMapper.java @@ -1,13 +1,8 @@ package org.apache.bigtop.manager.server.model.mapper; -import org.apache.bigtop.manager.common.enums.JobState; -import org.apache.bigtop.manager.server.model.dto.CommandDTO; -import org.apache.bigtop.manager.server.model.dto.HostDTO; -import org.apache.bigtop.manager.server.model.vo.JobVO; import org.apache.bigtop.manager.server.model.vo.CommandVO; -import org.apache.bigtop.manager.dao.entity.Cluster; +import org.apache.bigtop.manager.server.model.vo.JobVO; import org.apache.bigtop.manager.dao.entity.Job; -import org.mapstruct.Context; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @@ -19,14 +14,6 @@ public interface JobMapper { JobMapper INSTANCE = Mappers.getMapper(JobMapper.class); - @Mapping(target = "cluster", expression = "java(cluster)") - @Mapping(target = "state", expression = "java(initState())") - Job fromDTO2Entity(CommandDTO commandDTO, @Context Cluster cluster); - - @Mapping(target = "cluster", expression = "java(cluster)") - @Mapping(target = "state", expression = "java(initState())") - Job fromDTO2Entity(HostDTO hostDTO, @Context Cluster cluster); - @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss") @Mapping(target = "updateTime", dateFormat = "yyyy-MM-dd HH:mm:ss") JobVO fromEntity2VO(Job job); @@ -34,9 +21,4 @@ public interface JobMapper { List fromEntity2VO(List job); CommandVO fromEntity2CommandVO(Job job); - - default JobState initState() { - return JobState.PENDING; - } - } 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 10c8f4386e16741d9896700838d205ec70bcfa14..4c77eca38618b44fa8f786ed49bf718365de155c 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 @@ -1,14 +1,14 @@ package org.apache.bigtop.manager.server.service.impl; import lombok.extern.slf4j.Slf4j; +import org.apache.bigtop.manager.server.command.CommandIdentifier; +import org.apache.bigtop.manager.server.command.event.CommandEvent; +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.holder.SpringContextHolder; -import org.apache.bigtop.manager.server.job.CommandIdentifier; -import org.apache.bigtop.manager.server.job.event.CommandEvent; -import org.apache.bigtop.manager.server.job.factory.JobContext; -import org.apache.bigtop.manager.server.job.factory.JobFactories; -import org.apache.bigtop.manager.server.job.factory.JobFactory; -import org.apache.bigtop.manager.server.job.validator.ValidatorExecutionChain; -import org.apache.bigtop.manager.server.job.validator.ValidatorContext; import org.apache.bigtop.manager.server.model.dto.CommandDTO; import org.apache.bigtop.manager.server.model.mapper.JobMapper; import org.apache.bigtop.manager.server.model.vo.CommandVO; 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 961819591d32490aa4dc551f6c10c6c7e1976351..62b48dcee43f12c91ab9e47e44da574287245806 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 @@ -2,9 +2,7 @@ package org.apache.bigtop.manager.server.service.impl; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.apache.bigtop.manager.server.enums.ApiExceptionEnum; import org.apache.bigtop.manager.common.enums.MaintainState; -import org.apache.bigtop.manager.server.exception.ApiException; import org.apache.bigtop.manager.server.model.dto.*; import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; import org.apache.bigtop.manager.server.model.mapper.ComponentMapper; @@ -15,7 +13,6 @@ import org.apache.bigtop.manager.dao.repository.*; import org.apache.bigtop.manager.server.service.ConfigService; import org.apache.bigtop.manager.server.service.ServiceService; import org.apache.bigtop.manager.server.utils.StackUtils; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import java.util.List; @@ -88,7 +85,6 @@ public class ServiceServiceImpl implements ServiceService { ServiceDTO serviceDTO = serviceNameToDTO.get(serviceName); Service service = ServiceMapper.INSTANCE.fromDTO2Entity(serviceDTO, cluster); - service.setState(MaintainState.INSTALLED); service = serviceRepository.save(service); // Init config for new installed service @@ -117,7 +113,7 @@ public class ServiceServiceImpl implements ServiceService { hostComponentOptional.ifPresent(value -> hostComponent.setId(value.getId())); hostComponent.setHost(host); hostComponent.setComponent(component); - hostComponent.setState(MaintainState.INSTALLED); + hostComponent.setState(MaintainState.UNINSTALLED); hostComponentRepository.save(hostComponent); } } diff --git a/bigtop-manager-stack/bigtop-manager-stack-common/src/main/java/org/apache/bigtop/manager/stack/common/utils/LocalSettings.java b/bigtop-manager-stack/bigtop-manager-stack-common/src/main/java/org/apache/bigtop/manager/stack/common/utils/LocalSettings.java index 0c2a02213ebae91707d9b9112a97f5fef99b354f..aaa8930d788606f38317fc212d7b12b1cd490c08 100644 --- a/bigtop-manager-stack/bigtop-manager-stack-common/src/main/java/org/apache/bigtop/manager/stack/common/utils/LocalSettings.java +++ b/bigtop-manager-stack/bigtop-manager-stack-common/src/main/java/org/apache/bigtop/manager/stack/common/utils/LocalSettings.java @@ -80,9 +80,9 @@ public class LocalSettings { return userMap; } - public static Set packages() { + public static List packages() { ClusterInfo cluster = cluster(); - return Optional.ofNullable(cluster.getPackages()).orElse(Set.of()); + return Optional.ofNullable(cluster.getPackages()).orElse(List.of()); } public static List repos() { diff --git a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/hooks/InstallHookImpl.java b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/hooks/InstallHookImpl.java index 853a1b5ade64c33cf7cdcf4cd5234710e7cf8c99..1ed48e8c9e63cba953d2ec0c22fa4919636b5ef6 100644 --- a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/hooks/InstallHookImpl.java +++ b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/hooks/InstallHookImpl.java @@ -34,7 +34,7 @@ public class InstallHookImpl implements Hook { } } - Set packages = LocalSettings.packages(); + List packages = LocalSettings.packages(); PackageUtils.install(packages); } diff --git a/bigtop-manager-ui/src/api/cluster/index.ts b/bigtop-manager-ui/src/api/cluster/index.ts index 4f19956c9bfc19605722936c455ed6abcd4de5cb..de52ffb25bddc8b464b1987a91b1178823499087 100644 --- a/bigtop-manager-ui/src/api/cluster/index.ts +++ b/bigtop-manager-ui/src/api/cluster/index.ts @@ -16,8 +16,7 @@ */ import request from '@/api/request.ts' -import { ClusterReq, ClusterVO } from '@/api/cluster/types.ts' -import { CommandVO } from '@/api/command/types.ts' +import { ClusterVO } from '@/api/cluster/types.ts' export const getClusters = (): Promise => { return request({ @@ -25,11 +24,3 @@ export const getClusters = (): Promise => { url: '/clusters' }) } - -export const createCluster = (data: ClusterReq): Promise => { - return request({ - method: 'post', - url: '/clusters', - data - }) -}