Repository: airavata Updated Branches: refs/heads/master c46e21dce -> 60e657d45
Added JobSubmissionOutput pojo class to keep output of jobsubmission command with jobId Project: http://git-wip-us.apache.org/repos/asf/airavata/repo Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/60e657d4 Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/60e657d4 Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/60e657d4 Branch: refs/heads/master Commit: 60e657d45940cc47a4f09a27e291057031808962 Parents: c46e21d Author: Shameera Rathanyaka <[email protected]> Authored: Fri Sep 4 15:21:49 2015 -0400 Committer: Shameera Rathanyaka <[email protected]> Committed: Fri Sep 4 15:21:49 2015 -0400 ---------------------------------------------------------------------- .../gfac/core/cluster/CommandOutput.java | 7 ++ .../gfac/core/cluster/JobSubmissionOutput.java | 70 ++++++++++++++++++++ .../gfac/core/cluster/RemoteCluster.java | 2 +- .../airavata/gfac/impl/HPCRemoteCluster.java | 11 ++- .../airavata/gfac/impl/StandardOutReader.java | 12 +++- .../impl/task/SSHForkJobSubmissionTask.java | 12 +++- .../gfac/impl/task/SSHJobSubmissionTask.java | 10 ++- 7 files changed, 116 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/airavata/blob/60e657d4/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/CommandOutput.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/CommandOutput.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/CommandOutput.java index e50d25a..b64d3fb 100644 --- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/CommandOutput.java +++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/CommandOutput.java @@ -46,4 +46,11 @@ public interface CommandOutput { * @param code The program exit code */ void exitCode(int code); + + /** + * Return the exit code of the command execution. + * @return exit code + */ + int getExitCode(); + } http://git-wip-us.apache.org/repos/asf/airavata/blob/60e657d4/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/JobSubmissionOutput.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/JobSubmissionOutput.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/JobSubmissionOutput.java new file mode 100644 index 0000000..7506707 --- /dev/null +++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/JobSubmissionOutput.java @@ -0,0 +1,70 @@ +/* + * + * 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.airavata.gfac.core.cluster; + +public class JobSubmissionOutput { + + private int exitCode; + private String stdOut; + private String stdErr; + private String command; + private String jobId; + + public int getExitCode() { + return exitCode; + } + + public void setExitCode(int exitCode) { + this.exitCode = exitCode; + } + + public String getStdOut() { + return stdOut; + } + + public void setStdOut(String stdOut) { + this.stdOut = stdOut; + } + + public String getStdErr() { + return stdErr; + } + + public void setStdErr(String stdErr) { + this.stdErr = stdErr; + } + + public String getCommand() { + return command; + } + + public void setCommand(String command) { + this.command = command; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } +} http://git-wip-us.apache.org/repos/asf/airavata/blob/60e657d4/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/RemoteCluster.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/RemoteCluster.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/RemoteCluster.java index 6afeb59..932451b 100644 --- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/RemoteCluster.java +++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cluster/RemoteCluster.java @@ -42,7 +42,7 @@ public interface RemoteCluster { // FIXME: replace SSHApiException with suitable * @return jobId after successful job submission * @throws SSHApiException throws exception during error */ - public String submitBatchJob(String jobScriptFilePath, String workingDirectory) throws SSHApiException; + public JobSubmissionOutput submitBatchJob(String jobScriptFilePath, String workingDirectory) throws SSHApiException; /** * This will copy the localFile to remoteFile location in configured cluster http://git-wip-us.apache.org/repos/asf/airavata/blob/60e657d4/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/HPCRemoteCluster.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/HPCRemoteCluster.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/HPCRemoteCluster.java index a3fb80e..796dd1c 100644 --- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/HPCRemoteCluster.java +++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/HPCRemoteCluster.java @@ -33,6 +33,7 @@ import org.apache.airavata.gfac.core.authentication.SSHKeyAuthentication; import org.apache.airavata.gfac.core.cluster.AbstractRemoteCluster; import org.apache.airavata.gfac.core.cluster.CommandInfo; import org.apache.airavata.gfac.core.cluster.CommandOutput; +import org.apache.airavata.gfac.core.cluster.JobSubmissionOutput; import org.apache.airavata.gfac.core.cluster.RawCommandInfo; import org.apache.airavata.gfac.core.cluster.ServerInfo; import org.apache.airavata.model.status.JobStatus; @@ -80,14 +81,19 @@ public class HPCRemoteCluster extends AbstractRemoteCluster{ } @Override - public String submitBatchJob(String jobScriptFilePath, String workingDirectory) throws SSHApiException { + public JobSubmissionOutput submitBatchJob(String jobScriptFilePath, String workingDirectory) throws SSHApiException { + JobSubmissionOutput jsoutput = new JobSubmissionOutput(); scpTo(jobScriptFilePath, workingDirectory); // scp script file to working directory RawCommandInfo submitCommand = jobManagerConfiguration.getSubmitCommand(workingDirectory, jobScriptFilePath); StandardOutReader reader = new StandardOutReader(); executeCommand(submitCommand, reader); throwExceptionOnError(reader, submitCommand); - return outputParser.parseJobSubmission(reader.getStdOutputString()); + jsoutput.setJobId(outputParser.parseJobSubmission(reader.getStdOutputString())); + jsoutput.setExitCode(reader.getExitCode()); + jsoutput.setStdOut(reader.getStdOutputString()); + jsoutput.setStdErr(reader.getStdErrorString()); + return jsoutput; } @Override @@ -276,6 +282,7 @@ public class HPCRemoteCluster extends AbstractRemoteCluster{ }finally { //Only disconnecting the channel, session can be reused if (channelExec != null) { + commandOutput.exitCode(channelExec.getExitStatus()); channelExec.disconnect(); } } http://git-wip-us.apache.org/repos/asf/airavata/blob/60e657d4/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/StandardOutReader.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/StandardOutReader.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/StandardOutReader.java index e34858b..b0f4c74 100644 --- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/StandardOutReader.java +++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/StandardOutReader.java @@ -36,7 +36,9 @@ public class StandardOutReader implements CommandOutput { private static final Logger logger = LoggerFactory.getLogger(StandardOutReader.class); String stdOutputString = null; ByteArrayOutputStream errorStream = new ByteArrayOutputStream(); - public void onOutput(Channel channel) { + private int exitCode; + + public void onOutput(Channel channel) { try { StringBuffer pbsOutput = new StringBuffer(""); InputStream inputStream = channel.getInputStream(); @@ -59,9 +61,15 @@ public class StandardOutReader implements CommandOutput { public void exitCode(int code) { System.out.println("Program exit code - " + code); + this.exitCode = code; } - public String getStdOutputString() { + @Override + public int getExitCode() { + return exitCode; + } + + public String getStdOutputString() { return stdOutputString; } http://git-wip-us.apache.org/repos/asf/airavata/blob/60e657d4/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHForkJobSubmissionTask.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHForkJobSubmissionTask.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHForkJobSubmissionTask.java index ddd33e1..471dbfd 100644 --- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHForkJobSubmissionTask.java +++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHForkJobSubmissionTask.java @@ -23,6 +23,7 @@ package org.apache.airavata.gfac.impl.task; import org.apache.airavata.common.exception.ApplicationSettingsException; import org.apache.airavata.gfac.core.*; +import org.apache.airavata.gfac.core.cluster.JobSubmissionOutput; import org.apache.airavata.gfac.core.cluster.RemoteCluster; import org.apache.airavata.gfac.core.context.ProcessContext; import org.apache.airavata.gfac.core.context.TaskContext; @@ -72,8 +73,13 @@ public class SSHForkJobSubmissionTask implements JobSubmissionTask { File jobFile = GFacUtils.createJobFile(jobDescriptor, jConfig); if (jobFile != null && jobFile.exists()) { jobModel.setJobDescription(FileUtils.readFileToString(jobFile)); - String jobId = remoteCluster.submitBatchJob(jobFile.getPath(), processContext.getWorkingDir()); - if (jobId != null && !jobId.isEmpty()) { + JobSubmissionOutput jobSubmissionOutput = remoteCluster.submitBatchJob(jobFile.getPath(), + processContext.getWorkingDir()); + jobModel.setExitCode(jobSubmissionOutput.getExitCode()); + jobModel.setStderr(jobSubmissionOutput.getStdErr()); + jobModel.setStdout(jobSubmissionOutput.getStdOut()); + String jobId = jobSubmissionOutput.getJobId(); + if (jobId != null && !jobId.isEmpty()) { jobModel.setJobId(jobId); GFacUtils.saveJobModel(processContext, jobModel); jobStatus.setJobState(JobState.SUBMITTED); @@ -93,6 +99,8 @@ public class SSHForkJobSubmissionTask implements JobSubmissionTask { taskStatus.setState(TaskState.FAILED); taskStatus.setReason("Couldn't find job id in both submitted and verified steps"); } + + GFacUtils.saveJobModel(processContext, jobModel); } else { taskStatus.setState(TaskState.FAILED); if (jobFile == null) { http://git-wip-us.apache.org/repos/asf/airavata/blob/60e657d4/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHJobSubmissionTask.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHJobSubmissionTask.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHJobSubmissionTask.java index 34d0945..6acc312 100644 --- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHJobSubmissionTask.java +++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHJobSubmissionTask.java @@ -24,6 +24,7 @@ package org.apache.airavata.gfac.impl.task; import org.apache.airavata.common.exception.ApplicationSettingsException; import org.apache.airavata.common.utils.AiravataUtils; import org.apache.airavata.gfac.core.*; +import org.apache.airavata.gfac.core.cluster.JobSubmissionOutput; import org.apache.airavata.gfac.core.cluster.RemoteCluster; import org.apache.airavata.gfac.core.context.ProcessContext; import org.apache.airavata.gfac.core.context.TaskContext; @@ -73,7 +74,12 @@ public class SSHJobSubmissionTask implements JobSubmissionTask { File jobFile = GFacUtils.createJobFile(jobDescriptor, jConfig); if (jobFile != null && jobFile.exists()) { jobModel.setJobDescription(FileUtils.readFileToString(jobFile)); - String jobId = remoteCluster.submitBatchJob(jobFile.getPath(), processContext.getWorkingDir()); + JobSubmissionOutput jobSubmissionOutput = remoteCluster.submitBatchJob(jobFile.getPath(), + processContext.getWorkingDir()); + jobModel.setExitCode(jobSubmissionOutput.getExitCode()); + jobModel.setStderr(jobSubmissionOutput.getStdErr()); + jobModel.setStdout(jobSubmissionOutput.getStdOut()); + String jobId = jobSubmissionOutput.getJobId(); if (jobId != null && !jobId.isEmpty()) { jobModel.setJobId(jobId); GFacUtils.saveJobModel(processContext, jobModel); @@ -121,6 +127,8 @@ public class SSHJobSubmissionTask implements JobSubmissionTask { taskStatus.setState(TaskState.FAILED); taskStatus.setReason("Couldn't find job id in both submitted and verified steps"); } + + GFacUtils.saveJobModel(processContext, jobModel); } else { taskStatus.setState(TaskState.FAILED); if (jobFile == null) {
