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
- })
-}