You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sa...@apache.org on 2012/12/20 15:53:00 UTC

svn commit: r1424502 - in /airavata/trunk/modules: airavata-client/src/main/java/org/apache/airavata/client/api/ airavata-client/src/main/java/org/apache/airavata/client/impl/ distribution/airavata-server/src/main/resources/conf/

Author: samindaw
Date: Thu Dec 20 14:53:00 2012
New Revision: 1424502

URL: http://svn.apache.org/viewvc?rev=1424502&view=rev
Log:
adding execution advance options impl + updating the API + api impl

Added:
    airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExperimentAdavanceOptionsImpl.java   (with props)
Modified:
    airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExecutionManager.java
    airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExperimentAdvanceOptions.java
    airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExecutionManagerImpl.java
    airavata/trunk/modules/distribution/airavata-server/src/main/resources/conf/airavata-server.properties

Modified: airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExecutionManager.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExecutionManager.java?rev=1424502&r1=1424501&r2=1424502&view=diff
==============================================================================
--- airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExecutionManager.java (original)
+++ airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExecutionManager.java Thu Dec 20 14:53:00 2012
@@ -32,14 +32,25 @@ import org.apache.airavata.ws.monitor.Mo
 public interface ExecutionManager {
     /**
      * Run an experiment containing single workflow
-     * @param workflowTemplateId
+     * @param workflow - Workflow template Id or Workflow Graph XML
      * @param inputs
      * @return
      * @throws AiravataAPIInvocationException
      */
-	public String runExperiment(String workflowTemplateId,List<WorkflowInput> inputs) throws AiravataAPIInvocationException;
+	public String runExperiment(String workflow,List<WorkflowInput> inputs) throws AiravataAPIInvocationException;
 
     /**
+     * Run an experiment containing single workflow with custom settings for the experiment
+     * @param workflow - Workflow template Id or Workflow Graph XML
+     * @param inputs
+     * @param options
+     * @return
+     * @throws AiravataAPIInvocationException
+     */
+	public String runExperiment(String workflow,List<WorkflowInput> inputs, ExperimentAdvanceOptions options) throws AiravataAPIInvocationException;
+
+	
+    /**
      * Run an experiment containing single workflow
      * @param workflow
      * @param inputs
@@ -49,6 +60,7 @@ public interface ExecutionManager {
 	public String runExperiment(Workflow workflow,List<WorkflowInput> inputs) throws AiravataAPIInvocationException;
 
     /**
+     * @deprecated Use the function <code>runExperiment(String,List&ltWorkflowInput&gt,ExperimentAdvanceOptions)</code> instead. <br />
      * Run an experiment containing single workflow
      * @param workflowTemplateId
      * @param inputs
@@ -61,6 +73,7 @@ public interface ExecutionManager {
 	public String runExperiment(String workflowTemplateId,List<WorkflowInput> inputs, String user, String metadata, String workflowInstanceName)throws AiravataAPIInvocationException;
 
 	/**
+	 * @deprecated Use the function <code>runExperiment(String,List&ltWorkflowInput&gt,ExperimentAdvanceOptions)</code> instead. <br />
      * Run an experiment containing single workflow
      * @param workflowTemplateId
      * @param inputs
@@ -73,6 +86,7 @@ public interface ExecutionManager {
 	public String runExperiment(String workflowTemplateId,List<WorkflowInput> inputs, String user, String metadata, String workflowInstanceName, String experimentName)throws AiravataAPIInvocationException;
 
 	/**
+	 * @deprecated Use the function <code>runExperiment(String,List&ltWorkflowInput&gt,ExperimentAdvanceOptions)</code> instead. <br />
 	 * Run an experiment containing single workflow
 	 * @param workflowTemplateId
 	 * @param inputs
@@ -86,6 +100,7 @@ public interface ExecutionManager {
 	public String runExperiment(String workflowTemplateId,List<WorkflowInput> inputs, String user, String metadata, String workflowInstanceName, WorkflowContextHeaderBuilder builder)throws AiravataAPIInvocationException;
 
     /**
+     * @deprecated Use the function <code>runExperiment(String,List&ltWorkflowInput&gt,ExperimentAdvanceOptions)</code> instead. <br />
      * Run an experiment containing single workflow
      * @param workflow
      * @param inputs
@@ -114,6 +129,7 @@ public interface ExecutionManager {
 	public Monitor getExperimentMonitor(String experimentId, MonitorEventListener listener) throws AiravataAPIInvocationException;
 
 	/**
+	 * @deprecated
 	 * Creates a WorkflowContextHeaderBuilder object that can be used to customize the scheduling of a workflow execution.
 	 * Once configured this object run the workflow using
 	 *   <code>runWorkflow(String workflowTemplateId,List<WorkflowInput> inputs, String user, String metadata, String workflowInstanceName, WorkflowContextHeaderBuilder builder)</code>
@@ -123,11 +139,6 @@ public interface ExecutionManager {
 	public WorkflowContextHeaderBuilder createWorkflowContextHeader() throws AiravataAPIInvocationException;
 
 
-    /**
-     * Creates a DefaultExecutionContext.
-     * @return DefaultExecutionContext
-     * @throws AiravataAPIInvocationException AiravataAPIInvocationException
-     */
-//    public DefaultExecutionContext createDefaultExecutionContext() throws AiravataAPIInvocationException;
+    public ExperimentAdvanceOptions createExperimentAdvanceOptions() throws AiravataAPIInvocationException;
 
 }

