You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by di...@apache.org on 2018/10/29 19:34:48 UTC

[airavata] 02/02: Improving parser framework and fixing bugs

This is an automated email from the ASF dual-hosted git repository.

dimuthuupe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit e1d65eb53930e4250fb9d754fde65d5596440f88
Author: Dimuthu Wannipurage <di...@datasprouts.com>
AuthorDate: Mon Oct 29 15:34:36 2018 -0400

    Improving parser framework and fixing bugs
---
 .../helix/impl/task/parsing/DataParsingTask.java   | 138 ++++++++++++++-------
 .../helix/impl/workflow/ParserWorkflowManager.java |  43 +++++--
 .../helix/impl/workflow/WorkflowManager.java       |   6 +-
 .../api/service/handler/RegistryServerHandler.java |   8 +-
 4 files changed, 140 insertions(+), 55 deletions(-)

diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
index 9836bda..37a1b56 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
@@ -42,14 +42,13 @@ import org.apache.airavata.helix.task.api.annotation.TaskDef;
 import org.apache.airavata.helix.task.api.annotation.TaskParam;
 import org.apache.airavata.helix.task.api.support.AdaptorSupport;
 import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
 import org.apache.airavata.model.appcatalog.parser.ParserInfo;
 import org.apache.airavata.model.appcatalog.parser.ParserInput;
 import org.apache.airavata.model.appcatalog.parser.ParserOutput;
-import org.apache.airavata.model.credential.store.CredentialSummary;
-import org.apache.airavata.model.credential.store.SummaryType;
+import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
 import org.apache.airavata.model.data.movement.DataMovementProtocol;
-import org.apache.airavata.model.data.replica.DataProductModel;
-import org.apache.airavata.model.data.replica.DataReplicaLocationModel;
+import org.apache.airavata.model.data.replica.*;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.registry.api.client.RegistryServiceClientFactory;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
@@ -60,12 +59,9 @@ import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-import java.util.Iterator;
+import java.net.URI;
 import java.util.List;
 import java.util.Optional;
 
