You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ch...@apache.org on 2015/04/22 22:06:09 UTC

airavata git commit: fixing validation - AIRAVATA-1682

Repository: airavata
Updated Branches:
  refs/heads/master 4a043bec6 -> 0f8269da3


fixing validation - AIRAVATA-1682


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

Branch: refs/heads/master
Commit: 0f8269da3961adfa2b85823a86b6a184192fb357
Parents: 4a043be
Author: Chathuri Wimalasena <ka...@gmail.com>
Authored: Wed Apr 22 16:06:03 2015 -0400
Committer: Chathuri Wimalasena <ka...@gmail.com>
Committed: Wed Apr 22 16:06:03 2015 -0400

----------------------------------------------------------------------
 .../server/handler/AiravataServerHandler.java   |  4 +-
 .../tools/RegisterSampleApplications.java       | 53 +++++++++--
 .../core/validator/JobMetadataValidator.java    |  5 +-
 .../impl/ExperimentStatusValidator.java         | 22 +++--
 .../validator/impl/SimpleAppDataValidator.java  | 95 ++++++++++++++++++--
 .../cpi/impl/SimpleOrchestratorImpl.java        | 46 ++++++----
 .../orchestrator/core/util/SecondValidator.java | 11 ++-
 .../orchestrator/core/util/TestValidator.java   | 15 ++--
 .../test-suite/multi-tenanted-airavata/pom.xml  | 10 +--
 9 files changed, 203 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
index 00ad99f..e2b402e 100644
--- a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
+++ b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
@@ -1277,10 +1277,10 @@ public class AiravataServerHandler implements Airavata.Iface {
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
         } catch (RegistryException e1) {
-            logger.errorId(airavataExperimentId, "Error while retrieving projects", e1);
+            logger.errorId(airavataExperimentId, "Error while instantiate the registry instance", e1);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage("Error while retrieving projects. More info : " + e1.getMessage());
+            exception.setMessage("Error while instantiate the registry instance. More info : " + e1.getMessage());
             throw exception;
         }
     	Experiment experiment = getExperiment(airavataExperimentId);

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java
index f90f633..ffdc584 100644
--- a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java
+++ b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java
@@ -200,26 +200,43 @@ public class RegisterSampleApplications {
             System.out.println("\n #### Registering XSEDE Computational Resources #### \n");
 
             //Register Stampede
+            List<BatchQueue> stampedeQueues = new ArrayList<>();
+            BatchQueue normalQueue = createBatchQueue("normal", "Normal Queue", 2880, 256, 4000, 50, 0);
+            BatchQueue developmentQueue = createBatchQueue("development", "Development Queue", 120, 16, 4000, 1, 0);
+            stampedeQueues.add(normalQueue);
+            stampedeQueues.add(developmentQueue);
             stampedeResourceId = registerComputeHost("stampede.tacc.xsede.org", "TACC Stampede Cluster",
-                    ResourceJobManagerType.SLURM, "push", "/usr/bin", SecurityProtocol.SSH_KEYS, 22, null);
+                    ResourceJobManagerType.SLURM, "push", "/usr/bin", SecurityProtocol.SSH_KEYS, 22, null, stampedeQueues);
+
             System.out.println("Stampede Resource Id is " + stampedeResourceId);
 
             //Register Trestles
+            List<BatchQueue> trestlesQueues = new ArrayList<>();
+            BatchQueue normalQueue_tr = createBatchQueue("normal", "Normal Queue", 2880, 32, 32, 50, 0);
+            BatchQueue sharedQueue_tr = createBatchQueue("shared", "Shared Queue", 2880, 4, 32, 50, 0);
+            trestlesQueues.add(normalQueue_tr);
+            trestlesQueues.add(sharedQueue_tr);
             trestlesResourceId = registerComputeHost("trestles.sdsc.xsede.org", "SDSC Trestles Cluster",
-                    ResourceJobManagerType.PBS, "push", "/opt/torque/bin/", SecurityProtocol.SSH_KEYS, 22, null);
+                    ResourceJobManagerType.PBS, "push", "/opt/torque/bin/", SecurityProtocol.SSH_KEYS, 22, null, trestlesQueues);
             System.out.println("Trestles Resource Id is " + trestlesResourceId);
 
             //Register BigRedII
+            List<BatchQueue> br2Queues = new ArrayList<>();
+            BatchQueue normalQueue_br2 = createBatchQueue("normal", "Normal Queue", 2880, 340, 2048, 50, 0);
+            BatchQueue serial_br2 = createBatchQueue("serial", "Normal Queue", 10080, 340, 2048, 50, 0);
+            br2Queues.add(normalQueue_br2);
+            br2Queues.add(serial_br2);
             bigredResourceId = registerComputeHost("bigred2.uits.iu.edu", "IU BigRed II Cluster",
-                    ResourceJobManagerType.PBS, "push", "/opt/torque/torque-4.2.3.1/bin/", SecurityProtocol.SSH_KEYS, 22, "aprun -n");
+                    ResourceJobManagerType.PBS, "push", "/opt/torque/torque-4.2.3.1/bin/", SecurityProtocol.SSH_KEYS, 22, "aprun -n", br2Queues);
             System.out.println("BigredII Resource Id is " + bigredResourceId);
 
             fsdResourceId = registerUnicoreEndpoint("fsd-cloud15.zam.kfa-juelich.de", "interop host", JobSubmissionProtocol.UNICORE, SecurityProtocol.GSI);
             System.out.println("FSd Resource Id: "+fsdResourceId);
 
             //Register Alamo
+            List<BatchQueue> alamoQueues = new ArrayList<>();
             alamoResourceId = registerComputeHost("alamo.uthscsa.edu", "Alamo Cluster",
-                    ResourceJobManagerType.PBS, "push", "/usr/bin/", SecurityProtocol.SSH_KEYS, 22, "/usr/bin/mpiexec -np");
+                    ResourceJobManagerType.PBS, "push", "/usr/bin/", SecurityProtocol.SSH_KEYS, 22, "/usr/bin/mpiexec -np", alamoQueues);
             System.out.println("Alamo Cluster " + alamoResourceId);
             
 
@@ -234,8 +251,9 @@ public class RegisterSampleApplications {
             System.out.println("\n #### Registering Non-XSEDE Computational Resources #### \n");
 
             //Register LSF resource
+            List<BatchQueue> lsfQueues = new ArrayList<>();
             lsfResourceId = registerComputeHost("ghpcc06.umassrc.org", "LSF Cluster",
-                    ResourceJobManagerType.LSF, "push", "source /etc/bashrc;/lsf/9.1/linux2.6-glibc2.3-x86_64/bin", SecurityProtocol.SSH_KEYS, 22, "mpiexec");
+                    ResourceJobManagerType.LSF, "push", "source /etc/bashrc;/lsf/9.1/linux2.6-glibc2.3-x86_64/bin", SecurityProtocol.SSH_KEYS, 22, "mpiexec", lsfQueues);
             System.out.println("LSF Resource Id is " + lsfResourceId);
 
         } catch (TException e) {
@@ -1307,16 +1325,35 @@ public class RegisterSampleApplications {
         }
     }
 
-    
+    public BatchQueue createBatchQueue (String queuename,
+                                        String queueDesc,
+                                        int maxRunTime,
+                                        int maxNodes,
+                                        int maxProcessors,
+                                        int maxJobsInQueue,
+                                        int maxMemory){
+        BatchQueue batchQueue = new BatchQueue();
+        batchQueue.setQueueName(queuename);
+        batchQueue.setQueueDescription(queueDesc);
+        batchQueue.setMaxMemory(maxMemory);
+        batchQueue.setMaxJobsInQueue(maxJobsInQueue);
+        batchQueue.setMaxNodes(maxNodes);
+        batchQueue.setMaxRunTime(maxRunTime);
+        batchQueue.setMaxProcessors(maxProcessors);
+        return batchQueue;
+    }
     
     public String registerComputeHost(String hostName, String hostDesc,
                                              ResourceJobManagerType resourceJobManagerType,
                                              String monitoringEndPoint, String jobMangerBinPath,
-                                             SecurityProtocol securityProtocol, int portNumber, String jobManagerCommand) throws TException {
+                                             SecurityProtocol securityProtocol,
+                                             int portNumber,
+                                             String jobManagerCommand,
+                                             List<BatchQueue> batchQueues) throws TException {
 
         ComputeResourceDescription computeResourceDescription = RegisterSampleApplicationsUtils.
                 createComputeResourceDescription(hostName, hostDesc, null, null);
-
+        computeResourceDescription.setBatchQueues(batchQueues);
         String computeResourceId = airavataClient.registerComputeResource(computeResourceDescription);
 
         if (computeResourceId.isEmpty()) throw new AiravataClientException();

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/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
index 0a8b46a..a564dae 100644
--- 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
@@ -20,11 +20,10 @@
 */
 package org.apache.airavata.orchestrator.core.validator;
 
-import org.apache.airavata.model.error.ValidatorResult;
+import org.apache.airavata.model.error.ValidationResults;
 import org.apache.airavata.model.workspace.experiment.Experiment;
 import org.apache.airavata.model.workspace.experiment.TaskDetails;
 import org.apache.airavata.model.workspace.experiment.WorkflowNodeDetails;
-import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
 
 /**
  * This is the interface to implement a validation logic, users can implement their validation
@@ -43,5 +42,5 @@ public interface JobMetadataValidator {
      * @param taskID
      * @return
      */
-    ValidatorResult validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID);
+    ValidationResults validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID);
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/ExperimentStatusValidator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/ExperimentStatusValidator.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/ExperimentStatusValidator.java
index 276a26f..98b7458 100644
--- a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/ExperimentStatusValidator.java
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/validator/impl/ExperimentStatusValidator.java
@@ -20,26 +20,38 @@
 */
 package org.apache.airavata.orchestrator.core.validator.impl;
 
