/*
* ProActive Parallel Suite(TM):
* The Open Source library for parallel and distributed
* Workflows & Scheduling, Orchestration, Cloud Automation
* and Big Data Analysis on Enterprise Grids & Clouds.
*
* Copyright (c) 2007 - 2017 ActiveEon
* Contact: contact@activeeon.com
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation: version 3 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*/
package org.ow2.proactive.scheduler.task.context;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.ow2.proactive.scheduler.common.job.JobVariable;
import org.ow2.proactive.scheduler.common.task.ForkEnvironment;
import org.ow2.proactive.scheduler.common.task.TaskResult;
import org.ow2.proactive.scheduler.common.task.TaskVariable;
import org.ow2.proactive.scheduler.common.task.util.SerializationUtil;
import org.ow2.proactive.scheduler.common.util.VariableSubstitutor;
import org.ow2.proactive.scheduler.task.SchedulerVars;
import org.ow2.proactive.scheduler.task.TaskLauncherInitializer;
import org.ow2.proactive.scheduler.task.executors.forked.env.ForkedTaskVariablesManager;
public class TaskContextVariableExtractor implements Serializable {
private final ForkedTaskVariablesManager forkedTaskVariablesManager = new ForkedTaskVariablesManager();
public Map<String, String> extractVariablesThirdPartyCredentialsAndSystemEnvironmentVariables(
TaskContext taskContext) throws Exception {
ForkEnvironment forkEnvironment = taskContext.getInitializer().getForkEnvironment();
Map<String, Serializable> variables = this.extractVariables(taskContext, true);
Map<String, String> thirdPartyCredentials = forkedTaskVariablesManager.extractThirdPartyCredentials(taskContext);
HashMap<String, Serializable> systemEnvironmentVariables = new HashMap<String, Serializable>(System.getenv());
systemEnvironmentVariables.putAll(variables);
systemEnvironmentVariables.putAll(thirdPartyCredentials);
return VariableSubstitutor.filterAndUpdate(forkEnvironment.getSystemEnvironment(), systemEnvironmentVariables);
}
public Map<String, Serializable> extractVariables(TaskContext taskContext, boolean useTaskVariables)
throws Exception {
return extractVariables(taskContext, (TaskResult) null, useTaskVariables);
}
private Map<String, Serializable> extractVariables(TaskContext container, TaskResult taskResult, String nodesFile,
boolean useTaskVariables) throws Exception {
Map<String, Serializable> variables = extractVariables(container, taskResult, useTaskVariables);
variables.put(SchedulerVars.PA_NODESNUMBER.toString(), container.getOtherNodesURLs().size() + 1);
variables.put(SchedulerVars.PA_NODESFILE.toString(), nodesFile);
variables.put(SchedulerVars.PA_TASK_PROGRESS_FILE.toString(), container.getProgressFilePath());
return variables;
}
@SuppressWarnings("squid:S134")
public Map<String, Serializable> extractVariables(TaskContext taskContext, TaskResult taskResult,
boolean useTaskVariables) throws Exception {
Map<String, Serializable> variables = new HashMap<>();
// job variables from workflow definition
if (taskContext.getInitializer().getJobVariables() != null) {
for (JobVariable jobVariable : taskContext.getInitializer().getJobVariables().values()) {
variables.put(jobVariable.getName(), jobVariable.getValue());
}
}
try {
// variables from previous tasks
if (taskContext.getPreviousTasksResults() != null) {
variables.putAll(extractPreviousTaskResultVariablesFromTaskContext(taskContext));
}
// task variables from workflow definition
if (useTaskVariables && taskContext.getInitializer().getTaskVariables() != null) {
for (TaskVariable taskVariable : taskContext.getInitializer().getTaskVariables().values()) {
if (!taskVariable.isJobInherited()) {
variables.put(taskVariable.getName(), taskVariable.getValue());
}
}
}
// and from this task execution
if (taskResult != null && taskResult.getPropagatedVariables() != null) {
variables.putAll(SerializationUtil.deserializeVariableMap(taskResult.getPropagatedVariables()));
}
} catch (Exception e) {
throw new Exception("Could not deserialize variables", e);
}
// variables from current job/task context
variables.putAll(retrieveContextVariables(taskContext.getInitializer()));
variables.put(SchedulerVars.PA_SCHEDULER_HOME.toString(), taskContext.getSchedulerHome());
return variables;
}
public Map<String, Serializable> extractScopeVariables(TaskContext taskContext) {
Map<String, Serializable> variables = new HashMap<>();
// variables from task definition
if (taskContext.getInitializer().getTaskVariables() != null) {
for (TaskVariable taskVariable : taskContext.getInitializer().getTaskVariables().values()) {
if (!taskVariable.isJobInherited()) {
variables.put(taskVariable.getName(), taskVariable.getValue());
}
}
}
return variables;
}
public Map<String, Serializable> extractVariables(TaskContext container, String nodesFile, boolean useTaskVariables)
throws Exception {
return extractVariables(container, null, nodesFile, useTaskVariables);
}
public Map<String, Serializable> retrieveContextVariables(TaskLauncherInitializer initializer) {
Map<String, Serializable> variables = new HashMap<>();
variables.put(SchedulerVars.PA_JOB_ID.toString(), initializer.getTaskId().getJobId().value());
variables.put(SchedulerVars.PA_JOB_NAME.toString(), initializer.getTaskId().getJobId().getReadableName());
variables.put(SchedulerVars.PA_TASK_ID.toString(), initializer.getTaskId().value());
variables.put(SchedulerVars.PA_TASK_NAME.toString(), initializer.getTaskId().getReadableName());
variables.put(SchedulerVars.PA_TASK_ITERATION.toString(), initializer.getIterationIndex());
variables.put(SchedulerVars.PA_TASK_REPLICATION.toString(), initializer.getReplicationIndex());
variables.put(SchedulerVars.PA_USER.toString(), initializer.getJobOwner());
variables.put(SchedulerVars.PA_SCHEDULER_REST_URL.toString(), initializer.getSchedulerRestUrl());
return variables;
}
private Map<String, Serializable> extractPreviousTaskResultVariablesFromTaskContext(TaskContext container)
throws IOException, ClassNotFoundException {
Map<String, Serializable> result = new HashMap<>();
for (TaskResult previousTaskResult : container.getPreviousTasksResults()) {
if (previousTaskResult.getPropagatedVariables() != null) {
result.putAll(SerializationUtil.deserializeVariableMap(previousTaskResult.getPropagatedVariables()));
}
}
return result;
}
}