Repository: airavata Updated Branches: refs/heads/orchestratorTaskBreakdown 930a222fe -> 24b83d8f9
http://git-wip-us.apache.org/repos/asf/airavata/blob/14b7bcf9/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/utils/OrchestratorUtils.java ---------------------------------------------------------------------- diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/utils/OrchestratorUtils.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/utils/OrchestratorUtils.java index 5af7f53..9f71288 100644 --- a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/utils/OrchestratorUtils.java +++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/core/utils/OrchestratorUtils.java @@ -21,12 +21,23 @@ package org.apache.airavata.orchestrator.core.utils; import java.io.IOException; -import java.util.Arrays; +import java.util.*; import org.apache.airavata.common.exception.ApplicationSettingsException; import org.apache.airavata.common.utils.ServerSettings; +import org.apache.airavata.gfac.core.context.ProcessContext; +import org.apache.airavata.model.appcatalog.computeresource.*; +import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference; +import org.apache.airavata.model.appcatalog.gatewayprofile.DataStoragePreference; +import org.apache.airavata.model.process.ProcessModel; 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.registry.core.experiment.catalog.impl.RegistryFactory; +import org.apache.airavata.registry.cpi.AppCatalog; +import org.apache.airavata.registry.cpi.AppCatalogException; +import org.apache.airavata.registry.cpi.GwyResourceProfile; +import org.apache.airavata.registry.cpi.RegistryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,4 +59,146 @@ public class OrchestratorUtils { } return orchestratorConfiguration; } + + public static JobSubmissionProtocol getPreferredJobSubmissionProtocol(OrchestratorContext context, ProcessModel model, String gatewayId) throws RegistryException { + try { + GwyResourceProfile gatewayProfile = context.getRegistry().getAppCatalog().getGatewayProfile(); + String resourceHostId = model.getComputeResourceId(); + ComputeResourcePreference preference = gatewayProfile.getComputeResourcePreference(gatewayId + , resourceHostId); + return preference.getPreferredJobSubmissionProtocol(); + } catch (AppCatalogException e) { + logger.error("Error occurred while initializing app catalog", e); + throw new RegistryException("Error occurred while initializing app catalog", e); + } + } + + public static ComputeResourcePreference getComputeResourcePreference(OrchestratorContext context, ProcessModel processModel, String gatewayId) throws RegistryException { + try { + GwyResourceProfile gatewayProfile = context.getRegistry().getAppCatalog().getGatewayProfile(); + String resourceHostId = processModel.getComputeResourceId(); + return gatewayProfile.getComputeResourcePreference(gatewayId, resourceHostId); + } catch (AppCatalogException e) { + logger.error("Error occurred while initializing app catalog", e); + throw new RegistryException("Error occurred while initializing app catalog", e); + } + } + + public static DataStoragePreference getDateStoragePreference(OrchestratorContext context, ProcessModel processModel, String gatewayId) throws RegistryException { + try { + GwyResourceProfile gatewayProfile = context.getRegistry().getAppCatalog().getGatewayProfile(); + String resourceHostId = processModel.getComputeResourceId(); + return gatewayProfile.getDataStoragePreference(gatewayId, resourceHostId); + } catch (AppCatalogException e) { + logger.error("Error occurred while initializing app catalog", e); + throw new RegistryException("Error occurred while initializing app catalog", e); + } + } + + public static JobSubmissionInterface getPreferredJobSubmissionInterface(OrchestratorContext context, ProcessModel processModel, String gatewayId) throws RegistryException { + try { + String resourceHostId = processModel.getComputeResourceId(); + ComputeResourcePreference resourcePreference = getComputeResourcePreference(context, processModel, gatewayId); + JobSubmissionProtocol preferredJobSubmissionProtocol = resourcePreference.getPreferredJobSubmissionProtocol(); + ComputeResourceDescription resourceDescription = context.getRegistry().getAppCatalog().getComputeResource().getComputeResource(resourceHostId); + List<JobSubmissionInterface> jobSubmissionInterfaces = resourceDescription.getJobSubmissionInterfaces(); + Map<JobSubmissionProtocol, List<JobSubmissionInterface>> orderedInterfaces = new HashMap<>(); + List<JobSubmissionInterface> interfaces = new ArrayList<>(); + if (jobSubmissionInterfaces != null && !jobSubmissionInterfaces.isEmpty()) { + for (JobSubmissionInterface submissionInterface : jobSubmissionInterfaces){ + + if (preferredJobSubmissionProtocol != null){ + if (preferredJobSubmissionProtocol.toString().equals(submissionInterface.getJobSubmissionProtocol().toString())){ + if (orderedInterfaces.containsKey(submissionInterface.getJobSubmissionProtocol())){ + List<JobSubmissionInterface> interfaceList = orderedInterfaces.get(submissionInterface.getJobSubmissionProtocol()); + interfaceList.add(submissionInterface); + }else { + interfaces.add(submissionInterface); + orderedInterfaces.put(submissionInterface.getJobSubmissionProtocol(), interfaces); + } + } + }else { + Collections.sort(jobSubmissionInterfaces, new Comparator<JobSubmissionInterface>() { + @Override + public int compare(JobSubmissionInterface jobSubmissionInterface, JobSubmissionInterface jobSubmissionInterface2) { + return jobSubmissionInterface.getPriorityOrder() - jobSubmissionInterface2.getPriorityOrder(); + } + }); + } + } + interfaces = orderedInterfaces.get(preferredJobSubmissionProtocol); + Collections.sort(interfaces, new Comparator<JobSubmissionInterface>() { + @Override + public int compare(JobSubmissionInterface jobSubmissionInterface, JobSubmissionInterface jobSubmissionInterface2) { + return jobSubmissionInterface.getPriorityOrder() - jobSubmissionInterface2.getPriorityOrder(); + } + }); + } else { + throw new RegistryException("Compute resource should have at least one job submission interface defined..."); + } + return interfaces.get(0); + } catch (AppCatalogException e) { + throw new RegistryException("Error occurred while retrieving data from app catalog", e); + } + } + + public static SecurityProtocol getSecurityProtocol(OrchestratorContext context, ProcessModel processModel, String gatewayId) throws RegistryException{ + try { + JobSubmissionProtocol submissionProtocol = getPreferredJobSubmissionProtocol(context, processModel, gatewayId); + JobSubmissionInterface jobSubmissionInterface = getPreferredJobSubmissionInterface(context, processModel, gatewayId); + if (submissionProtocol == JobSubmissionProtocol.SSH ) { + SSHJobSubmission sshJobSubmission = getSSHJobSubmission(context, jobSubmissionInterface.getJobSubmissionInterfaceId()); + if (sshJobSubmission != null) { + return sshJobSubmission.getSecurityProtocol(); + } + } else if (submissionProtocol == JobSubmissionProtocol.LOCAL) { + LOCALSubmission localJobSubmission = getLocalJobSubmission(context, jobSubmissionInterface.getJobSubmissionInterfaceId()); + if (localJobSubmission != null) { + return localJobSubmission.getSecurityProtocol(); + } + } else if (submissionProtocol == JobSubmissionProtocol.SSH_FORK){ + SSHJobSubmission sshJobSubmission = getSSHJobSubmission(context, jobSubmissionInterface.getJobSubmissionInterfaceId()); + if (sshJobSubmission != null) { + return sshJobSubmission.getSecurityProtocol(); + } + } + } catch (RegistryException e) { + logger.error("Error occurred while retrieving security protocol", e); + } + return null; + } + + public static LOCALSubmission getLocalJobSubmission(OrchestratorContext context, String submissionId) throws RegistryException { + try { + AppCatalog appCatalog = context.getRegistry().getAppCatalog(); + return appCatalog.getComputeResource().getLocalJobSubmission(submissionId); + } catch (Exception e) { + String errorMsg = "Error while retrieving local job submission with submission id : " + submissionId; + logger.error(errorMsg, e); + throw new RegistryException(errorMsg, e); + } + } + + public static UnicoreJobSubmission getUnicoreJobSubmission(OrchestratorContext context, String submissionId) throws RegistryException { + try { + AppCatalog appCatalog = context.getRegistry().getAppCatalog(); + return appCatalog.getComputeResource().getUNICOREJobSubmission(submissionId); + } catch (Exception e) { + String errorMsg = "Error while retrieving UNICORE job submission with submission id : " + submissionId; + logger.error(errorMsg, e); + throw new RegistryException(errorMsg, e); + } + } + + public static SSHJobSubmission getSSHJobSubmission(OrchestratorContext context, String submissionId) throws RegistryException { + try { + AppCatalog appCatalog = context.getRegistry().getAppCatalog(); + return appCatalog.getComputeResource().getSSHJobSubmission(submissionId); + } catch (Exception e) { + String errorMsg = "Error while retrieving SSH job submission with submission id : " + submissionId; + logger.error(errorMsg, e); + throw new RegistryException(errorMsg, e); + } + } + } http://git-wip-us.apache.org/repos/asf/airavata/blob/14b7bcf9/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 c0fcd70..b892a00 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 @@ -20,8 +20,21 @@ */ package org.apache.airavata.orchestrator.cpi.impl; -import org.apache.airavata.model.appcatalog.computeresource.BatchQueue; -import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription; +import org.apache.airavata.common.utils.AiravataUtils; +import org.apache.airavata.common.utils.ThriftUtils; +import org.apache.airavata.gfac.core.GFacException; +import org.apache.airavata.gfac.core.GFacUtils; +import org.apache.airavata.gfac.core.cluster.ServerInfo; +import org.apache.airavata.gfac.core.context.ProcessContext; +import org.apache.airavata.gfac.core.context.TaskContext; +import org.apache.airavata.gfac.core.task.Task; +import org.apache.airavata.gfac.core.task.TaskException; +import org.apache.airavata.model.appcatalog.computeresource.*; +import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference; +import org.apache.airavata.model.appcatalog.gatewayprofile.DataStoragePreference; +import org.apache.airavata.model.application.io.DataType; +import org.apache.airavata.model.application.io.InputDataObjectType; +import org.apache.airavata.model.application.io.OutputDataObjectType; import org.apache.airavata.model.commons.ErrorModel; import org.apache.airavata.model.error.LaunchValidationException; import org.apache.airavata.model.error.ValidationResults; @@ -29,20 +42,27 @@ import org.apache.airavata.model.error.ValidatorResult; import org.apache.airavata.model.process.ProcessModel; import org.apache.airavata.model.experiment.*; import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel; -import org.apache.airavata.model.task.TaskModel; +import org.apache.airavata.model.status.ProcessState; +import org.apache.airavata.model.status.ProcessStatus; +import org.apache.airavata.model.status.TaskState; +import org.apache.airavata.model.status.TaskStatus; +import org.apache.airavata.model.task.*; import org.apache.airavata.model.util.ExperimentModelUtil; import org.apache.airavata.orchestrator.core.exception.OrchestratorException; import org.apache.airavata.orchestrator.core.impl.GFACPassiveJobSubmitter; 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.cpi.*; import org.apache.airavata.registry.cpi.utils.Constants; +import org.apache.thrift.TException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; import java.util.concurrent.ExecutorService; public class SimpleOrchestratorImpl extends AbstractOrchestrator{ @@ -234,7 +254,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator{ } - public List<ProcessModel> createProcesses (String experimentId) throws OrchestratorException { + public List<ProcessModel> createProcesses (String experimentId, String gatewayId) throws OrchestratorException { List<ProcessModel> processModels = new ArrayList<ProcessModel>(); try { Registry registry = orchestratorContext.getRegistry(); @@ -257,13 +277,10 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator{ return processModels; } - public List<TaskModel> createTasks (String experimentId, String processId) throws OrchestratorException { - List<TaskModel> taskModels = new ArrayList<TaskModel>(); + public void createAndSaveTasks (String gatewayId, ExperimentModel experimentModel, ProcessModel processModel) throws OrchestratorException { try { ExperimentCatalog experimentCatalog = orchestratorContext.getRegistry().getExperimentCatalog(); AppCatalog appCatalog = orchestratorContext.getRegistry().getAppCatalog(); - ExperimentModel experimentModel = (ExperimentModel)experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT, experimentId); - ProcessModel processModel = (ProcessModel)experimentCatalog.get(ExperimentCatalogModelType.PROCESS, processId); boolean autoSchedule = experimentModel.getUserConfigurationData().isAiravataAutoSchedule(); ComputationalResourceSchedulingModel resourceSchedule = processModel.getResourceSchedule(); String userGivenQueueName = resourceSchedule.getQueueName(); @@ -273,21 +290,123 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator{ throw new OrchestratorException("Compute Resource Id cannot be null at this point"); } ComputeResourceDescription computeResource = appCatalog.getComputeResource().getComputeResource(resourceHostId); - List<BatchQueue> definedBatchQueues = computeResource.getBatchQueues(); - for (BatchQueue batchQueue : definedBatchQueues){ - if (batchQueue.getQueueName().equals(userGivenQueueName)){ - int maxRunTime = batchQueue.getMaxRunTime(); - if (maxRunTime < userGivenWallTime){ - // need to create more job submissions + + createAndSaveEnvSetupTask(gatewayId, processModel, experimentCatalog); + createAndSaveDataStagingTasks(processModel); + if (autoSchedule){ + List<BatchQueue> definedBatchQueues = computeResource.getBatchQueues(); + for (BatchQueue batchQueue : definedBatchQueues){ + if (batchQueue.getQueueName().equals(userGivenQueueName)){ + int maxRunTime = batchQueue.getMaxRunTime(); + if (maxRunTime < userGivenWallTime){ + // need to create more job submissions + int i = (int)maxRunTime / userGivenWallTime; + for (int k=0; k < i; i++){ + createAndSaveJobSubmissionTask(processModel); + } + }else { + createAndSaveJobSubmissionTask(processModel); + } } } } - - } catch (Exception e) { throw new OrchestratorException("Error during creating process"); } - return taskModels; } + private void createAndSaveEnvSetupTask(String gatewayId, ProcessModel processModel, ExperimentCatalog experimentCatalog) throws RegistryException, TException { + TaskModel envSetupTask = new TaskModel(); + envSetupTask.setTaskType(TaskTypes.ENV_SETUP); + envSetupTask.setTaskStatus(new TaskStatus(TaskState.CREATED)); + envSetupTask.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime()); + envSetupTask.setParentProcessId(processModel.getProcessId()); + EnvironmentSetupTaskModel envSetupSubModel = new EnvironmentSetupTaskModel(); + envSetupSubModel.setProtocol(OrchestratorUtils.getSecurityProtocol(orchestratorContext, processModel, gatewayId)); + ComputeResourcePreference computeResourcePreference = OrchestratorUtils.getComputeResourcePreference(orchestratorContext, processModel, gatewayId); + String scratchLocation = computeResourcePreference.getScratchLocation(); + String workingDir = scratchLocation + File.separator + processModel.getProcessId(); + envSetupSubModel.setLocation(workingDir); + byte[] envSetupSub = ThriftUtils.serializeThriftObject(envSetupSubModel); + envSetupTask.setSubTaskModel(envSetupSub); + String envSetupTaskId = (String)experimentCatalog.add(ExpCatChildDataType.TASK, envSetupTask, processModel.getProcessId()); + envSetupTask.setTaskId(envSetupTaskId); + } + + public void createAndSaveDataStagingTasks (ProcessModel processModel) throws RegistryException{ + List<InputDataObjectType> processInputs = processModel.getProcessInputs(); + sortByInputOrder(processInputs); + if (processInputs != null) { + for (InputDataObjectType processInput : processInputs) { + DataType type = processInput.getType(); + switch (type) { + case STDERR: + break; + case STDOUT: + break; + case URI: + try { + TaskModel inputDataStagingTask = getInputDataStagingTask(processModel, processInput); + orchestratorContext.getRegistry().getExperimentCatalog().add(ExpCatChildDataType.TASK, inputDataStagingTask, + processModel.getProcessId()); + } catch (TException e) { + throw new RegistryException("Error while serializing data staging sub task model"); + } + break; + default: + // nothing to do + break; + } + } + } + } + + private void createAndSaveJobSubmissionTask(ProcessModel processModel) throws TException, RegistryException { + TaskModel taskModel = new TaskModel(); + taskModel.setParentProcessId(processModel.getProcessId()); + taskModel.setCreationTime(new Date().getTime()); + taskModel.setLastUpdateTime(taskModel.getCreationTime()); + TaskStatus taskStatus = new TaskStatus(TaskState.CREATED); + taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime()); + taskModel.setTaskStatus(taskStatus); + taskModel.setTaskType(TaskTypes.JOB_SUBMISSION); + JobSubmissionTaskModel submissionSubTask = new JobSubmissionTaskModel(); + submissionSubTask.setMonitorMode(MonitorMode.JOB_EMAIL_NOTIFICATION_MONITOR); + byte[] bytes = ThriftUtils.serializeThriftObject(submissionSubTask); + taskModel.setSubTaskModel(bytes); + orchestratorContext.getRegistry().getExperimentCatalog().add(ExpCatChildDataType.TASK, taskModel, + processModel.getProcessId()); + } + + private void sortByInputOrder(List<InputDataObjectType> processInputs) { + Collections.sort(processInputs, new Comparator<InputDataObjectType>() { + @Override + public int compare(InputDataObjectType inputDT_1, InputDataObjectType inputDT_2) { + return inputDT_1.getInputOrder() - inputDT_2.getInputOrder(); + } + }); + } + + private TaskModel getInputDataStagingTask(ProcessModel processModel, InputDataObjectType processInput) throws RegistryException, TException { + // create new task model for this task + TaskModel taskModel = new TaskModel(); + taskModel.setParentProcessId(processModel.getProcessId()); + taskModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime()); + taskModel.setLastUpdateTime(taskModel.getCreationTime()); + TaskStatus taskStatus = new TaskStatus(TaskState.CREATED); + taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime()); + taskModel.setTaskStatus(taskStatus); + taskModel.setTaskType(TaskTypes.DATA_STAGING); + // create data staging sub task model + DataStagingTaskModel submodel = new DataStagingTaskModel(); + submodel.setType(DataStageType.INPUT); + submodel.setSource(processInput.getValue()); + // We don't know destination location at this time, data staging task will set this. + // because destination is required field we set dummy destination + submodel.setDestination("dummy://temp/file/location"); + taskModel.setSubTaskModel(ThriftUtils.serializeThriftObject(submodel)); + return taskModel; + } + + } http://git-wip-us.apache.org/repos/asf/airavata/blob/14b7bcf9/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java ---------------------------------------------------------------------- diff --git a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java index 7d158fd..4eb4736 100644 --- a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java +++ b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java @@ -137,8 +137,12 @@ public class OrchestratorServerHandler implements OrchestratorService.Iface { public boolean launchExperiment(String experimentId, String gatewayId) throws TException { ExperimentModel experiment = null; try { - List<ProcessModel> processes = orchestrator.createProcesses(experimentId); + + List<ProcessModel> processes = orchestrator.createProcesses(experimentId, gatewayId); experiment = (ExperimentModel) experimentCatalog.get(ExperimentCatalogModelType.EXPERIMENT, experimentId); + for (ProcessModel processModel : processes){ + orchestrator.createAndSaveTasks(gatewayId, experiment, processModel); + } if (experiment == null) { log.error(experimentId, "Error retrieving the Experiment by the given experimentID: {} ", experimentId); return false; @@ -268,7 +272,7 @@ public class OrchestratorServerHandler implements OrchestratorService.Iface { } @Override - public boolean launchProcess(String processId, String airavataCredStoreToken) throws TException { + public boolean launchProcess(String processId, String airavataCredStoreToken, String gatewayId) throws TException { try { ProcessModel processModel = (ProcessModel) experimentCatalog.get( ExperimentCatalogModelType.PROCESS, processId); @@ -392,7 +396,7 @@ public class OrchestratorServerHandler implements OrchestratorService.Iface { try { List<String> processIds = experimentCatalog.getIds(ExperimentCatalogModelType.PROCESS, AbstractExpCatResource.ProcessConstants.EXPERIMENT_ID, experimentId); for (String processId : processIds) { - launchProcess(processId, airavataCredStoreToken); + launchProcess(processId, airavataCredStoreToken, gatewayId); } } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/airavata/blob/14b7bcf9/thrift-interface-descriptions/airavata-api/compute_resource_model.thrift ---------------------------------------------------------------------- diff --git a/thrift-interface-descriptions/airavata-api/compute_resource_model.thrift b/thrift-interface-descriptions/airavata-api/compute_resource_model.thrift index 163ff97..6517fe8 100644 --- a/thrift-interface-descriptions/airavata-api/compute_resource_model.thrift +++ b/thrift-interface-descriptions/airavata-api/compute_resource_model.thrift @@ -173,7 +173,8 @@ enum SecurityProtocol { SSH_KEYS, GSI, KERBEROS, - OAUTH + OAUTH, + LOCAL } /** @@ -293,7 +294,8 @@ struct UnicoreDataMovement { */ struct LOCALSubmission { 1: required string jobSubmissionInterfaceId = airavata_commons.DEFAULT_ID, - 2: required ResourceJobManager resourceJobManager + 2: required SecurityProtocol securityProtocol, + 3: required ResourceJobManager resourceJobManager } /** http://git-wip-us.apache.org/repos/asf/airavata/blob/14b7bcf9/thrift-interface-descriptions/orchestrator-cpi/orchestrator.cpi.service.thrift ---------------------------------------------------------------------- diff --git a/thrift-interface-descriptions/orchestrator-cpi/orchestrator.cpi.service.thrift b/thrift-interface-descriptions/orchestrator-cpi/orchestrator.cpi.service.thrift index 94ccec9..f775306 100644 --- a/thrift-interface-descriptions/orchestrator-cpi/orchestrator.cpi.service.thrift +++ b/thrift-interface-descriptions/orchestrator-cpi/orchestrator.cpi.service.thrift @@ -55,7 +55,7 @@ service OrchestratorService { * @return sucess/failure * **/ - bool launchProcess (1: required string processId, 2: required string airavataCredStoreToken), + bool launchProcess (1: required string processId, 2: required string airavataCredStoreToken, 3: required string gatewayId), /** *
