Browse Source
* Global parameter and local parameter calculation external expansion. * k8s task ut fix. * TimePlaceholderUtils import DateUtils fix * follow the review comments to fix. * follow the review comments to fix. * e2e rerun3.1.0-release
WangJPLeo
2 years ago
committed by
GitHub
39 changed files with 344 additions and 424 deletions
@ -1,96 +0,0 @@ |
|||||||
/* |
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
||||||
* contributor license agreements. See the NOTICE file distributed with |
|
||||||
* this work for additional information regarding copyright ownership. |
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
|
||||||
* (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.apache.dolphinscheduler.common.expand; |
|
||||||
|
|
||||||
import org.apache.dolphinscheduler.common.enums.CommandType; |
|
||||||
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
|
||||||
import org.apache.dolphinscheduler.common.utils.ParameterUtils; |
|
||||||
import org.apache.dolphinscheduler.common.utils.placeholder.BusinessTimeUtils; |
|
||||||
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
import org.springframework.stereotype.Component; |
|
||||||
|
|
||||||
import java.util.Date; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.Set; |
|
||||||
|
|
||||||
@Component |
|
||||||
public class DolphinSchedulerCuringGlobalParams implements CuringGlobalParamsService { |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private TimePlaceholderResolverExpandService timePlaceholderResolverExpandService; |
|
||||||
|
|
||||||
@Override |
|
||||||
public String convertParameterPlaceholders(String val, Map<String, String> allParamMap) { |
|
||||||
return ParameterUtils.convertParameterPlaceholders(val, allParamMap); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean timeFunctionNeedExpand(String placeholderName) { |
|
||||||
return timePlaceholderResolverExpandService.timeFunctionNeedExpand(placeholderName); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String timeFunctionExtension(Integer processInstanceId, String timezone, String placeholderName) { |
|
||||||
return timePlaceholderResolverExpandService.timeFunctionExtension(processInstanceId, timezone, placeholderName); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String curingGlobalParams(Integer processInstanceId, Map<String, String> globalParamMap, List<Property> globalParamList, CommandType commandType, Date scheduleTime, String timezone) { |
|
||||||
if (globalParamList == null || globalParamList.isEmpty()) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
Map<String, String> globalMap = new HashMap<>(); |
|
||||||
if (globalParamMap != null) { |
|
||||||
globalMap.putAll(globalParamMap); |
|
||||||
} |
|
||||||
Map<String, String> allParamMap = new HashMap<>(); |
|
||||||
//If it is a complement, a complement time needs to be passed in, according to the task type
|
|
||||||
Map<String, String> timeParams = BusinessTimeUtils. |
|
||||||
getBusinessTime(commandType, scheduleTime, timezone); |
|
||||||
|
|
||||||
if (timeParams != null) { |
|
||||||
allParamMap.putAll(timeParams); |
|
||||||
} |
|
||||||
allParamMap.putAll(globalMap); |
|
||||||
Set<Map.Entry<String, String>> entries = allParamMap.entrySet(); |
|
||||||
Map<String, String> resolveMap = new HashMap<>(); |
|
||||||
for (Map.Entry<String, String> entry : entries) { |
|
||||||
String val = entry.getValue(); |
|
||||||
if (val.startsWith("$")) { |
|
||||||
String str = ""; |
|
||||||
if (timeFunctionNeedExpand(val)) { |
|
||||||
str = timeFunctionExtension(processInstanceId, timezone, val); |
|
||||||
} else { |
|
||||||
str = convertParameterPlaceholders(val, allParamMap); |
|
||||||
} |
|
||||||
resolveMap.put(entry.getKey(), str); |
|
||||||
} |
|
||||||
} |
|
||||||
globalMap.putAll(resolveMap); |
|
||||||
for (Property property : globalParamList) { |
|
||||||
String val = globalMap.get(property.getProp()); |
|
||||||
if (val != null) { |
|
||||||
property.setValue(val); |
|
||||||
} |
|
||||||
} |
|
||||||
return JSONUtils.toJsonString(globalParamList); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,228 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.service.expand; |
||||||
|
|
||||||
|
import lombok.NonNull; |
||||||
|
import org.apache.dolphinscheduler.common.Constants; |
||||||
|
import org.apache.dolphinscheduler.common.enums.CommandType; |
||||||
|
import org.apache.dolphinscheduler.common.utils.DateUtils; |
||||||
|
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
||||||
|
import org.apache.dolphinscheduler.common.utils.ParameterUtils; |
||||||
|
import org.apache.dolphinscheduler.common.utils.placeholder.BusinessTimeUtils; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessInstance; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.TaskInstance; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.parser.ParamUtils; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.utils.MapUtils; |
||||||
|
import org.apache.dolphinscheduler.spi.utils.StringUtils; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.PARAMETER_TASK_EXECUTE_PATH; |
||||||
|
import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.PARAMETER_TASK_INSTANCE_ID; |
||||||
|
|
||||||
|
@Component |
||||||
|
public class CuringGlobalParams implements CuringParamsService { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private TimePlaceholderResolverExpandService timePlaceholderResolverExpandService; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String convertParameterPlaceholders(String val, Map<String, String> allParamMap) { |
||||||
|
return ParameterUtils.convertParameterPlaceholders(val, allParamMap); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean timeFunctionNeedExpand(String placeholderName) { |
||||||
|
return timePlaceholderResolverExpandService.timeFunctionNeedExpand(placeholderName); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String timeFunctionExtension(Integer processInstanceId, String timezone, String placeholderName) { |
||||||
|
return timePlaceholderResolverExpandService.timeFunctionExtension(processInstanceId, timezone, placeholderName); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* here it is judged whether external expansion calculation is required and the calculation result is obtained |
||||||
|
* @param processInstanceId |
||||||
|
* @param globalParamMap |
||||||
|
* @param globalParamList |
||||||
|
* @param commandType |
||||||
|
* @param scheduleTime |
||||||
|
* @param timezone |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String curingGlobalParams(Integer processInstanceId, Map<String, String> globalParamMap, List<Property> globalParamList, CommandType commandType, Date scheduleTime, String timezone) { |
||||||
|
if (globalParamList == null || globalParamList.isEmpty()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
Map<String, String> globalMap = new HashMap<>(); |
||||||
|
if (globalParamMap != null) { |
||||||
|
globalMap.putAll(globalParamMap); |
||||||
|
} |
||||||
|
Map<String, String> allParamMap = new HashMap<>(); |
||||||
|
//If it is a complement, a complement time needs to be passed in, according to the task type
|
||||||
|
Map<String, String> timeParams = BusinessTimeUtils. |
||||||
|
getBusinessTime(commandType, scheduleTime, timezone); |
||||||
|
|
||||||
|
if (timeParams != null) { |
||||||
|
allParamMap.putAll(timeParams); |
||||||
|
} |
||||||
|
allParamMap.putAll(globalMap); |
||||||
|
Set<Map.Entry<String, String>> entries = allParamMap.entrySet(); |
||||||
|
Map<String, String> resolveMap = new HashMap<>(); |
||||||
|
for (Map.Entry<String, String> entry : entries) { |
||||||
|
String val = entry.getValue(); |
||||||
|
if (val.startsWith(Constants.FUNCTION_START_WITH)) { |
||||||
|
String str = ""; |
||||||
|
// whether external scaling calculation is required
|
||||||
|
if (timeFunctionNeedExpand(val)) { |
||||||
|
str = timeFunctionExtension(processInstanceId, timezone, val); |
||||||
|
} else { |
||||||
|
str = convertParameterPlaceholders(val, allParamMap); |
||||||
|
} |
||||||
|
resolveMap.put(entry.getKey(), str); |
||||||
|
} |
||||||
|
} |
||||||
|
globalMap.putAll(resolveMap); |
||||||
|
for (Property property : globalParamList) { |
||||||
|
String val = globalMap.get(property.getProp()); |
||||||
|
if (val != null) { |
||||||
|
property.setValue(val); |
||||||
|
} |
||||||
|
} |
||||||
|
return JSONUtils.toJsonString(globalParamList); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* the global parameters and local parameters used in the worker will be prepared here. |
||||||
|
* |
||||||
|
* @param taskInstance |
||||||
|
* @param parameters |
||||||
|
* @param processInstance |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public Map<String, Property> paramParsingPreparation(@NonNull TaskInstance taskInstance, @NonNull AbstractParameters parameters, @NonNull ProcessInstance processInstance) { |
||||||
|
// assign value to definedParams here
|
||||||
|
Map<String,String> globalParamsMap = setGlobalParamsMap(processInstance); |
||||||
|
Map<String, Property> globalParams = ParamUtils.getUserDefParamsMap(globalParamsMap); |
||||||
|
CommandType commandType = processInstance.getCmdTypeIfComplement(); |
||||||
|
Date scheduleTime = processInstance.getScheduleTime(); |
||||||
|
|
||||||
|
// combining local and global parameters
|
||||||
|
Map<String, Property> localParams = parameters.getInputLocalParametersMap(); |
||||||
|
|
||||||
|
//stream pass params
|
||||||
|
Map<String, Property> varParams = parameters.getVarPoolMap(); |
||||||
|
|
||||||
|
if (globalParams.isEmpty() && localParams.isEmpty() && varParams.isEmpty()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
// if it is a complement,
|
||||||
|
// you need to pass in the task instance id to locate the time
|
||||||
|
// of the process instance complement
|
||||||
|
Map<String, String> cmdParam = JSONUtils.toMap(processInstance.getCommandParam()); |
||||||
|
String timeZone = cmdParam.get(Constants.SCHEDULE_TIMEZONE); |
||||||
|
Map<String,String> params = BusinessTimeUtils.getBusinessTime(commandType, scheduleTime, timeZone); |
||||||
|
|
||||||
|
if (globalParamsMap != null) { |
||||||
|
params.putAll(globalParamsMap); |
||||||
|
} |
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(taskInstance.getExecutePath())) { |
||||||
|
params.put(PARAMETER_TASK_EXECUTE_PATH, taskInstance.getExecutePath()); |
||||||
|
} |
||||||
|
params.put(PARAMETER_TASK_INSTANCE_ID, Integer.toString(taskInstance.getId())); |
||||||
|
|
||||||
|
if (varParams.size() != 0) { |
||||||
|
globalParams.putAll(varParams); |
||||||
|
} |
||||||
|
if (localParams.size() != 0) { |
||||||
|
globalParams.putAll(localParams); |
||||||
|
} |
||||||
|
|
||||||
|
Iterator<Map.Entry<String, Property>> iter = globalParams.entrySet().iterator(); |
||||||
|
while (iter.hasNext()) { |
||||||
|
Map.Entry<String, Property> en = iter.next(); |
||||||
|
Property property = en.getValue(); |
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(property.getValue()) && property.getValue().startsWith(Constants.FUNCTION_START_WITH)) { |
||||||
|
/** |
||||||
|
* local parameter refers to global parameter with the same name |
||||||
|
* note: the global parameters of the process instance here are solidified parameters, |
||||||
|
* and there are no variables in them. |
||||||
|
*/ |
||||||
|
String val = property.getValue(); |
||||||
|
// whether external scaling calculation is required
|
||||||
|
if (timeFunctionNeedExpand(val)) { |
||||||
|
val = timeFunctionExtension(taskInstance.getProcessInstanceId(), timeZone, val); |
||||||
|
} else { |
||||||
|
val = convertParameterPlaceholders(val, params); |
||||||
|
} |
||||||
|
property.setValue(val); |
||||||
|
} |
||||||
|
} |
||||||
|
if (MapUtils.isEmpty(globalParams)) { |
||||||
|
globalParams = new HashMap<>(); |
||||||
|
} |
||||||
|
// put schedule time param to params map
|
||||||
|
Map<String, Property> paramsMap = preBuildBusinessParams(processInstance); |
||||||
|
if (MapUtils.isNotEmpty(paramsMap)) { |
||||||
|
globalParams.putAll(paramsMap); |
||||||
|
} |
||||||
|
return globalParams; |
||||||
|
} |
||||||
|
|
||||||
|
private Map<String, String> setGlobalParamsMap(ProcessInstance processInstance) { |
||||||
|
Map<String, String> globalParamsMap = new HashMap<>(16); |
||||||
|
|
||||||
|
// global params string
|
||||||
|
String globalParamsStr = processInstance.getGlobalParams(); |
||||||
|
if (globalParamsStr != null) { |
||||||
|
List<Property> globalParamsList = JSONUtils.toList(globalParamsStr, Property.class); |
||||||
|
globalParamsMap.putAll(globalParamsList.stream().collect(Collectors.toMap(Property::getProp, Property::getValue))); |
||||||
|
} |
||||||
|
return globalParamsMap; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<String, Property> preBuildBusinessParams(ProcessInstance processInstance) { |
||||||
|
Map<String, Property> paramsMap = new HashMap<>(); |
||||||
|
// replace variable TIME with $[YYYYmmddd...] in shell file when history run job and batch complement job
|
||||||
|
if (processInstance.getScheduleTime() != null) { |
||||||
|
Date date = processInstance.getScheduleTime(); |
||||||
|
String dateTime = DateUtils.format(date, Constants.PARAMETER_FORMAT_TIME, null); |
||||||
|
Property p = new Property(); |
||||||
|
p.setValue(dateTime); |
||||||
|
p.setProp(Constants.PARAMETER_DATETIME); |
||||||
|
paramsMap.put(Constants.PARAMETER_DATETIME, p); |
||||||
|
} |
||||||
|
return paramsMap; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue