|
26 | 26 | import com.webank.wedatasphere.dss.workflow.core.entity.WorkflowNode; |
27 | 27 | import org.apache.commons.lang.StringUtils; |
28 | 28 |
|
| 29 | +import java.util.ArrayList; |
29 | 30 | import java.util.Arrays; |
30 | 31 | import java.util.HashMap; |
31 | 32 | import java.util.List; |
@@ -64,13 +65,16 @@ private String baseConversion(WorkflowNode workflowNode){ |
64 | 65 | } |
65 | 66 |
|
66 | 67 | private String convertJobToString(LinkisJob job){ |
67 | | - HashMap<String, String> map = new HashMap<>(8); |
68 | | - map.put(AzkabanConstant.LINKIS_VERSION, AzkabanConf.LINKIS_VERSION.getValue()); |
| 68 | + HashMap<String, String> map = new HashMap<>(16); |
| 69 | + boolean decisionJob = BranchSchedulisConstant.DECISION_JOB_TYPE.equalsIgnoreCase(job.getType()); |
| 70 | + if (!decisionJob) { |
| 71 | + map.put(AzkabanConstant.LINKIS_VERSION, AzkabanConf.LINKIS_VERSION.getValue()); |
| 72 | + map.put(AzkabanConstant.LINKIS_TYPE,job.getLinkistype()); |
| 73 | + map.put(AzkabanConstant.JOB_COMMAND,job.getCommand()); |
| 74 | + } |
69 | 75 | map.put(AzkabanConstant.JOB_TYPE,job.getType()); |
70 | | - map.put(AzkabanConstant.LINKIS_TYPE,job.getLinkistype()); |
71 | 76 | map.put(AzkabanConstant.ZAKABAN_DEPENDENCIES_KEY,job.getDependencies()); |
72 | 77 | map.put(WorkflowConstant.PROXY_USER,job.getProxyUser()); |
73 | | - map.put(AzkabanConstant.JOB_COMMAND,job.getCommand()); |
74 | 78 | map.put(AzkabanConstant.JOB_COMMENT,job.getComment()); |
75 | 79 | map.put(AzkabanConstant.AUTO_DISABLED,job.getAutoDisabled()); |
76 | 80 | Map<String, Object> labels = new HashMap<>(1); |
@@ -139,14 +143,54 @@ private void convertBranchControl(WorkflowNode workflowNode, LinkisJob job) { |
139 | 143 | if (params == null || params.isEmpty()) { |
140 | 144 | return; |
141 | 145 | } |
142 | | - putBranchConf(job, params, BranchSchedulisConstant.BRANCH_ROUTE_ENABLED); |
143 | | - putBranchConf(job, params, BranchSchedulisConstant.BRANCH_ROUTE_NODE_ID); |
144 | | - putBranchConf(job, params, BranchSchedulisConstant.BRANCH_ROUTE_NODE_NAME); |
145 | | - putBranchConf(job, params, BranchSchedulisConstant.BRANCH_ROUTE_RULE_TEXT); |
146 | | - putBranchConf(job, params, BranchSchedulisConstant.BRANCH_ROUTE_TARGETS); |
| 146 | + if (isBranchNode(workflowNode)) { |
| 147 | + putDecisionRules(job, stringifyConfValue(params.get(BranchSchedulisConstant.BRANCH_ROUTE_RULE_TEXT))); |
| 148 | + return; |
| 149 | + } |
147 | 150 | putBranchConf(job, params, BranchSchedulisConstant.BRANCH_GUARD_RULES); |
148 | 151 | } |
149 | 152 |
|
| 153 | + private boolean isBranchNode(WorkflowNode workflowNode) { |
| 154 | + return workflowNode != null && BranchSchedulisConstant.BRANCH_NODE_TYPE.equalsIgnoreCase(workflowNode.getNodeType()); |
| 155 | + } |
| 156 | + |
| 157 | + private void putDecisionRules(LinkisJob job, String branchRuleText) { |
| 158 | + if (StringUtils.isBlank(branchRuleText)) { |
| 159 | + return; |
| 160 | + } |
| 161 | + List<DecisionRule> decisionRules = parseDecisionRules(branchRuleText); |
| 162 | + for (int i = 0; i < decisionRules.size(); i++) { |
| 163 | + DecisionRule rule = decisionRules.get(i); |
| 164 | + int index = i + 1; |
| 165 | + job.getConf().put(BranchSchedulisConstant.DECISION_CONDITION_PREFIX + index, rule.condition); |
| 166 | + job.getConf().put(BranchSchedulisConstant.DECISION_ON_SUCCESS_PREFIX + index, rule.targetJobName); |
| 167 | + job.getConf().put(BranchSchedulisConstant.DECISION_ON_FAILURE_PREFIX + index, ""); |
| 168 | + } |
| 169 | + } |
| 170 | + |
| 171 | + private List<DecisionRule> parseDecisionRules(String branchRuleText) { |
| 172 | + List<DecisionRule> rules = new ArrayList<>(); |
| 173 | + for (String ruleText : branchRuleText.split(";")) { |
| 174 | + if (StringUtils.isBlank(ruleText)) { |
| 175 | + continue; |
| 176 | + } |
| 177 | + int separatorIndex = ruleText.lastIndexOf('='); |
| 178 | + if (separatorIndex <= 0 || separatorIndex >= ruleText.length() - 1) { |
| 179 | + continue; |
| 180 | + } |
| 181 | + String condition = ruleText.substring(0, separatorIndex).trim(); |
| 182 | + String targetJobName = ruleText.substring(separatorIndex + 1).trim(); |
| 183 | + if (StringUtils.isBlank(condition) || StringUtils.isBlank(targetJobName)) { |
| 184 | + continue; |
| 185 | + } |
| 186 | + if ("default".equalsIgnoreCase(condition)) { |
| 187 | + condition = "true"; |
| 188 | + } |
| 189 | + rules.add(new DecisionRule(condition, targetJobName)); |
| 190 | + } |
| 191 | + return rules; |
| 192 | + } |
| 193 | + |
150 | 194 | private void putBranchConf(LinkisJob job, Map<String, Object> params, String key) { |
151 | 195 | Object value = params.get(key); |
152 | 196 | if (value != null) { |
@@ -175,4 +219,14 @@ private void convertJobCommand(WorkflowNode workflowNode, LinkisJob job){ |
175 | 219 | job.setCommand(DSSCommonUtils.COMMON_GSON.toJson(jobContent)); |
176 | 220 | } |
177 | 221 | } |
| 222 | + |
| 223 | + private static class DecisionRule { |
| 224 | + private final String condition; |
| 225 | + private final String targetJobName; |
| 226 | + |
| 227 | + private DecisionRule(String condition, String targetJobName) { |
| 228 | + this.condition = condition; |
| 229 | + this.targetJobName = targetJobName; |
| 230 | + } |
| 231 | + } |
178 | 232 | } |
0 commit comments