+import org.apache.airavata.model.error.ValidationResults;
 import org.apache.airavata.model.error.ValidatorResult;
-import org.apache.airavata.model.workspace.experiment.*;
+import org.apache.airavata.model.workspace.experiment.Experiment;
+import org.apache.airavata.model.workspace.experiment.ExperimentState;
+import org.apache.airavata.model.workspace.experiment.TaskDetails;
+import org.apache.airavata.model.workspace.experiment.WorkflowNodeDetails;
 import org.apache.airavata.orchestrator.core.validator.JobMetadataValidator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class ExperimentStatusValidator implements JobMetadataValidator {
     private static Logger log = LoggerFactory.getLogger(ExperimentStatusValidator.class);
 
-    public ValidatorResult validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
+    public ValidationResults validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
         String error = "During the validation step experiment status should be CREATED, But this experiment status is : ";
+        ValidationResults validationResults = new ValidationResults();
+        validationResults.setValidationState(true);
         ValidatorResult validatorResult = new ValidatorResult();
+        List<ValidatorResult> validatorResultList = new ArrayList<ValidatorResult>();
         if (!experiment.getExperimentStatus().getExperimentState().equals(ExperimentState.CREATED)) {
             error += experiment.getExperimentStatus().getExperimentState().toString();
             log.error(error);
             validatorResult.setErrorDetails(error);
-            validatorResult.setResult(false);;
-            return validatorResult;
+            validatorResult.setResult(false);
+            validationResults.setValidationState(false);
         }
         validatorResult.setResult(true);
-        return validatorResult;
+        validatorResultList.add(validatorResult);
+        validationResults.setValidationResultList(validatorResultList);
+        return validationResults;
     }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/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
index 8847500..d3102b6 100644
--- 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
@@ -20,11 +20,14 @@
 */
 package org.apache.airavata.orchestrator.core.validator.impl;
 
+import org.airavata.appcatalog.cpi.AppCatalog;
+import org.airavata.appcatalog.cpi.AppCatalogException;
+import org.apache.aiaravata.application.catalog.data.impl.AppCatalogFactory;
+import org.apache.airavata.model.appcatalog.computeresource.BatchQueue;
+import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
+import org.apache.airavata.model.error.ValidationResults;
 import org.apache.airavata.model.error.ValidatorResult;
-import org.apache.airavata.model.workspace.experiment.Experiment;
-import org.apache.airavata.model.workspace.experiment.TaskDetails;
-import org.apache.airavata.model.workspace.experiment.WorkflowNodeDetails;
-import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
+import org.apache.airavata.model.workspace.experiment.*;
 import org.apache.airavata.orchestrator.core.validator.JobMetadataValidator;
 import org.apache.airavata.persistance.registry.jpa.impl.RegistryFactory;
 import org.apache.airavata.registry.cpi.Registry;
