Author: samindaw
Date: Mon Jun 10 19:21:49 2013
New Revision: 1491570
URL: http://svn.apache.org/r1491570
Log:
application job data persistance for BESProvider + refacting
Modified:
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ProvenanceManager.java
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ProvenanceManagerImpl.java
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/BESProvider.java
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/GramProvider.java
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/LocalProvider.java
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GFacUtils.java
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GramJobSubmissionListener.java
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/ProvenanceRegistry.java
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/workflow/ApplicationJob.java
Modified:
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ProvenanceManager.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ProvenanceManager.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ProvenanceManager.java
(original)
+++
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ProvenanceManager.java
Mon Jun 10 19:21:49 2013
@@ -398,6 +398,14 @@ public interface ProvenanceManager {
*/
public void updateApplicationJobStatus(String jobId, ApplicationJobStatus
status, Date statusUpdateTime) throws AiravataAPIInvocationException;
+ /**
+ * Update the status of the job for the current server time
+ * @param jobId
+ * @param status
+ * @throws RegistryException
+ */
+ public void updateApplicationJobStatus(String jobId, ApplicationJobStatus
status) throws AiravataAPIInvocationException;
+
/**
* Update the job data. GFacProvider implementation should decide the job
data. Typically it'll
* be a serialization of the submitted job query (eg: rsl for a GRAM job)
Modified:
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ProvenanceManagerImpl.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ProvenanceManagerImpl.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ProvenanceManagerImpl.java
(original)
+++
airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ProvenanceManagerImpl.java
Mon Jun 10 19:21:49 2013
@@ -21,6 +21,7 @@
package org.apache.airavata.client.impl;
+import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -521,60 +522,60 @@ public class ProvenanceManagerImpl imple
}
@Override
- public void updateApplicationJobStatus(String gfacJobId,
ApplicationJobStatus status, Date statusUpdateTime)
+ public void updateApplicationJobStatus(String jobId,
ApplicationJobStatus status, Date statusUpdateTime)
throws AiravataAPIInvocationException {
try {
-
client.getRegistryClient().updateApplicationJobStatus(gfacJobId, status,
statusUpdateTime);
+
client.getRegistryClient().updateApplicationJobStatus(jobId, status,
statusUpdateTime);
} catch (Exception e) {
throw new AiravataAPIInvocationException(e);
}
}
@Override
- public void updateApplicationJobData(String gfacJobId, String jobdata)
+ public void updateApplicationJobData(String jobId, String jobdata)
throws AiravataAPIInvocationException {
try {
-
client.getRegistryClient().updateApplicationJobData(gfacJobId, jobdata);
+
client.getRegistryClient().updateApplicationJobData(jobId, jobdata);
} catch (Exception e) {
throw new AiravataAPIInvocationException(e);
}
}
@Override
- public void updateApplicationJobSubmittedTime(String gfacJobId, Date
submitted)
+ public void updateApplicationJobSubmittedTime(String jobId, Date
submitted)
throws AiravataAPIInvocationException {
try {
-
client.getRegistryClient().updateApplicationJobSubmittedTime(gfacJobId,
submitted);
+
client.getRegistryClient().updateApplicationJobSubmittedTime(jobId, submitted);
} catch (Exception e) {
throw new AiravataAPIInvocationException(e);
}
}
@Override
- public void updateApplicationJobStatusUpdateTime(String gfacJobId, Date
completed)
+ public void updateApplicationJobStatusUpdateTime(String jobId, Date
completed)
throws AiravataAPIInvocationException {
try {
-
client.getRegistryClient().updateApplicationJobStatusUpdateTime(gfacJobId,
completed);
+
client.getRegistryClient().updateApplicationJobStatusUpdateTime(jobId,
completed);
} catch (Exception e) {
throw new AiravataAPIInvocationException(e);
}
}
@Override
- public void updateApplicationJobMetadata(String gfacJobId, String
metadata)
+ public void updateApplicationJobMetadata(String jobId, String metadata)
throws AiravataAPIInvocationException {
try {
-
client.getRegistryClient().updateApplicationJobMetadata(gfacJobId, metadata);
+
client.getRegistryClient().updateApplicationJobMetadata(jobId, metadata);
} catch (Exception e) {
throw new AiravataAPIInvocationException(e);
}
}
@Override
- public ApplicationJob getApplicationJob(String gfacJobId)
+ public ApplicationJob getApplicationJob(String jobId)
throws AiravataAPIInvocationException {
try {
- return
client.getRegistryClient().getApplicationJob(gfacJobId);
+ return
client.getRegistryClient().getApplicationJob(jobId);
} catch (Exception e) {
throw new AiravataAPIInvocationException(e);
}
@@ -602,4 +603,10 @@ public class ProvenanceManagerImpl imple
}
}
+ @Override
+ public void updateApplicationJobStatus(String jobId,
+ ApplicationJobStatus status) throws
AiravataAPIInvocationException {
+ updateApplicationJobStatus(jobId, status,
Calendar.getInstance().getTime());
+ }
+
}
Modified:
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/BESProvider.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/BESProvider.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/BESProvider.java
(original)
+++
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/BESProvider.java
Mon Jun 10 19:21:49 2013
@@ -25,21 +25,32 @@ import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.apache.airavata.gfac.GFacException;
import org.apache.airavata.gfac.context.JobExecutionContext;
import org.apache.airavata.gfac.context.security.GSISecurityContext;
import org.apache.airavata.gfac.provider.GFacProvider;
import org.apache.airavata.gfac.provider.GFacProviderException;
+import org.apache.airavata.gfac.utils.GFacUtils;
+import org.apache.airavata.registry.api.workflow.ApplicationJob;
+import
org.apache.airavata.registry.api.workflow.ApplicationJob.ApplicationJobStatus;
import org.apache.airavata.schemas.gfac.UnicoreHostType;
import org.apache.xmlbeans.XmlCursor;
import org.ggf.schemas.bes.x2006.x08.besFactory.ActivityStateEnumeration;
+import org.ggf.schemas.bes.x2006.x08.besFactory.ActivityStateEnumeration.Enum;
import org.ggf.schemas.bes.x2006.x08.besFactory.ActivityStatusType;
import org.ggf.schemas.bes.x2006.x08.besFactory.CreateActivityDocument;
import org.ggf.schemas.bes.x2006.x08.besFactory.CreateActivityResponseDocument;
import org.ggf.schemas.bes.x2006.x08.besFactory.GetActivityStatusesDocument;
import
org.ggf.schemas.bes.x2006.x08.besFactory.GetActivityStatusesResponseDocument;
+import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType;
import org.globus.gsi.gssapi.GlobusGSSCredentialImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -86,10 +97,11 @@ public class BESProvider implements GFac
CreateActivityDocument cad = CreateActivityDocument.Factory
.newInstance();
+ JobDefinitionType jobDefinition = null;
try {
//FIXME: Replace by a native client
-// cad.addNewCreateActivity().addNewActivityDocument()
-//
.setJobDefinition(JSDLGenerator.buildJSDLInstance(jobExecutionContext).getJobDefinition());
+// jobDefinition =
JSDLGenerator.buildJSDLInstance(jobExecutionContext).getJobDefinition();
+//
cad.addNewCreateActivity().addNewActivityDocument().setJobDefinition(jobDefinition);
System.out.println("REMOVE ME");
} catch (Exception e1) {
throw new GFacProviderException("Cannot generate JSDL
instance from the JobExecutionContext.",e1);
@@ -123,7 +135,7 @@ public class BESProvider implements GFac
jobId = new Long(Calendar.getInstance().getTimeInMillis())
.toString();
}
-
+ saveApplicationJob(jobExecutionContext, jobDefinition);
log.info(formatStatusMessage(activityEpr.getAddress().getStringValue(),
factory.getActivityStatus(activityEpr)
.toString()));
@@ -135,6 +147,7 @@ public class BESProvider implements GFac
ActivityStatusType activityStatus = null;
try {
activityStatus = getStatus(factory, activityEpr);
+
GFacUtils.updateApplicationJobStatus(jobExecutionContext, jobId,
getApplicationJobStatus(activityStatus));
log.info (subStatusAsString(activityStatus));
} catch (UnknownActivityIdentifierFault e) {
throw new GFacProviderException(e.getMessage(),
e.getCause());
@@ -164,6 +177,36 @@ public class BESProvider implements GFac
}
}
+ private ApplicationJobStatus getApplicationJobStatus(ActivityStatusType
activityStatus){
+ if (activityStatus==null){
+ return ApplicationJobStatus.UNKNOWN;
+ }
+ Enum state = activityStatus.getState();
+ if (ActivityStateEnumeration.PENDING.equals(state)){
+ return ApplicationJobStatus.PENDING;
+ } else if (ActivityStateEnumeration.CANCELLED.equals(state)){
+ return ApplicationJobStatus.CANCELLED;
+ } else if (ActivityStateEnumeration.FAILED.equals(state)){
+ return ApplicationJobStatus.FAILED;
+ } else if (ActivityStateEnumeration.FINISHED.equals(state)){
+ return ApplicationJobStatus.FINISHED;
+ } else if (ActivityStateEnumeration.RUNNING.equals(state)){
+ return ApplicationJobStatus.EXECUTING;
+ }
+ return ApplicationJobStatus.UNKNOWN;
+ }
+
+ private void saveApplicationJob(JobExecutionContext jobExecutionContext,
+ JobDefinitionType jobDefinition) {
+ ApplicationJob appJob =
GFacUtils.createApplicationJob(jobExecutionContext);
+ appJob.setJobId(jobId);
+ appJob.setJobData(jobDefinition.toString());
+ appJob.setSubmittedTime(Calendar.getInstance().getTime());
+ appJob.setJobStatus(ApplicationJobStatus.SUBMITTED);
+ appJob.setStatusUpdateTime(appJob.getSubmittedTime());
+ GFacUtils.recordApplicationJob(jobExecutionContext, appJob);
+ }
+
public void dispose(JobExecutionContext jobExecutionContext)
throws GFacProviderException {
secProperties = null;
Modified:
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/GramProvider.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/GramProvider.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/GramProvider.java
(original)
+++
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/GramProvider.java
Mon Jun 10 19:21:49 2013
@@ -23,7 +23,6 @@ package org.apache.airavata.gfac.provide
import java.util.Calendar;
import java.util.Map;
-import org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
import org.apache.airavata.gfac.GFacException;
import org.apache.airavata.gfac.JobSubmissionFault;
import org.apache.airavata.gfac.context.JobExecutionContext;
@@ -92,21 +91,9 @@ public class GramProvider implements GFa
//WorkflowNodeGramData workflowNodeGramData = new
WorkflowNodeGramData(experimentID, nodeID, job.getRSL(),hostName ,
job.getIDAsString());;
- try {
- // for provider test
- if(jobExecutionContext.getGFacConfiguration().getAiravataAPI()
!= null){
- ApplicationJob appJob =
GFacUtils.createApplicationJob(jobExecutionContext);
- appJob.setJobId(job.getIDAsString());
- appJob.setJobData(job.getRSL());
- appJob.setSubmittedTime(Calendar.getInstance().getTime());
- appJob.setJobStatus(ApplicationJobStatus.SUBMITTED);
- appJob.setStatusUpdateTime(appJob.getSubmittedTime());
-
jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().addApplicationJob(appJob);
- }
-
//jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateWorkflowNodeGramData(workflowNodeGramData);
- } catch (AiravataAPIInvocationException e) {
- throw new GFacProviderException(e.getMessage(), e,
jobExecutionContext);
- }
+ // for provider test
+ saveApplicationJob(jobExecutionContext);
+
/*
* Wait until job is done
*/
@@ -145,6 +132,16 @@ public class GramProvider implements GFa
}
}
+
+ private void saveApplicationJob(JobExecutionContext
jobExecutionContext) {
+ ApplicationJob appJob =
GFacUtils.createApplicationJob(jobExecutionContext);
+ appJob.setJobId(job.getIDAsString());
+ appJob.setJobData(job.getRSL());
+ appJob.setSubmittedTime(Calendar.getInstance().getTime());
+ appJob.setJobStatus(ApplicationJobStatus.SUBMITTED);
+ appJob.setStatusUpdateTime(appJob.getSubmittedTime());
+ GFacUtils.recordApplicationJob(jobExecutionContext, appJob);
+ }
public void dispose(JobExecutionContext jobExecutionContext) throws
GFacProviderException {
}
Modified:
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/LocalProvider.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/LocalProvider.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/LocalProvider.java
(original)
+++
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/provider/impl/LocalProvider.java
Mon Jun 10 19:21:49 2013
@@ -30,7 +30,6 @@ import java.util.Map;
import javax.xml.bind.JAXB;
-import org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
import org.apache.airavata.gfac.Constants;
import org.apache.airavata.gfac.GFacException;
import org.apache.airavata.gfac.context.JobExecutionContext;
@@ -129,33 +128,9 @@ public class LocalProvider implements GF
Process process = builder.start();
jobId="Local_"+Calendar.getInstance().getTimeInMillis();
if(jobExecutionContext.getGFacConfiguration().getAiravataAPI() !=
null){
- ApplicationJob appJob =
GFacUtils.createApplicationJob(jobExecutionContext);
- appJob.setJobId(jobId);
- LocalProviderJobData data = new LocalProviderJobData();
- data.setApplicationName(app.getExecutableLocation());
- data.setInputDir(app.getInputDataDirectory());
- data.setOutputDir(app.getOutputDataDirectory());
- data.setWorkingDir(builder.directory().toString());
-
data.setInputParameters(ProviderUtils.getInputParameters(jobExecutionContext));
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- JAXB.marshal(data, stream);
- appJob.setJobData(stream.toString());
- appJob.setSubmittedTime(Calendar.getInstance().getTime());
- appJob.setJobStatus(ApplicationJobStatus.SUBMITTED);
- appJob.setStatusUpdateTime(appJob.getSubmittedTime());
- try {
-
jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().addApplicationJob(appJob);
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
- }
- if(jobExecutionContext.getGFacConfiguration().getAiravataAPI() !=
null){
- try {
-
jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateApplicationJobStatus(jobId,
ApplicationJobStatus.INITIALIZE, Calendar.getInstance().getTime());
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
+ saveApplicationJob(jobExecutionContext);
}
+ GFacUtils.updateApplicationJobStatus(jobExecutionContext,jobId,
ApplicationJobStatus.INITIALIZE);
Thread standardOutWriter = new
InputStreamToFileWriter(process.getInputStream(), app.getStandardOutput());
Thread standardErrorWriter = new
InputStreamToFileWriter(process.getErrorStream(), app.getStandardError());
@@ -164,23 +139,10 @@ public class LocalProvider implements GF
standardErrorWriter.setDaemon(true);
standardOutWriter.start();
standardErrorWriter.start();
- if(jobExecutionContext.getGFacConfiguration().getAiravataAPI() !=
null){
- try {
-
jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateApplicationJobStatus(jobId,
ApplicationJobStatus.EXECUTING, Calendar.getInstance().getTime());
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
- }
+ GFacUtils.updateApplicationJobStatus(jobExecutionContext,jobId,
ApplicationJobStatus.EXECUTING);
// wait for the process (application) to finish executing
int returnValue = process.waitFor();
-
- if(jobExecutionContext.getGFacConfiguration().getAiravataAPI()
!= null){
- try {
-
jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateApplicationJobStatus(jobId,
ApplicationJobStatus.FINALIZE, Calendar.getInstance().getTime());
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
- }
+ GFacUtils.updateApplicationJobStatus(jobExecutionContext,jobId,
ApplicationJobStatus.FINALIZE);
// make sure other two threads are done
standardOutWriter.join();
@@ -191,22 +153,10 @@ public class LocalProvider implements GF
* just provide warning in the log messages
*/
if (returnValue != 0) {
- if(jobExecutionContext.getGFacConfiguration().getAiravataAPI()
!= null){
- try {
-
jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateApplicationJobStatus(jobId,
ApplicationJobStatus.FAILED, Calendar.getInstance().getTime());
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
- }
+ GFacUtils.updateApplicationJobStatus(jobExecutionContext,jobId,
ApplicationJobStatus.FAILED);
log.error("Process finished with non zero return value.
Process may have failed");
} else {
- if(jobExecutionContext.getGFacConfiguration().getAiravataAPI()
!= null){
- try {
-
jobExecutionContext.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateApplicationJobStatus(jobId,
ApplicationJobStatus.FINISHED, Calendar.getInstance().getTime());
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
- }
+ GFacUtils.updateApplicationJobStatus(jobExecutionContext,jobId,
ApplicationJobStatus.FINISHED);
log.info("Process finished with return value of zero.");
}
@@ -225,6 +175,27 @@ public class LocalProvider implements GF
}
}
+ private void saveApplicationJob(JobExecutionContext jobExecutionContext)
+ throws GFacProviderException {
+ ApplicationDeploymentDescriptionType app = jobExecutionContext.
+
getApplicationContext().getApplicationDeploymentDescription().getType();
+ ApplicationJob appJob =
GFacUtils.createApplicationJob(jobExecutionContext);
+ appJob.setJobId(jobId);
+ LocalProviderJobData data = new LocalProviderJobData();
+ data.setApplicationName(app.getExecutableLocation());
+ data.setInputDir(app.getInputDataDirectory());
+ data.setOutputDir(app.getOutputDataDirectory());
+ data.setWorkingDir(builder.directory().toString());
+
data.setInputParameters(ProviderUtils.getInputParameters(jobExecutionContext));
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ JAXB.marshal(data, stream);
+ appJob.setJobData(stream.toString());
+ appJob.setSubmittedTime(Calendar.getInstance().getTime());
+ appJob.setJobStatus(ApplicationJobStatus.SUBMITTED);
+ appJob.setStatusUpdateTime(appJob.getSubmittedTime());
+ GFacUtils.recordApplicationJob(jobExecutionContext, appJob);
+ }
+
public void dispose(JobExecutionContext jobExecutionContext) throws
GFacProviderException {
ApplicationDeploymentDescriptionType app =
jobExecutionContext.getApplicationContext().getApplicationDeploymentDescription().getType();
Modified:
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GFacUtils.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GFacUtils.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GFacUtils.java
(original)
+++
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GFacUtils.java
Mon Jun 10 19:21:49 2013
@@ -20,11 +20,14 @@
*/
package org.apache.airavata.gfac.utils;
+import org.apache.airavata.client.api.AiravataAPI;
+import org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
import org.apache.airavata.commons.gfac.type.ActualParameter;
import org.apache.airavata.gfac.Constants;
import org.apache.airavata.gfac.context.JobExecutionContext;
import org.apache.airavata.gfac.deployment.classloaders.JarFileClassLoader;
import org.apache.airavata.registry.api.workflow.ApplicationJob;
+import
org.apache.airavata.registry.api.workflow.ApplicationJob.ApplicationJobStatus;
import org.apache.airavata.schemas.gfac.*;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.deployment.DeploymentException;
@@ -415,4 +418,41 @@ public class GFacUtils {
appJob.setApplicationDescriptionId(jobExecutionContext.getApplicationContext().getApplicationDeploymentDescription().getType().getApplicationName().getStringValue());
return appJob;
}
+
+ public static void
updateApplicationJobStatusUpdateTime(JobExecutionContext context, String jobId,
Date statusUpdateTime){
+ AiravataAPI airavataAPI =
context.getGFacConfiguration().getAiravataAPI();
+ if(airavataAPI != null){
+ try {
+
airavataAPI.getProvenanceManager().updateApplicationJobStatusUpdateTime(jobId,
statusUpdateTime);
+ } catch (AiravataAPIInvocationException e) {
+ log.error("Error in updating application job
status time "+statusUpdateTime.toString()+" for job Id "+jobId+"!!!", e);
+ }
+ }
+ }
+
+ public static void updateApplicationJobStatus(JobExecutionContext
context, String jobId, ApplicationJobStatus status, Date statusUpdateTime){
+ AiravataAPI airavataAPI =
context.getGFacConfiguration().getAiravataAPI();
+ if(airavataAPI != null){
+ try {
+
airavataAPI.getProvenanceManager().updateApplicationJobStatus(jobId, status,
statusUpdateTime);
+ } catch (AiravataAPIInvocationException e) {
+ log.error("Error in updating application job
status "+status.toString()+" for job Id "+jobId+"!!!", e);
+ }
+ }
+ }
+
+ public static void recordApplicationJob(JobExecutionContext context,
ApplicationJob job){
+ AiravataAPI airavataAPI =
context.getGFacConfiguration().getAiravataAPI();
+ if(airavataAPI != null){
+ try {
+
airavataAPI.getProvenanceManager().addApplicationJob(job);
+ } catch (AiravataAPIInvocationException e) {
+ log.error("Error in persisting application job
data for application job "+job.getJobId()+"!!!", e);
+ }
+ }
+ }
+
+ public static void updateApplicationJobStatus(JobExecutionContext
context, String jobId, ApplicationJobStatus status){
+ updateApplicationJobStatus(context, jobId, status,
Calendar.getInstance().getTime());
+ }
}
Modified:
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GramJobSubmissionListener.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GramJobSubmissionListener.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GramJobSubmissionListener.java
(original)
+++
airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/gfac/utils/GramJobSubmissionListener.java
Mon Jun 10 19:21:49 2013
@@ -22,7 +22,6 @@ package org.apache.airavata.gfac.utils;
import java.util.Calendar;
-import org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
import org.apache.airavata.gfac.GFacException;
import org.apache.airavata.gfac.context.JobExecutionContext;
import org.apache.airavata.gfac.context.security.GSISecurityContext;
@@ -83,13 +82,7 @@ public class GramJobSubmissionListener i
break;
}
} else {
- try {
- if
(context.getGFacConfiguration().getAiravataAPI()!=null){
-
context.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateApplicationJobStatusUpdateTime(job.getIDAsString(),
Calendar.getInstance().getTime());
- }
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
+ GFacUtils.updateApplicationJobStatusUpdateTime(context,
job.getIDAsString(), Calendar.getInstance().getTime());
log.info("job " + job.getIDAsString() + " have same
status: "
+ GramJob.getStatusAsString(status));
}
@@ -128,13 +121,7 @@ public class GramJobSubmissionListener i
}
private synchronized boolean setStatus(int status, int error) {
- try {
- if
(context.getGFacConfiguration().getAiravataAPI()!=null){
-
context.getGFacConfiguration().getAiravataAPI().getProvenanceManager().updateApplicationJobStatus(job.getIDAsString(),
getApplicationJobStatus(status), Calendar.getInstance().getTime());
- }
- } catch (AiravataAPIInvocationException e) {
- e.printStackTrace();
- }
+
GFacUtils.updateApplicationJobStatus(context,job.getIDAsString(),
getApplicationJobStatus(status));
this.status = status;
this.error = error;
Modified:
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/ProvenanceRegistry.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/ProvenanceRegistry.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/ProvenanceRegistry.java
(original)
+++
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/ProvenanceRegistry.java
Mon Jun 10 19:21:49 2013
@@ -453,7 +453,7 @@ public interface ProvenanceRegistry exte
* @throws RegistryException
*/
public void updateApplicationJobStatus(String jobId, ApplicationJobStatus
status, Date statusUpdateTime) throws RegistryException;
-
+
/**
* Update the job data. GFacProvider implementation should decide the job
data. Typically it'll
* be a serialization of the submitted job query (eg: rsl for a GRAM job)
Modified:
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/workflow/ApplicationJob.java
URL:
http://svn.apache.org/viewvc/airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/workflow/ApplicationJob.java?rev=1491570&r1=1491569&r2=1491570&view=diff
==============================================================================
---
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/workflow/ApplicationJob.java
(original)
+++
airavata/trunk/modules/registry/registry-api/src/main/java/org/apache/airavata/registry/api/workflow/ApplicationJob.java
Mon Jun 10 19:21:49 2013
@@ -29,19 +29,75 @@ import java.util.Date;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ApplicationJob {
+ /**
+ * Represents the status of the application job execution life
cycle.<br />
+ * <em><strong>Note</strong> : The applicable
<code>ApplicationJobStatus</code> values and the
+ * particular actions that define or lead to those
<code>ApplicationJobStatus</code> values is
+ * based on type of application (eg: GRAM, EC2) being executed</em>.
+ */
public static enum ApplicationJobStatus{
- AUTHENTICATE, //authenticating
- SUBMITTED, //job is submitted, possibly waiting to start
executing
- INITIALIZE, //job is being initialized
- PENDING, //job is pending to be started
- EXECUTING, //submitted job is being executed
- SUSPENDED, //job was paused
- WAITING_FOR_DATA, // job is waiting for data to continue
executing
- FINALIZE, //job is being initialized
- FINISHED, // job completed successfully
- FAILED, // error occurred while job was executing and the job
stopped
- CANCELLED, //job was cancelled
- UNKNOWN // unknown status. lookup the metadata for more details.
+ /**
+ * Input data/files is being staged for the application job.
+ */
+ STAGING,
+ /**
+ * Authenticating
+ */
+ AUTHENTICATE,
+ /**
+ * Application job is submitted, possibly waiting to start
executing.
+ */
+ SUBMITTED,
+ /**
+ * Application job is being initialized.
+ */
+ INITIALIZE,
+ /**
+ * Application job is waiting to start/continue its executing.
+ */
+ PENDING,
+ /**
+ * Application job is being executed.
+ */
+ EXECUTING,
+ /**
+ * Application job is paused/suspended
+ */
+ SUSPENDED,
+ /**
+ * Application job is waiting for data or a trigger to continue
its execution.
+ */
+ WAITING_FOR_DATA,
+ /**
+ * Finalizing the execution of the application job.
+ */
+ FINALIZE,
+ /**
+ * Results of the application job execution are being generated.
+ */
+ RESULTS_GEN,
+ /**
+ * Generated results from the application job execution is
being retrieved.
+ */
+ RESULTS_RETRIEVE,
+ /**
+ * Application job completed successfully.
+ */
+ FINISHED,
+ /**
+ * Error occurred during the application job execution and the
job was terminated.
+ */
+ FAILED,
+ /**
+ * Execution of the application job was cancelled.
+ */
+ CANCELLED,
+ /**
+ * Unable to determine the current status of the application
job. <br />
+ * <em><strong>Note: </strong>More information may be available
on the application job
+ * </em><code>metadata</code>.
+ */
+ UNKNOWN
}
private String experimentId;
@@ -61,6 +117,10 @@ public class ApplicationJob {
private String metadata;
+ /**
+ * The id of the experiment which this application job corresponds to
+ * @return
+ */
public String getExperimentId() {
return experimentId;
}
@@ -69,6 +129,9 @@ public class ApplicationJob {
this.experimentId = experimentId;
}
+ /**
+ * The id of the workflow instance execution which this application job
corresponds to
+ */
public String getWorkflowExecutionId() {
return workflowExecutionId;
}
@@ -77,6 +140,9 @@ public class ApplicationJob {
this.workflowExecutionId = workflowExecutionId;
}
+ /**
+ * The id of the node which this application job corresponds to
+ */
public String getNodeId() {
return nodeId;
}
@@ -85,6 +151,9 @@ public class ApplicationJob {
this.nodeId = nodeId;
}
+ /**
+ * The id of the service description which this application job
corresponds to
+ */
public String getServiceDescriptionId() {
return serviceDescriptionId;
}
@@ -92,7 +161,12 @@ public class ApplicationJob {
public void setServiceDescriptionId(String serviceDescriptionId) {
this.serviceDescriptionId = serviceDescriptionId;
}
-
+
+ /**
+ * The id of the host description which this application job
corresponds to <br />
+ * <em><strong>Note: </strong>For data saved using the deprecated API
function
+ * {@code updateWorkflowNodeGramData(...)} this will be the address of
the host</em>
+ */
public String getHostDescriptionId() {
return hostDescriptionId;
}
@@ -101,6 +175,9 @@ public class ApplicationJob {
this.hostDescriptionId = hostDescriptionId;
}
+ /**
+ * The id of the application description which this application job
corresponds to
+ */
public String getApplicationDescriptionId() {
return applicationDescriptionId;
}
@@ -109,22 +186,47 @@ public class ApplicationJob {
this.applicationDescriptionId = applicationDescriptionId;
}
+ /**
+ * id representing the application job uniquely identified in the
Airavata system <br />
+ * <em><strong>Note: </strong>This id may or may not correspond to an
id that can identify a
+ * resource execution in the computational middleware</em>
+ */
public String getJobId() {
return jobId;
}
+ /**
+ * Set a unique id which represents this job in the Airavata system.
+ */
public void setJobId(String jobId) {
this.jobId = jobId;
}
+ /**
+ * Configuration, execution and input data relating to the execution of
the application job. <br />
+ * <em><strong>Note: </strong>The structure of the data is determined
by the type of application
+ * <code>(eg: GRAM, EC2) being executed.</code></em>
+ */
public String getJobData() {
return jobData;
}
+ /**
+ * Set the configuration, execution and input data relating to the
execution of the application.
+ * job. <br />
+ * <em><strong>Note: </strong>The structure of the data is up to the
Provider implementation
+ * <code>(eg: GRAMProvider, EC2Provider)</code>. It is strongly
encouraged to include in this
+ * field all the information (excluding descriptor data & any sensitive
data such as password
+ * credentials) necessary for a 3rd party to repeat the execution of
application job if
+ * necessary.</em>
+ */
public void setJobData(String jobData) {
this.jobData = jobData;
}
+ /**
+ * When was this application job was submitted.
+ */
public Date getSubmittedTime() {
return submittedTime;
}
@@ -133,6 +235,10 @@ public class ApplicationJob {
this.submittedTime = submittedTime;
}
+ /**
+ * When was the status of this application job was last updated.
+ * @return
+ */
public Date getStatusUpdateTime() {
return statusUpdateTime;
}
@@ -141,6 +247,10 @@ public class ApplicationJob {
this.statusUpdateTime = statusUpdateTime;
}
+ /**
+ * Get the currently recorded status of the application job.
+ * @return
+ */
public ApplicationJobStatus getJobStatus() {
return jobStatus;
}
@@ -149,6 +259,11 @@ public class ApplicationJob {
this.jobStatus = jobStatus;
}
+ /**
+ * Custom metadata maintained for the application job containing that
may contain any additional
+ * information relating to the execution.
+ * @return
+ */
public String getMetadata() {
return metadata;
}