@@ -91,6 +87,12 @@ public class DataParsingTask extends AbstractTask {
     @TaskParam(name = "Gateway ID")
     private String gatewayId;
 
+    @TaskParam(name = "Group Resource Profile Id")
+    private String groupResourceProfileId;
+
+    @TaskParam(name = "Local data dir")
+    private String localDataDir;
+
     @Override
     public TaskResult onRun(TaskHelper helper) {
         logger.info("Starting data parsing task " + getTaskId());
@@ -112,7 +114,14 @@ public class DataParsingTask extends AbstractTask {
                 if (filteredInputOptional.isPresent()) {
 
                     ParsingTaskInput parsingTaskInput = filteredInputOptional.get();
-                    String inputDataProductUri = getContextVariable(parsingTaskInput.getContextVariableName());
+                    String inputDataProductUri = parsingTaskInput.getValue() != null ? parsingTaskInput.getValue() : getContextVariable(parsingTaskInput.getContextVariableName());
+
+                    if (inputDataProductUri == null || inputDataProductUri.isEmpty()) {
+                        logger.error("Data product uri could not be null or empty for input " + parsingTaskInput.getId()
+                                + " with name " + parserInput.getName());
+                        throw new TaskOnFailException("Data product uri could not be null or empty for input "
+                                + parsingTaskInput.getId() + " with name " + parserInput.getName(), true, null);
+                    }
                     DataProductModel inputDataProduct = getRegistryServiceClient().getDataProduct(inputDataProductUri);
                     List<DataReplicaLocationModel> replicaLocations = inputDataProduct.getReplicaLocations();
 
@@ -120,7 +129,7 @@ public class DataParsingTask extends AbstractTask {
 
                     for (DataReplicaLocationModel replicaLocationModel : replicaLocations) {
                         String storageResourceId = replicaLocationModel.getStorageResourceId();
-                        String remoteFilePath = replicaLocationModel.getFilePath();
+                        String remoteFilePath = new URI(replicaLocationModel.getFilePath()).getPath();
                         String localFilePath = localInputDir + (localInputDir.endsWith(File.separator)? "" : File.separator)
                                 + parserInput.getName();
 
@@ -160,7 +169,7 @@ public class DataParsingTask extends AbstractTask {
                     String remoteFilePath = "parsers" + File.separator + getTaskId() + File.separator + "outputs" + File.separator + parserOutput.getName();
 
                     if (new File(localFilePath).exists()) {
-                        uploadFileToStorageResource(parsingTaskOutput.getStorageResourceId(), remoteFilePath, localFilePath, helper.getAdaptorSupport());
+                        uploadFileToStorageResource(parsingTaskOutput, remoteFilePath, localFilePath, helper.getAdaptorSupport());
                     } else if (parserOutput.isRequiredFile()) {
                         logger.error("Expected output file " + localFilePath + " can not be found");
                         throw new TaskOnFailException("Expected output file " + localFilePath + " can not be found", false, null);
@@ -200,47 +209,50 @@ public class DataParsingTask extends AbstractTask {
     }
 
     private void runContainer(ParserInfo parserInfo, String containerId, String localInputDir, String localOutputDir) {
-        DefaultDockerClientConfig.Builder config = DefaultDockerClientConfig.createDefaultConfigBuilder()
-                .withDockerHost("tcp://localhost:2376");
+        DefaultDockerClientConfig.Builder config = DefaultDockerClientConfig.createDefaultConfigBuilder();
 
         DockerClient dockerClient = DockerClientBuilder.getInstance(config).build();
-        CreateContainerResponse containerResponse = dockerClient.createContainerCmd(parserInfo.getImageName()).withCmd(parserInfo.getExecutionCommand()).withName(containerId)
+
+        CreateContainerResponse containerResponse = dockerClient.createContainerCmd(parserInfo.getImageName()).withCmd("/bin/sh", "-c", parserInfo.getExecutionCommand()).withName(containerId)
                 .withBinds(Bind.parse(localInputDir + ":" + parserInfo.getInputDirPath()),
-                        Bind.parse(localOutputDir + ":" + parserInfo.getOutputDirPath())).withTty(true).withAttachStdin(true)
-                .exec();
+                        Bind.parse(localOutputDir + ":" + parserInfo.getOutputDirPath())).withTty(true).exec();
+
+
+        logger.info("Created the container with id " + containerResponse.getId());
+
         if (containerResponse.getWarnings() != null) {
             StringBuilder warningStr = new StringBuilder();
             for (String w : containerResponse.getWarnings()) {
                 warningStr.append(w).append(",");
             }
-            logger.warn("Container warnings : " + warningStr);
+            logger.warn("Container " + containerResponse.getId() + " warnings : " + warningStr);
+        } else {
+            logger.info("Starting container with id " + containerResponse.getId());
+            dockerClient.startContainerCmd(containerResponse.getId()).exec();
+
         }
+
+        dockerClient.removeContainerCmd(containerResponse.getId()).exec();
+        logger.info("Successfully removed container with id " + containerResponse.getId());
     }
 
     private StorageResourceAdaptor getStorageResourceAdaptor(String storageResourceId, AdaptorSupport adaptorSupport) throws TaskOnFailException, TException, AgentException {
-        List<CredentialSummary> allCredentialSummaryForGateway = getCredentialServiceClient()
-                .getAllCredentialSummaryForGateway(SummaryType.SSH, gatewayId);
-
-        if (allCredentialSummaryForGateway == null || allCredentialSummaryForGateway.isEmpty()) {
-            logger.error("Could not find SSH summary for gateway " + gatewayId);
-            throw new TaskOnFailException("Could not find SSH summary for gateway " + gatewayId, false, null);
-        }
 
-        StoragePreference gatewayStoragePreference = getRegistryServiceClient()
-                .getGatewayStoragePreference(gatewayId, storageResourceId);
+        GroupResourceProfile groupResourceProfile = getRegistryServiceClient().getGroupResourceProfile(groupResourceProfileId);
+        StoragePreference gatewayStoragePreference = getRegistryServiceClient().getGatewayStoragePreference(gatewayId, storageResourceId);
 
+        String token = gatewayStoragePreference.getResourceSpecificCredentialStoreToken();
+        if (token == null || token.isEmpty()) {
+            token = groupResourceProfile.getDefaultCredentialStoreToken();
+        }
         if (gatewayStoragePreference == null) {
             logger.error("Could not find a gateway storage preference for stogate " + storageResourceId + " gateway id " + gatewayId);
             throw new TaskOnFailException("Could not find a gateway storage preference for stogate " + storageResourceId + " gateway id " + gatewayId, false, null);
         }
 
-        StorageResourceAdaptor storageResourceAdaptor = adaptorSupport.fetchStorageAdaptor(gatewayId,
-                storageResourceId, DataMovementProtocol.SCP,
-                Optional.ofNullable(gatewayStoragePreference.getResourceSpecificCredentialStoreToken())
-                        .orElse(allCredentialSummaryForGateway.get(0).getToken()),
+        return adaptorSupport.fetchStorageAdaptor(gatewayId, storageResourceId, DataMovementProtocol.SCP, token,
                 gatewayStoragePreference.getLoginUserName());
 
-        return storageResourceAdaptor;
     }
 
     private boolean downloadFileFromStorageResource(String storageResourceId, String remoteFilePath, String localFilePath, AdaptorSupport adaptorSupport) {
@@ -257,26 +269,53 @@ public class DataParsingTask extends AbstractTask {
         }
     }
 
-    private boolean uploadFileToStorageResource(String storageResourceId, String remoteFilePath, String localFilePath, AdaptorSupport adaptorSupport) {
-        logger.info("Uploading from local path " + localFilePath + " to remote path " + remoteFilePath + " of storage resource " + storageResourceId);
+    private void uploadFileToStorageResource(ParsingTaskOutput parsingTaskOutput, String remoteFilePath, String localFilePath, AdaptorSupport adaptorSupport) throws TaskOnFailException {
+        logger.info("Uploading from local path " + localFilePath + " to remote path " + remoteFilePath + " of storage resource " + parsingTaskOutput.getStorageResourceId());
         try {
-            StoragePreference gatewayStoragePreference = getRegistryServiceClient().getGatewayStoragePreference(gatewayId, storageResourceId);
+            StoragePreference gatewayStoragePreference = getRegistryServiceClient().getGatewayStoragePreference(gatewayId, parsingTaskOutput.getStorageResourceId());
+            StorageResourceDescription storageResource = getRegistryServiceClient().getStorageResource(parsingTaskOutput.getStorageResourceId());
+
             String remoteFileRoot = gatewayStoragePreference.getFileSystemRootLocation();
             remoteFilePath = remoteFileRoot + (remoteFileRoot.endsWith(File.separator) ? "" : File.separator) + remoteFilePath;
-            StorageResourceAdaptor storageResourceAdaptor = getStorageResourceAdaptor(storageResourceId, adaptorSupport);
+            StorageResourceAdaptor storageResourceAdaptor = getStorageResourceAdaptor(parsingTaskOutput.getStorageResourceId(), adaptorSupport);
             storageResourceAdaptor.createDirectory(new File(remoteFilePath).getParent(), true);
             storageResourceAdaptor.uploadFile(localFilePath, remoteFilePath);
-            return true;
+
+            logger.info("Uploading completed. Registering data product for path " + remoteFilePath);
+
+            DataProductModel dataProductModel = new DataProductModel();
+            dataProductModel.setGatewayId(getGatewayId());
+            dataProductModel.setOwnerName("ParserTask");
+            dataProductModel.setProductName(parsingTaskOutput.getId());
+            dataProductModel.setDataProductType(DataProductType.FILE);
+
+            DataReplicaLocationModel replicaLocationModel = new DataReplicaLocationModel();
+            replicaLocationModel.setStorageResourceId(parsingTaskOutput.getStorageResourceId());
+            replicaLocationModel.setReplicaName("Parsing task output " + parsingTaskOutput.getId());
+            replicaLocationModel.setReplicaLocationCategory(ReplicaLocationCategory.GATEWAY_DATA_STORE);
+            replicaLocationModel.setReplicaPersistentType(ReplicaPersistentType.TRANSIENT);
+
+            URI destinationURI = new URI("file", gatewayStoragePreference.getLoginUserName(),
+                    storageResource.getHostName(), 22, remoteFilePath, null, null);
+
+            replicaLocationModel.setFilePath(destinationURI.toString());
+            dataProductModel.addToReplicaLocations(replicaLocationModel);
+
+            String productUri = getRegistryServiceClient().registerDataProduct(dataProductModel);
+
+            logger.info("Data product is " + productUri + " for path " + remoteFilePath);
+
+            setContextVariable(parsingTaskOutput.getContextVariableName(), productUri);
         } catch (Exception e) {
             logger.error("Failed to upload from local path " + localFilePath + " to remote path " + remoteFilePath +
-                    " of storage resource " + storageResourceId, e);
-            return false;
+                    " of storage resource " + parsingTaskOutput.getStorageResourceId(), e);
+            throw new TaskOnFailException("Failed to upload from local path " + localFilePath + " to remote path " + remoteFilePath +
+                    " of storage resource " + parsingTaskOutput.getStorageResourceId(), false, e);
         }
     }
 
     private String createLocalInputDir(String containerName) throws TaskOnFailException {
-        String localInpDir = ServerSettings.getLocalDataLocation();
-        localInpDir = (localInpDir.endsWith(File.separator) ? localInpDir : localInpDir + File.separator) +
+        String localInpDir = (localDataDir.endsWith(File.separator) ? localDataDir : localDataDir + File.separator) +
                 "parsers" + File.separator + containerName + File.separator + "data" + File.separator + "input" + File.separator;
         try {
             FileUtils.forceMkdir(new File(localInpDir));
@@ -288,8 +327,7 @@ public class DataParsingTask extends AbstractTask {
     }
 
     private String createLocalOutputDir(String containerName) throws TaskOnFailException {
-        String localOutDir = ServerSettings.getLocalDataLocation();
-        localOutDir = (localOutDir.endsWith(File.separator) ? localOutDir : localOutDir + File.separator) +
+        String localOutDir = (localDataDir.endsWith(File.separator) ? localDataDir : localDataDir + File.separator) +
                 "parsers" + File.separator + containerName + File.separator + "data" + File.separator + "output" + File.separator;
         try {
             FileUtils.forceMkdir(new File(localOutDir));
@@ -352,4 +390,20 @@ public class DataParsingTask extends AbstractTask {
     public void setGatewayId(String gatewayId) {
         this.gatewayId = gatewayId;
     }
+
+    public String getGroupResourceProfileId() {
+        return groupResourceProfileId;
+    }
+
+    public void setGroupResourceProfileId(String groupResourceProfileId) {
+        this.groupResourceProfileId = groupResourceProfileId;
+    }
+
+    public String getLocalDataDir() {
+        return localDataDir;
+    }
+
+    public void setLocalDataDir(String localDataDir) {
+        this.localDataDir = localDataDir;
+    }
 }
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
index 18ea22c..86517bf 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
@@ -35,7 +35,7 @@ import org.apache.airavata.model.appcatalog.parser.DagElement;
 import org.apache.airavata.model.appcatalog.parser.ParserInfo;
 import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
 import org.apache.airavata.model.appcatalog.parser.ParsingTemplateInput;
-import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.application.io.OutputDataObjectType;
 import org.apache.airavata.model.experiment.ExperimentModel;
 import org.apache.airavata.model.process.ProcessModel;
 import org.apache.airavata.registry.api.RegistryService;
@@ -57,7 +57,7 @@ public class ParserWorkflowManager extends WorkflowManager {
 
     private final static Logger logger = LoggerFactory.getLogger(ParserWorkflowManager.class);
 
-    private String parserStorageResourceId = "";
+    private String parserStorageResourceId = "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e";
 
     public ParserWorkflowManager() throws ApplicationSettingsException {
         super(ServerSettings.getSetting("parser.workflow.manager.name"));
@@ -66,7 +66,7 @@ public class ParserWorkflowManager extends WorkflowManager {
     public static void main(String[] args) throws Exception {
         ParserWorkflowManager manager = new ParserWorkflowManager();
         manager.init();
-        manager.runConsumer();
+        manager.test();
     }
 
     private void init() throws Exception {
@@ -177,11 +177,19 @@ public class ParserWorkflowManager extends WorkflowManager {
         }
     }
 
-    private DataParsingTask createParentTask(ParserInfo parserInfo, ProcessCompletionMessage completionMessage, List<ParsingTemplateInput> templateInputs, RegistryService.Client registryClient) {
+    private DataParsingTask createParentTask(ParserInfo parserInfo, ProcessCompletionMessage completionMessage,
+                                             List<ParsingTemplateInput> templateInputs, RegistryService.Client registryClient) throws Exception {
         DataParsingTask parsingTask = new DataParsingTask();
-        parsingTask.setTaskId(completionMessage.getExperimentId() + "-" + parserInfo.getId() + "-" + UUID.randomUUID().toString());
+        parsingTask.setTaskId(normalizeTaskId(completionMessage.getExperimentId() + "-" + parserInfo.getId() + "-" + UUID.randomUUID().toString()));
         parsingTask.setGatewayId(completionMessage.getGatewayId());
         parsingTask.setParserInfoId(parserInfo.getId());
+        parsingTask.setLocalDataDir("/tmp");
+        try {
+            parsingTask.setGroupResourceProfileId(registryClient.getProcess(completionMessage.getProcessId()).getGroupResourceProfileId());
+        } catch (TException e) {
+            logger.error("Failed while fetching process model for process id  " + completionMessage.getProcessId());
+            throw new Exception("Failed while fetching process model for process id  " + completionMessage.getProcessId());
+        }
 
         ParsingTaskInputs inputs = new ParsingTaskInputs();
 
@@ -189,15 +197,16 @@ public class ParserWorkflowManager extends WorkflowManager {
             String expression = templateInput.getExpression();
             try {
                 ExperimentModel experiment = registryClient.getExperiment(completionMessage.getExperimentId());
-                Optional<InputDataObjectType> inputDataObj = experiment.getExperimentInputs().stream().filter(inputDataObjectType -> inputDataObjectType.getName().equals(expression)).findFirst();
-                if (inputDataObj.isPresent()) {
+                Optional<OutputDataObjectType> outputDataObj = experiment.getExperimentOutputs().stream().filter(outputDataObjectType -> outputDataObjectType.getName().equals(expression)).findFirst();
+                if (outputDataObj.isPresent()) {
                     ParsingTaskInput input = new ParsingTaskInput();
                     input.setId(templateInput.getInputId());
-                    input.setValue(inputDataObj.get().getValue());
+                    input.setValue(outputDataObj.get().getValue());
                     inputs.addInput(input);
                 }
             } catch (TException e) {
                 logger.error("Failed while fetching experiment " + completionMessage.getExperimentId());
+                throw new Exception("Failed while fetching experiment " + completionMessage.getExperimentId());
             }
         }
 
@@ -224,9 +233,16 @@ public class ParserWorkflowManager extends WorkflowManager {
             for (DagElement dagElement : parentToChild.get(parentParserInfo.getId())) {
                 ParserInfo childParserInfo = registryClient.getParserInfo(dagElement.getChildParserId());
                 DataParsingTask parsingTask = new DataParsingTask();
-                parsingTask.setTaskId(completionMessage.getExperimentId() + "-" + childParserInfo.getId() + "-" + UUID.randomUUID().toString());
+                parsingTask.setTaskId(normalizeTaskId(completionMessage.getExperimentId() + "-" + childParserInfo.getId() + "-" + UUID.randomUUID().toString()));
                 parsingTask.setGatewayId(completionMessage.getGatewayId());
                 parsingTask.setParserInfoId(childParserInfo.getId());
+                parsingTask.setLocalDataDir("/tmp");
+                try {
+                    parsingTask.setGroupResourceProfileId(registryClient.getProcess(completionMessage.getProcessId()).getGroupResourceProfileId());
+                } catch (TException e) {
+                    logger.error("Failed while fetching process model for process id  " + completionMessage.getProcessId());
+                    throw new Exception("Failed while fetching process model for process id  " + completionMessage.getProcessId());
+                }
 
                 ParsingTaskInputs inputs = new ParsingTaskInputs();
                 dagElement.getInputOutputMapping().forEach(mapping -> {
@@ -285,4 +301,13 @@ public class ParserWorkflowManager extends WorkflowManager {
             consumer.commitAsync();
         }
     }
+
+    private void test() {
+        ProcessCompletionMessage completionMessage = new ProcessCompletionMessage();
+        completionMessage.setExperimentId("Echo_on_Oct_24,_2018_10:03_AM_b67b6a7e-d41f-46c2-a756-d8cf91155e1e");
+        completionMessage.setGatewayId("seagrid");
+        completionMessage.setProcessId("PROCESS_be7d1946-e404-447e-a7e8-5581aaef2ef8");
+        process(completionMessage);
+    }
+
 }
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
index 7413ad5..f610721 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
@@ -43,7 +43,7 @@ public class WorkflowManager {
     protected void initComponents() throws Exception {
         initRegistryClientPool();
         initWorkflowOperatorr();
-        initStatusPublisher();
+        //initStatusPublisher();
         initCuratorClient();
     }
 
@@ -121,4 +121,8 @@ public class WorkflowManager {
         msgCtx.setUpdatedTime(AiravataUtils.getCurrentTimestamp());
         getStatusPublisher().publish(msgCtx);
     }
+
+    public String normalizeTaskId(String taskId) {
+        return taskId.replace(":", "-").replace(",", "-");
+    }
 }
diff --git a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
index 6372389..e305cc7 100644
--- a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
+++ b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
@@ -4949,7 +4949,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
         parserInfo.setId(parserId);
         switch (parserId) {
             case "001":
-                parserInfo.setExecutionCommand("/opt/execute.txt");
+                parserInfo.setExecutionCommand("/opt/execute.sh");
                 parserInfo.setImageName("dimuthuupe/uppercase:v1");
                 parserInfo.setInputDirPath("/opt/inputs");
                 parserInfo.setOutputDirPath("/opt/outputs");
@@ -4968,7 +4968,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
                 parserInfo.setOutputFiles(Collections.singletonList(output1));
                 break;
             case "002":
-                parserInfo.setExecutionCommand("/opt/execute.txt");
+                parserInfo.setExecutionCommand("/opt/execute.sh");
                 parserInfo.setImageName("dimuthuupe/lowercase:v1");
                 parserInfo.setInputDirPath("/opt/inputs");
                 parserInfo.setOutputDirPath("/opt/outputs");
@@ -4998,8 +4998,10 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public ParsingTemplate getParsingTemplate(String templateId) throws RegistryServiceException, TException {
         ParsingTemplate template = new ParsingTemplate();
+        template.setId("001");
+        template.setApplicationInterface("sample");
         ParsingTemplateInput templateInput1 =  new ParsingTemplateInput();
-        templateInput1.setExpression("Echo-Out");
+        templateInput1.setExpression("Standard Out");
         templateInput1.setInputId("001");
 
         template.addToInitialInputs(templateInput1);