@@ -32,24 +35,98 @@ import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class SimpleAppDataValidator implements JobMetadataValidator {
     private final static Logger logger = LoggerFactory.getLogger(SimpleAppDataValidator.class);
 
     private Registry registry;
+    private AppCatalog appCatalog;
 
     public SimpleAppDataValidator() {
         try {
             this.registry = RegistryFactory.getDefaultRegistry();
+            this.appCatalog = AppCatalogFactory.getAppCatalog();
         } catch (RegistryException e) {
             logger.error("Unable to initialize registry", e);
+        } catch (AppCatalogException e) {
+            logger.error("Unable to initialize Application Catalog", e);
+        }
+    }
+
+    public ValidationResults validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
+        ValidationResults validationResults = new ValidationResults();
+        validationResults.setValidationState(true);
+        try {
+            List<ValidatorResult> validatorResultList = validateUserConfiguration(experiment, taskID);
+            for (ValidatorResult result : validatorResultList){
+                if (!result.isResult()){
+                    validationResults.setValidationState(false);
+                    break;
+                }
+            }
+            validationResults.setValidationResultList(validatorResultList);
+        } catch (AppCatalogException e) {
+            logger.error("Error while validating user configuration", e);
         }
+        return validationResults;
     }
 
-    public ValidatorResult validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
-        boolean result = false;
-        if (experiment.getUserConfigurationData().isAiravataAutoSchedule()) {
-            logger.error("We dont' support auto scheduling at this point, We will simply use user data as it is");
+    private List<ValidatorResult> validateUserConfiguration (Experiment experiment, TaskDetails taskDetail) throws AppCatalogException{
+        List<ValidatorResult> validatorResultList = new ArrayList<ValidatorResult>();
+        try {
+            UserConfigurationData userConfigurationData = experiment.getUserConfigurationData();
+            ComputationalResourceScheduling computationalResourceScheduling = userConfigurationData.getComputationalResourceScheduling();
+            if (userConfigurationData.isAiravataAutoSchedule()) {
+                logger.error("We dont' support auto scheduling at this point, We will simply use user data as it is");
+                ValidatorResult validatorResult = new ValidatorResult();
+                validatorResult.setResult(false);
+                validatorResultList.add(validatorResult);
+            }
+            ComputeResourceDescription computeResource = appCatalog.getComputeResource().getComputeResource(taskDetail.getTaskScheduling().getResourceHostId());
+            List<BatchQueue> batchQueues = computeResource.getBatchQueues();
+
+            if (batchQueues != null && !batchQueues.isEmpty()){
+                if (computationalResourceScheduling != null){
+                    String queueName = computationalResourceScheduling.getQueueName();
+                    int wallTimeLimit = computationalResourceScheduling.getWallTimeLimit();
+                    ValidatorResult queueNameResult = new ValidatorResult();
+
+                    queueNameResult.setResult(false);
+                    queueNameResult.setErrorDetails("Unable to find queue name from appcatalog configured queues.. Either you " +
+                            "specified a wrong queue name or you did not configure app catalog correctly...");
+                    for (BatchQueue queue : batchQueues){
+                        String configuredQname = queue.getQueueName();
+                        int maxRunTime = queue.getMaxRunTime();
+                        if (configuredQname != null && configuredQname.equals(queueName)){
+                            ValidatorResult wallTimeResult = new ValidatorResult();
+                            wallTimeResult.setResult(false);
+                            wallTimeResult.setErrorDetails("Provided walltime period exceeds max walltime configured..");
+                            queueNameResult.setResult(true);
+                            queueNameResult.setErrorDetails("");
+                            if (maxRunTime != 0 && maxRunTime > wallTimeLimit){
+                                wallTimeResult.setResult(true);
+                                wallTimeResult.setErrorDetails("");
+                            }
+                            validatorResultList.add(wallTimeResult);
+                        }
+                    }
+                    validatorResultList.add(queueNameResult);
+
+                }
+            } else {
+                // for some compute resources, you dnt need to specify queue names
+                ValidatorResult result = new ValidatorResult();
+                logger.info("There are not queues defined under the compute resource. Airavata assumes this experiment " +
+                        "does not need a queue name...");
+                result.setResult(true);
+                validatorResultList.add(result);
+            }
+        } catch (AppCatalogException e) {
+            logger.error("Error while getting information from App catalog", e);
+            throw new AppCatalogException("Error while getting information from App catalog", e);
         }
-        return new ValidatorResult(true);
+        return validatorResultList;
     }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/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 ee059a9..af76591 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
@@ -30,11 +30,13 @@ import org.apache.airavata.orchestrator.core.job.JobSubmitter;
 import org.apache.airavata.orchestrator.core.validator.JobMetadataValidator;
 import org.apache.airavata.registry.cpi.ChildDataType;
 import org.apache.airavata.registry.cpi.Registry;
+import org.apache.airavata.registry.cpi.RegistryException;
 import org.apache.airavata.registry.cpi.RegistryModelType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 
@@ -118,42 +120,52 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator{
     public ValidationResults validateExperiment(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) throws OrchestratorException,LaunchValidationException {
         org.apache.airavata.model.error.ValidationResults validationResults = new org.apache.airavata.model.error.ValidationResults();
         validationResults.setValidationState(true); // initially making it to success, if atleast one failed them simply mark it failed.
+        String errorMsg = "Validation Errors : ";
         if (this.orchestratorConfiguration.isEnableValidation()) {
             List<String> validatorClzzez = this.orchestratorContext.getOrchestratorConfiguration().getValidatorClasses();
-            ValidatorResult vResult = null;
             for (String validator : validatorClzzez) {
                 try {
                     Class<? extends JobMetadataValidator> vClass = Class.forName(validator.trim()).asSubclass(JobMetadataValidator.class);
                     JobMetadataValidator jobMetadataValidator = vClass.newInstance();
-                    vResult = jobMetadataValidator.validate(experiment, workflowNodeDetail, taskID);
-                    if (vResult.isResult()) {
+                    validationResults = jobMetadataValidator.validate(experiment, workflowNodeDetail, taskID);
+                    if (validationResults.isValidationState()) {
                         logger.info("Validation of " + validator + " is SUCCESSFUL");
                     } else {
-                        logger.error("Validation of " + validator + " is FAILED:[error]" + vResult.getErrorDetails());
-                        //todo we need to store this message to registry
+                        List<ValidatorResult> validationResultList = validationResults.getValidationResultList();
+                        for (ValidatorResult result : validationResultList){
+                            if (!result.isResult()){
+                                String validationError = result.getErrorDetails();
+                                if (validationError != null){
+                                    errorMsg += validationError + " ";
+                                }
+                            }
+                        }
+                        logger.error("Validation of " + validator + " for experiment Id " + experiment.getExperimentID() + " is FAILED:[error]. " + errorMsg);
                         validationResults.setValidationState(false);
-                        // we do not return immediately after the first failure
+                        try {
+                            ErrorDetails details = new ErrorDetails();
+                            details.setActualErrorMessage(errorMsg);
+                            details.setCorrectiveAction(CorrectiveAction.RETRY_SUBMISSION);
+                            details.setActionableGroup(ActionableGroup.GATEWAYS_ADMINS);
+                            details.setCreationTime(Calendar.getInstance().getTimeInMillis());
+                            details.setErrorCategory(ErrorCategory.APPLICATION_FAILURE);
+                            orchestratorContext.getNewRegistry().add(ChildDataType.ERROR_DETAIL, details,
+                                    taskID.getTaskID());
+                        } catch (RegistryException e) {
+                            logger.error("Error while saving error details to registry", e);
+                        }
+                        break;
                     }
                 } catch (ClassNotFoundException e) {
                     logger.error("Error loading the validation class: ", validator, e);
-                    vResult = new ValidatorResult();
-                    vResult.setResult(false);
-                    vResult.setErrorDetails("Error loading the validation class: " + e.getMessage());
                     validationResults.setValidationState(false);
                 } catch (InstantiationException e) {
                     logger.error("Error loading the validation class: ", validator, e);
-                    vResult = new ValidatorResult();
-                    vResult.setResult(false);
-                    vResult.setErrorDetails("Error loading the validation class: " + e.getMessage());
                     validationResults.setValidationState(false);
                 } catch (IllegalAccessException e) {
                     logger.error("Error loading the validation class: ", validator, e);
-                    vResult = new ValidatorResult();
-                    vResult.setResult(false);
-                    vResult.setErrorDetails("Error loading the validation class: " + e.getMessage());
                     validationResults.setValidationState(false);
                 }
-                validationResults.addToValidationResultList(vResult);
             }
         }
         if(validationResults.isValidationState()){
@@ -162,7 +174,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator{
             //atleast one validation has failed, so we throw an exception
             LaunchValidationException launchValidationException = new LaunchValidationException();
             launchValidationException.setValidationResult(validationResults);
-            launchValidationException.setErrorMessage("Validation failed refer the validationResults list for detail error");
+            launchValidationException.setErrorMessage("Validation failed refer the validationResults list for detail error. Validation errors : " + errorMsg);
             throw launchValidationException;
         }
     }

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/SecondValidator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/SecondValidator.java b/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/SecondValidator.java
index f55e15d..578aa9c 100644
--- a/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/SecondValidator.java
+++ b/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/SecondValidator.java
@@ -20,20 +20,23 @@
 */
 package org.apache.airavata.orchestrator.core.util;
 
+import org.apache.airavata.model.error.ValidationResults;
 import org.apache.airavata.model.error.ValidatorResult;
 import org.apache.airavata.model.workspace.experiment.Experiment;
 import org.apache.airavata.model.workspace.experiment.TaskDetails;
 import org.apache.airavata.model.workspace.experiment.WorkflowNodeDetails;
-import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
 import org.apache.airavata.orchestrator.core.validator.JobMetadataValidator;
 
 public class SecondValidator implements JobMetadataValidator {
-    public ValidatorResult validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
+    public ValidationResults validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
+        ValidationResults validationResults = new ValidationResults();
+        validationResults.setValidationState(true);
         if(taskID.getTaskID() == null) {
             ValidatorResult validatorResult = new ValidatorResult(false);
             validatorResult.setErrorDetails("No taskID is set, so Validation failed");
-            return validatorResult;
+            validationResults.addToValidationResultList(validatorResult);
+            validationResults.setValidationState(false);
         }
-        return new ValidatorResult(true);
+        return validationResults;
     }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/TestValidator.java
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/TestValidator.java b/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/TestValidator.java
index 5845760..dd4310c 100644
--- a/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/TestValidator.java
+++ b/modules/orchestrator/orchestrator-core/src/test/java/org/apache/airavata/orchestrator/core/util/TestValidator.java
@@ -20,6 +20,7 @@
 */
 package org.apache.airavata.orchestrator.core.util;
 
+import org.apache.airavata.model.error.ValidationResults;
 import org.apache.airavata.model.error.ValidatorResult;
 import org.apache.airavata.model.workspace.experiment.Experiment;
 import org.apache.airavata.model.workspace.experiment.TaskDetails;
@@ -32,18 +33,22 @@ import org.slf4j.LoggerFactory;
 public class TestValidator implements JobMetadataValidator {
     private final static Logger logger = LoggerFactory.getLogger(TestValidator.class);
 
-    public ValidatorResult validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
+    public ValidationResults validate(Experiment experiment, WorkflowNodeDetails workflowNodeDetail, TaskDetails taskID) {
+        ValidationResults validationResults = new ValidationResults();
+        validationResults.setValidationState(true);
         if (experiment.getProjectID() == null) {
             logger.error("Project ID is not set");
             ValidatorResult validatorResult = new ValidatorResult(false);
             validatorResult.setErrorDetails("Project ID is not set");
-            return validatorResult;
+            validationResults.addToValidationResultList(validatorResult);
+            validationResults.setValidationState(false);
         } else if (experiment.getExperimentID() == null) {
             logger.error("This experiment is wrong, no experimentID set");
-             ValidatorResult validatorResult = new ValidatorResult(false);
+            ValidatorResult validatorResult = new ValidatorResult(false);
             validatorResult.setErrorDetails("This experiment is wrong, no experimentID set");
-            return validatorResult;
+            validationResults.addToValidationResultList(validatorResult);
+            validationResults.setValidationState(false);
         }
-        return new ValidatorResult(true);
+        return validationResults;
     }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/0f8269da/modules/test-suite/multi-tenanted-airavata/pom.xml
----------------------------------------------------------------------
diff --git a/modules/test-suite/multi-tenanted-airavata/pom.xml b/modules/test-suite/multi-tenanted-airavata/pom.xml
index 7af2864..8e96e7f 100644
--- a/modules/test-suite/multi-tenanted-airavata/pom.xml
+++ b/modules/test-suite/multi-tenanted-airavata/pom.xml
@@ -79,11 +79,11 @@
             <artifactId>gson</artifactId>
             <version>2.3.1</version>
         </dependency>
-        <!--<dependency>-->
-            <!--<groupId>mysql</groupId>-->
-            <!--<artifactId>mysql-connector-java</artifactId>-->
-            <!--<version>5.1.35</version>-->
-        <!--</dependency>-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.35</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.derby</groupId>
             <artifactId>derbyclient</artifactId>