Modified: airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExperimentAdvanceOptions.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExperimentAdvanceOptions.java?rev=1424502&r1=1424501&r2=1424502&view=diff
==============================================================================
--- airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExperimentAdvanceOptions.java (original)
+++ airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/api/ExperimentAdvanceOptions.java Thu Dec 20 14:53:00 2012
@@ -100,8 +100,9 @@ public interface ExperimentAdvanceOption
 	 * Users should use the function </i><code><b>setCustomWorkflowContext(...)</b></code><i> to do 
 	 * so</i>.
 	 * @return A WorkflowContextHeaderBuilder object.
+	 * @throws AiravataAPIInvocationException 
 	 */
-	public WorkflowContextHeaderBuilder newCustomWorkflowContext();
+	public WorkflowContextHeaderBuilder newCustomWorkflowContext() throws AiravataAPIInvocationException;
 	
 	/**
 	 * Create a unique experiment Id.<br />

Modified: airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExecutionManagerImpl.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExecutionManagerImpl.java?rev=1424502&r1=1424501&r2=1424502&view=diff
==============================================================================
--- airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExecutionManagerImpl.java (original)
+++ airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExecutionManagerImpl.java Thu Dec 20 14:53:00 2012
@@ -21,18 +21,32 @@
 
 package org.apache.airavata.client.impl;
 
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.UUID;
+
+import javax.xml.stream.XMLStreamException;
+
 import org.apache.airavata.client.AiravataClient;
 import org.apache.airavata.client.AiravataClientConfiguration;
 import org.apache.airavata.client.api.AiravataAPIInvocationException;
 import org.apache.airavata.client.api.ExecutionManager;
+import org.apache.airavata.client.api.ExperimentAdvanceOptions;
+import org.apache.airavata.client.stub.interpretor.NameValue;
+import org.apache.airavata.client.stub.interpretor.WorkflowInterpretorStub;
+import org.apache.airavata.common.utils.XMLUtil;
 import org.apache.airavata.common.workflow.execution.context.WorkflowContextHeaderBuilder;
+import org.apache.airavata.workflow.model.component.ComponentException;
+import org.apache.airavata.workflow.model.component.ws.WSComponentPort;
+import org.apache.airavata.workflow.model.graph.GraphException;
 import org.apache.airavata.workflow.model.wf.Workflow;
 import org.apache.airavata.workflow.model.wf.WorkflowInput;
 import org.apache.airavata.ws.monitor.Monitor;
 import org.apache.airavata.ws.monitor.MonitorEventListener;
-
-import java.util.Calendar;
-import java.util.List;
+import org.apache.axiom.om.impl.llom.util.AXIOMUtil;
+import org.apache.axis2.AxisFault;
 
 public class ExecutionManagerImpl implements ExecutionManager {
 	private AiravataClient client;
@@ -120,19 +134,6 @@ public class ExecutionManagerImpl implem
 		}
 	}
 
-//    @Override
-//    public DefaultExecutionContext createDefaultExecutionContext() throws AiravataAPIInvocationException {
-//        DefaultExecutionContext ec = new DefaultExecutionContext();
-////        ec.addNotifiable(new LoggingNotification());
-////        try {
-//            // TODO : Fix me
-////            ec.setRegistryService(getClient().getRegistry());
-////        } catch (RegistryException e) {
-////            throw new AiravataAPIInvocationException(e);
-////        }
-//        return  ec;
-//    }
-
 	@Override
 	public String runExperiment(String workflowName,
 			List<WorkflowInput> inputs, String user, String metadata,
@@ -145,4 +146,141 @@ public class ExecutionManagerImpl implem
 		}
 	}
 
+	@Override
+	public String runExperiment(String workflow,
+			List<WorkflowInput> inputs, ExperimentAdvanceOptions options)
+			throws AiravataAPIInvocationException {
+		return runWorkflow(workflow, inputs, options);
+	}
+	
+	private String runWorkflow(String workflowName, List<WorkflowInput> inputs, ExperimentAdvanceOptions options) throws AiravataAPIInvocationException {
+		Workflow workflowObj = extractWorkflow(workflowName);
+		return runWorkflow(workflowName, workflowObj, inputs, options);
+	}
+	
+	private String runWorkflow(String workflowName, Workflow workflowObj, List<WorkflowInput> inputs, ExperimentAdvanceOptions options) throws AiravataAPIInvocationException {
+		try {
+	        
+			String workflowString = XMLUtil.xmlElementToString(workflowObj.toXML());
+			List<WSComponentPort> ports = getWSComponentPortInputs(workflowObj);
+			for (WorkflowInput input : inputs) {
+				WSComponentPort port = getWSComponentPort(input.getName(),
+						ports);
+				if (port != null) {
+					port.setValue(input.getValue());
+				}
+			}
+			List<NameValue> inputValues = new ArrayList<NameValue>();
+			for (WSComponentPort port : ports) {
+				NameValue nameValue = new NameValue();
+				nameValue.setName(port.getName());
+				if (port.getValue() == null) {
+					nameValue.setValue(port.getDefaultValue());
+				} else {
+					nameValue.setValue(port.getValue().toString());
+				}
+				inputValues.add(nameValue);
+			}
+			String experimentID=options.getCustomExperimentId();
+			String workflowTemplateName = workflowObj.getName();
+			if (experimentID == null || experimentID.isEmpty()) {
+				experimentID = workflowTemplateName + "_" + UUID.randomUUID();
+			}
+	        getClient().getProvenanceManager().setWorkflowInstanceTemplateName(experimentID,workflowTemplateName);
+	        
+			WorkflowContextHeaderBuilder builder=options.getCustomWorkflowContext();
+			if (builder==null){
+				builder=options.newCustomWorkflowContext();
+			}
+			
+			//TODO - fix user passing
+	        String submissionUser = getClient().getUserManager().getAiravataUser();
+			builder.setUserIdentifier(submissionUser);
+			String executionUser=options.getExperimentExecutionUser();
+			if (executionUser==null){
+				executionUser=submissionUser;
+			}
+			runPreWorkflowExecutionTasks(experimentID, executionUser, options.getExperimentMetadata(), options.getExperimentName());
+			NameValue[] inputVals = inputValues.toArray(new NameValue[] {});
+			launchWorkflow(experimentID, workflowString, inputVals, builder);
+			return experimentID;
+			
+		}  catch (GraphException e) {
+			throw new AiravataAPIInvocationException(e);
+		} catch (ComponentException e) {
+			throw new AiravataAPIInvocationException(e);
+		} catch (Exception e) {
+	        throw new AiravataAPIInvocationException("Error working with Airavata Registry: " + e.getLocalizedMessage(), e);
+	    }
+	}
+    private Workflow extractWorkflow(String workflowName) throws AiravataAPIInvocationException {
+        Workflow workflowObj = null;
+        if(getClient().getWorkflowManager().isWorkflowExists(workflowName)) {
+            workflowObj = getClient().getWorkflowManager().getWorkflow(workflowName);
+        }else {
+            try{
+                workflowObj = getClient().getWorkflowManager().getWorkflowFromString(workflowName);
+            }catch (AiravataAPIInvocationException e){
+            	getClient().getWorkflowManager().getWorkflow(workflowName);
+            }
+
+        }
+        return workflowObj;
+    }
+    
+	private List<WSComponentPort> getWSComponentPortInputs(Workflow workflow)
+			throws GraphException, ComponentException {
+		workflow.createScript();
+		List<WSComponentPort> inputs = workflow.getInputs();
+		return inputs;
+	}
+
+	private WSComponentPort getWSComponentPort(String name,
+			List<WSComponentPort> ports) {
+		for (WSComponentPort port : ports) {
+			if (port.getName().equals(name)) {
+				return port;
+			}
+		}
+		return null;
+	}
+	
+	private void launchWorkflow(String experimentId, String workflowGraph, NameValue[] inputs,
+			WorkflowContextHeaderBuilder builder) throws AiravataAPIInvocationException {
+		try {
+			builder.getWorkflowMonitoringContext().setExperimentId(experimentId);
+			WorkflowInterpretorStub stub = new WorkflowInterpretorStub(getClient().getAiravataManager().getWorkflowInterpreterServiceURL().toString());
+			stub._getServiceClient().addHeader(
+					AXIOMUtil.stringToOM(XMLUtil.xmlElementToString(builder
+							.getXml())));
+			stub.launchWorkflow(workflowGraph, experimentId, inputs);
+		} catch (AxisFault e) {
+			e.printStackTrace();
+		} catch (XMLStreamException e) {
+			e.printStackTrace();
+		} catch (RemoteException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void runPreWorkflowExecutionTasks(String experimentId, String user,
+			String metadata, String experimentName) throws AiravataAPIInvocationException {
+		if (user != null) {
+			getClient().getProvenanceManager().setExperimentUser(experimentId, user);
+		}
+		if (metadata != null) {
+			getClient().getProvenanceManager().setExperimentMetadata(experimentId, metadata);
+		}
+		if (experimentName == null) {
+			experimentName = experimentId;
+		}
+		getClient().getProvenanceManager().setExperimentName(experimentId, experimentName);
+	}
+	
+	@Override
+	public ExperimentAdvanceOptions createExperimentAdvanceOptions()
+			throws AiravataAPIInvocationException {
+		return new ExperimentAdavanceOptionsImpl(getClient());
+	}
+
 }

Added: airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExperimentAdavanceOptionsImpl.java
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExperimentAdavanceOptionsImpl.java?rev=1424502&view=auto
==============================================================================
--- airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExperimentAdavanceOptionsImpl.java (added)
+++ airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExperimentAdavanceOptionsImpl.java Thu Dec 20 14:53:00 2012
@@ -0,0 +1,106 @@
+/*
+ *
+ * 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.client.impl;
+
+import java.util.UUID;
+
+import org.apache.airavata.client.api.AiravataAPI;
+import org.apache.airavata.client.api.AiravataAPIInvocationException;
+import org.apache.airavata.client.api.ExperimentAdvanceOptions;
+import org.apache.airavata.common.workflow.execution.context.WorkflowContextHeaderBuilder;
+
+public class ExperimentAdavanceOptionsImpl implements ExperimentAdvanceOptions {
+	private String executionUser;
+	private String metadata;
+	private String experimentName;
+	private String customExperimentId;
+	private WorkflowContextHeaderBuilder workflowContext;
+	
+	private AiravataAPI api;
+	
+	public ExperimentAdavanceOptionsImpl(AiravataAPI api) {
+		this.api=api;
+	}
+	
+	@Override
+	public String getExperimentExecutionUser() {
+		return executionUser;
+	}
+
+	@Override
+	public String getExperimentMetadata() {
+		return metadata;
+	}
+
+	@Override
+	public String getExperimentName() {
+		return experimentName;
+	}
+
+	@Override
+	public String getCustomExperimentId() {
+		return customExperimentId;
+	}
+
+	@Override
+	public WorkflowContextHeaderBuilder getCustomWorkflowContext() {
+		return workflowContext;
+	}
+
+	@Override
+	public void setExperimentExecutioUser(String experimentExecutionUser) {
+		this.executionUser=experimentExecutionUser;
+
+	}
+
+	@Override
+	public void setExperimentCustomMetadata(String experimentMetadata) {
+		this.metadata=experimentMetadata;
+	}
+
+	@Override
+	public void setExperimentName(String experimentName) {
+		this.experimentName=experimentName;
+	}
+
+	@Override
+	public void setCustomExperimentId(String customExperimentId) {
+		this.customExperimentId=customExperimentId;
+	}
+
+	@Override
+	public void setCustomWorkflowContext(
+			WorkflowContextHeaderBuilder workflowContext) {
+		this.workflowContext=workflowContext;
+	}
+
+	@Override
+	public WorkflowContextHeaderBuilder newCustomWorkflowContext() throws AiravataAPIInvocationException {
+		return api.getExecutionManager().createWorkflowContextHeader();
+	}
+
+	@Override
+	public String generatExperimentId() {
+		return UUID.randomUUID().toString();
+	}
+
+}

Propchange: airavata/trunk/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/ExperimentAdavanceOptionsImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: airavata/trunk/modules/distribution/airavata-server/src/main/resources/conf/airavata-server.properties
URL: http://svn.apache.org/viewvc/airavata/trunk/modules/distribution/airavata-server/src/main/resources/conf/airavata-server.properties?rev=1424502&r1=1424501&r2=1424502&view=diff
==============================================================================
--- airavata/trunk/modules/distribution/airavata-server/src/main/resources/conf/airavata-server.properties (original)
+++ airavata/trunk/modules/distribution/airavata-server/src/main/resources/conf/airavata-server.properties Thu Dec 20 14:53:00 2012
@@ -67,7 +67,7 @@ system.password=admin
 # Airavata Workflow Interpreter Configurations
 ###########################################################################
 
-runInThread=false
+runInThread=true
 provenance=true
 provenanceWriterThreadPoolSize=20
 gfac.embedded=false