You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by la...@apache.org on 2014/02/05 21:30:08 UTC

[5/5] git commit: more code for AIRAVATA-1011

more code for AIRAVATA-1011


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/176acc23
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/176acc23
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/176acc23

Branch: refs/heads/master
Commit: 176acc23770d860dff1fc42ae32408e1f02d3944
Parents: a1b1ff9
Author: lahiru <la...@apache.org>
Authored: Wed Feb 5 15:29:55 2014 -0500
Committer: lahiru <la...@apache.org>
Committed: Wed Feb 5 15:29:55 2014 -0500

----------------------------------------------------------------------
 .../orchestrator/core/Orchestrator.java         |  86 ----------
 .../core/OrchestratorConfiguration.java         |  10 ++
 .../core/validator/JobMetadataValidator.java    |  32 ++++
 .../impl/AbstractJobMetadataValidator.java      |  30 ++++
 .../validator/impl/SimpleAppDataValidator.java  |  51 ++++++
 .../airavata/orchestrator/cpi/Orchestrator.java |   2 +-
 .../cpi/impl/AbstractOrchestrator.java          | 172 +++++++++++++++++++
 .../cpi/impl/SimpleOrchestratorImpl.java        |  11 +-
 .../src/main/resources/orchestrator.properties  |   1 +
 9 files changed, 306 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/Orchestrator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/Orchestrator.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/Orchestrator.java
deleted file mode 100644
index 0a4f913..0000000
--- a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/Orchestrator.java
+++ /dev/null
@@ -1,86 +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.airavata.orchestrator.core;
-
-import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
-import org.apache.airavata.orchestrator.core.model.ExperimentRequest;
-import org.apache.airavata.registry.api.JobRequest;
-
-/*
-   This is the interface for orchestrator functionality exposed to the out side of the
-   module
-*/
-public interface Orchestrator {
-
-
-    /**
-     * This method will initialize the Orchestrator, during restart this will
-     * get called and do init tasks
-     * @return
-     * @throws OrchestratorException
-     */
-    boolean initialize() throws OrchestratorException;
-
-
-    /**
-     *  This method is the very first method which create an entry in
-     * database for a given experiment, this return the experiment ID, so
-     * user have full control for the experiment
-     * @param request
-     * @return
-     * @throws OrchestratorException
-     */
-    String createExperiment(ExperimentRequest request) throws OrchestratorException;
-
-    /**
-     * After creating the experiment user has the experimentID, then user
-     * can create the JobRequest and send the Job input parameters to Orchestrator
-     * @param request
-     * @return
-     * @throws OrchestratorException
-     */
-    boolean launchExperiment(JobRequest request) throws OrchestratorException;
-
-    /**
-     * This method can be used to cancel a running experiment, if job is already finished it
-     * throws an exception. If job is not yet submitted it will just change the status to cancelled,
-     * if Job is running it will be killed from the resource and make the status to cancelled
-     * @param experimentID
-     * @return
-     * @throws OrchestratorException
-     */
-    boolean terminateExperiment(String experimentID)throws OrchestratorException;
-
-    /**
-     * This is like a cron job which runs continuously and take available jobs to
-     * submit to GFAC and submit them to GFAC
-     * @throws OrchestratorException
-     */
-    void startJobSubmitter() throws OrchestratorException;
-
-    /**
-     * This method will get called during graceful shutdown of Orchestrator
-     * This can be used to handle the shutdown of orchestrator gracefully.
-     * @return
-     * @throws OrchestratorException
-     */
-    void shutdown() throws OrchestratorException;
-}

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/OrchestratorConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/OrchestratorConfiguration.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/OrchestratorConfiguration.java
index c35dacf..ef36692 100644
--- a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/OrchestratorConfiguration.java
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/OrchestratorConfiguration.java
@@ -46,6 +46,16 @@ public class OrchestratorConfiguration {
 
     private boolean embeddedMode;
 
+    private String validatorClass;
+
+
+    public String getValidatorClass() {
+        return validatorClass;
+    }
+
+    public void setValidatorClass(String validatorClass) {
+        this.validatorClass = validatorClass;
+    }
 
     public boolean isEmbeddedMode() {
         return embeddedMode;

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/JobMetadataValidator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/JobMetadataValidator.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/JobMetadataValidator.java
new file mode 100644
index 0000000..d365c87
--- /dev/null
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/JobMetadataValidator.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * 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.orchestrator.core.validator;
+
+import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
+
+public interface JobMetadataValidator {
+
+    boolean runBasicValidation(String experimentID)throws OrchestratorException;
+
+    boolean runAppSpecificValidation(String experimentID)throws OrchestratorException;
+
+    boolean validate(String experimentID) throws OrchestratorException;
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/AbstractJobMetadataValidator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/AbstractJobMetadataValidator.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/AbstractJobMetadataValidator.java
new file mode 100644
index 0000000..e83d5c9
--- /dev/null
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/AbstractJobMetadataValidator.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * 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.orchestrator.core.validator.impl;
+
+import org.apache.airavata.orchestrator.core.validator.JobMetadataValidator;
+
+public abstract class AbstractJobMetadataValidator implements JobMetadataValidator {
+    public boolean runBasicValidation(String experimentID) {
+        //todo implement basic validation which is not an application specific
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/SimpleAppDataValidator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/SimpleAppDataValidator.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/SimpleAppDataValidator.java
new file mode 100644
index 0000000..0d16062
--- /dev/null
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/SimpleAppDataValidator.java
@@ -0,0 +1,51 @@
+/*
+ *
+ * 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.orchestrator.core.validator.impl;
+
+import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SimpleAppDataValidator extends AbstractJobMetadataValidator {
+    private final static Logger logger = LoggerFactory.getLogger(SimpleAppDataValidator.class);
+
+    public boolean runAppSpecificValidation(String experimentID) throws OrchestratorException{
+        // implement simple application specific validator to be used for
+        // all the applications.
+        return true;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public boolean validate(String experimentID) throws OrchestratorException {
+        boolean result = false;
+        if (super.runBasicValidation(experimentID)) {
+
+            if (runAppSpecificValidation(experimentID)) {
+                return true;
+            }
+            String error = "Application data validation steps failed";
+            logger.error(error);
+            return false;
+        }
+        String error = "Basic validation steps failed";
+        logger.error(error);
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/Orchestrator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/Orchestrator.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/Orchestrator.java
index ab237af..3da9874 100644
--- a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/Orchestrator.java
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/Orchestrator.java
@@ -91,5 +91,5 @@ public interface Orchestrator {
      * @param experimentID
      * @return
      */
-    boolean validateExperiment(String experimentID);
+    boolean validateExperiment(String experimentID)throws OrchestratorException;
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/AbstractOrchestrator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/AbstractOrchestrator.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/AbstractOrchestrator.java
new file mode 100644
index 0000000..4c0fca3
--- /dev/null
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/AbstractOrchestrator.java
@@ -0,0 +1,172 @@
+/*
+ *
+ * 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.orchestrator.cpi.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.airavata.client.AiravataAPIFactory;
+import org.apache.airavata.client.api.AiravataAPI;
+import org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
+import org.apache.airavata.common.exception.AiravataConfigurationException;
+import org.apache.airavata.orchestrator.core.OrchestratorConfiguration;
+import org.apache.airavata.orchestrator.core.context.OrchestratorContext;
+import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
+import org.apache.airavata.orchestrator.core.gfac.GFACInstance;
+import org.apache.airavata.orchestrator.core.model.ExperimentRequest;
+import org.apache.airavata.orchestrator.core.utils.OrchestratorConstants;
+import org.apache.airavata.orchestrator.core.utils.OrchestratorUtils;
+import org.apache.airavata.orchestrator.cpi.Orchestrator;
+import org.apache.airavata.registry.api.AiravataRegistry2;
+import org.apache.airavata.registry.api.AiravataRegistryFactory;
+import org.apache.airavata.registry.api.AiravataUser;
+import org.apache.airavata.registry.api.Gateway;
+import org.apache.airavata.registry.api.exception.RegistryException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractOrchestrator implements Orchestrator {
+	private final static Logger logger = LoggerFactory.getLogger(AbstractOrchestrator.class);
+	protected AiravataRegistry2 airavataRegistry;
+	protected AiravataAPI airavataAPI;
+	protected OrchestratorContext orchestratorContext;
+	protected OrchestratorConfiguration orchestratorConfiguration;
+
+    private String registryURL;
+    private String gatewayName;
+    private String airavataUserName;
+   
+    public String getRegistryURL() {
+		return registryURL;
+	}
+
+	public void setRegistryURL(String registryURL) {
+		this.registryURL = registryURL;
+	}
+
+	public String getGatewayName() {
+		return gatewayName;
+	}
+
+	public void setGatewayName(String gatewayName) {
+		this.gatewayName = gatewayName;
+	}
+	public String getAiravataUserName() {
+		return airavataUserName;
+	}
+
+	public void setAiravataUserName(String airavataUserName) {
+		this.airavataUserName = airavataUserName;
+	}
+	public boolean initialize() throws OrchestratorException {
+        try {
+            /* Initializing the OrchestratorConfiguration object */
+        	orchestratorConfiguration = OrchestratorUtils.loadOrchestratorConfiguration();
+            setGatewayProperties();
+            /* initializing the Orchestratorcontext object */
+            airavataRegistry = AiravataRegistryFactory.getRegistry(new Gateway(getGatewayName()), new AiravataUser(getAiravataUserName()));
+            // todo move this code to gfac service mode Jobsubmitter,
+            // todo this is ugly, SHOULD fix these isEmbedded mode code from Orchestrator
+            if (!orchestratorConfiguration.isEmbeddedMode()) {
+                Map<String, Integer> gfacNodeList = airavataRegistry.getGFACNodeList();
+                if (gfacNodeList.size() == 0) {
+                    String error = "No GFAC instances available in the system, Can't initialize Orchestrator";
+                    logger.error(error);
+                    throw new OrchestratorException(error);
+                }
+                Set<String> uriList = gfacNodeList.keySet();
+                Iterator<String> iterator = uriList.iterator();
+                List<GFACInstance> gfacInstanceList = new ArrayList<GFACInstance>();
+                while (iterator.hasNext()) {
+                    String uri = iterator.next();
+                    Integer integer = gfacNodeList.get(uri);
+                    gfacInstanceList.add(new GFACInstance(uri, integer));
+                }
+            }
+            orchestratorContext = new OrchestratorContext();
+            orchestratorContext.setOrchestratorConfiguration(orchestratorConfiguration);
+            orchestratorConfiguration.setAiravataAPI(getAiravataAPI());
+            orchestratorContext.setRegistry(airavataRegistry);
+        } catch (RegistryException e) {
+            logger.error("Failed to initializing Orchestrator");
+            OrchestratorException orchestratorException = new OrchestratorException(e);
+            throw orchestratorException;
+        } catch (AiravataConfigurationException e) {
+            logger.error("Failed to initializing Orchestrator");
+            OrchestratorException orchestratorException = new OrchestratorException(e);
+            throw orchestratorException;
+        } catch (IOException e) {
+            logger.error("Failed to initializing Orchestrator - Error parsing orchestrator.properties");
+            OrchestratorException orchestratorException = new OrchestratorException(e);
+            throw orchestratorException;
+        }
+        return true;
+    }
+	
+	//get the registry URL and the credentials from the property file
+    protected void setGatewayProperties() {
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(OrchestratorConstants.AIRAVATA_PROPERTIES);
+        Properties properties = new Properties();
+        try {
+            properties.load(inputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        setAiravataUserName(properties.getProperty("system.user"));
+        setGatewayName(properties.getProperty("system.gateway"));
+        setRegistryURL(properties.getProperty("airavata.server.url"));
+    }
+    //todo decide whether to return an error or do what
+	 //FIXME: (MEP) as posted on dev list, I think this should return a JobRequest with the experimentID set. This would simplify some of the validation in EmbeddedGFACJobSubmitter's launcGfacWithJobRequest--just throw the job away if the JobRequest is incomplete or malformed.
+   public String createExperiment(ExperimentRequest request) throws OrchestratorException {
+       //todo use a consistent method to create the experiment ID
+		  //FIXME: (MEP) Should you trust the user to do this?  What if the same experimentID is sent twice by the same gateway?
+       String experimentID = request.getUserExperimentID();
+       if(experimentID == null){
+       	experimentID = UUID.randomUUID().toString(); 
+       }
+       try {
+           airavataRegistry.storeExperiment(request.getSubmitterUserName(), experimentID, null, null);
+       } catch (RegistryException e) {
+           //todo put more meaningful error  message
+           logger.error("Failed to create experiment for the request from " + request.getSubmitterUserName());
+           throw new OrchestratorException(e);
+       }
+       return experimentID;
+   }
+   private AiravataAPI getAiravataAPI() {
+       if (airavataAPI == null) {
+           try {
+               airavataAPI = AiravataAPIFactory.getAPI(getGatewayName(), getAiravataUserName());
+           }  catch (AiravataAPIInvocationException e) {
+               logger.error("Unable to create Airavata API", e);
+           }
+       }
+       return airavataAPI;
+   }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
index b75f226..40fecba 100644
--- a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
@@ -29,6 +29,7 @@ import org.apache.airavata.orchestrator.core.NewJobWorker;
 import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
 import org.apache.airavata.orchestrator.core.job.JobSubmitter;
 import org.apache.airavata.orchestrator.core.utils.OrchestratorUtils;
+import org.apache.airavata.orchestrator.core.validator.JobMetadataValidator;
 import org.apache.airavata.registry.api.JobRequest;
 import org.apache.airavata.registry.api.exception.RegistryException;
 import org.slf4j.Logger;
@@ -42,6 +43,8 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     // this is going to be null unless the thread count is 0
     private JobSubmitter jobSubmitter = null;
 
+    private JobMetadataValidator jobMetadataValidator = null;
+
     public boolean initialize() throws OrchestratorException {
         super.initialize();
         // we have a thread to run normal new jobs except to monitor hanged jobs
@@ -55,6 +58,10 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                 Class<? extends JobSubmitter> aClass = Class.forName(submitterClass.trim()).asSubclass(JobSubmitter.class);
                 jobSubmitter = aClass.newInstance();
                 jobSubmitter.initialize(this.orchestratorContext);
+
+                String validatorClzz = this.orchestratorContext.getOrchestratorConfiguration().getValidatorClass();
+                Class<? extends JobMetadataValidator> vClass = Class.forName(validatorClzz.trim()).asSubclass(JobMetadataValidator.class);
+                jobMetadataValidator = vClass.newInstance();
             } catch (Exception e) {
                 String error = "Error creating JobSubmitter in non threaded mode ";
                 logger.error(error);
@@ -160,7 +167,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
         return true;
     }
 
-    public boolean validateExperiment(String experimentID) {
-        return false;
+    public boolean validateExperiment(String experimentID) throws OrchestratorException{
+        return jobMetadataValidator.validate(experimentID);
     }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/176acc23/modules/orchestrator/orchestrator-core/src/main/resources/orchestrator.properties
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/resources/orchestrator.properties b/modules/orchestrator/orchestrator-core/src/main/resources/orchestrator.properties
index 728f215..85568a4 100644
--- a/modules/orchestrator/orchestrator-core/src/main/resources/orchestrator.properties
+++ b/modules/orchestrator/orchestrator-core/src/main/resources/orchestrator.properties
@@ -18,6 +18,7 @@
 # under the License.
 #
 job.submitter=org.apache.airavata.orchestrator.core.impl.EmbeddedGFACJobSubmitter
+job.validator=org.apache.airavata.orchestrator.core.validator.impl.SimpleAppDataValidator
 submitter.interval=10000
 threadpool.size=10
 start.submitter=true