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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0c1f609ecd implemented services to get, create and launch experiments 
for agent-framework
0c1f609ecd is described below

commit 0c1f609ecdb1c6aed7b1e5267402879647bb3c95
Author: lahiruj <[email protected]>
AuthorDate: Thu Jul 18 22:53:01 2024 -0400

    implemented services to get, create and launch experiments for 
agent-framework
---
 modules/agent-framework/connection-service/pom.xml |  5 ++
 .../service/controllers/ExperimentController.java  | 45 +++++++++++++
 .../service/handlers/ExperimentHandler.java        | 74 ++++++++++++++++++++--
 .../service/services/AiravataService.java          |  4 +-
 4 files changed, 120 insertions(+), 8 deletions(-)

diff --git a/modules/agent-framework/connection-service/pom.xml 
b/modules/agent-framework/connection-service/pom.xml
index 525c4aa7e5..a2db96f4d5 100644
--- a/modules/agent-framework/connection-service/pom.xml
+++ b/modules/agent-framework/connection-service/pom.xml
@@ -79,6 +79,11 @@
             <artifactId>airavata-api-stubs</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>load-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git 
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
 
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
new file mode 100644
index 0000000000..1cb99b9f48
--- /dev/null
+++ 
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
@@ -0,0 +1,45 @@
+package org.apache.airavata.agent.connection.service.controllers;
+
+import org.apache.airavata.agent.connection.service.handlers.ExperimentHandler;
+import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.tools.load.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import javax.validation.Valid;
+import java.net.URI;
+
+@RestController
+@RequestMapping("/api/v1/exp")
+public class ExperimentController {
+
+    private final ExperimentHandler experimentHandler;
+
+    public ExperimentController(ExperimentHandler experimentHandler) {
+        this.experimentHandler = experimentHandler;
+    }
+
+    @GetMapping(value = "/{expId}", produces = 
MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<ExperimentModel> 
getExperiment(@PathVariable("expId") String expId) {
+        return ResponseEntity.ok(experimentHandler.getExperiment(expId));
+    }
+
+    @PostMapping(value = "/launch", consumes = 
MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<?> createAndLaunchExperiment(@Valid @RequestBody 
Configuration experimentConfig) {
+        String experimentId = 
experimentHandler.createAndLaunchExperiment(experimentConfig);
+        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
+                .path("/{id}")
+                .buildAndExpand(experimentId)
+                .encode()
+                .toUri();
+
+        return ResponseEntity.created(location).build();
+    }
+}
diff --git 
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/ExperimentHandler.java
 
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/ExperimentHandler.java
index b33958aba1..1db954af3f 100644
--- 
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/ExperimentHandler.java
+++ 
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/ExperimentHandler.java
@@ -4,13 +4,21 @@ import 
org.apache.airavata.agent.connection.service.UserContext;
 import org.apache.airavata.agent.connection.service.services.AiravataService;
 import org.apache.airavata.api.Airavata;
 import 
org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
+import org.apache.airavata.model.application.io.InputDataObjectType;
 import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.experiment.UserConfigurationDataModel;
+import 
org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.tools.load.Configuration;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 @Service
 public class ExperimentHandler {
@@ -43,16 +51,18 @@ public class ExperimentHandler {
         }
     }
 
-    public String createAndLaunchExperiment(String gatewayId, ExperimentModel 
experiment) {
+    public String createAndLaunchExperiment(Configuration config) {
         try {
-            LOGGER.info("Creating an Airavata Experiment for {}", 
experiment.getExperimentName());
-            String experimentId = 
airavataService.airavata().createExperiment(UserContext.authzToken(), 
gatewayId, experiment);
+            LOGGER.info("Creating an Airavata Experiment for {}", 
config.getExperimentBaseName());
+            ExperimentModel experiment = generateExperiment(config);
+
+            String experimentId = 
airavataService.airavata().createExperiment(UserContext.authzToken(), 
experiment.getGatewayId(), experiment);
             LOGGER.info("Launching the application, Id: {}, Name: {}", 
experimentId, experiment.getExperimentName());
-            
airavataService.airavata().launchExperiment(UserContext.authzToken(), 
experimentId, gatewayId);
+            
airavataService.airavata().launchExperiment(UserContext.authzToken(), 
experimentId, experiment.getGatewayId());
             return experimentId;
         } catch (TException e) {
-            LOGGER.error("Error while creating the experiment with the name: 
{}", experiment.getExperimentName());
-            throw new RuntimeException("Error while creating the experiment 
with the name: " + experiment.getExperimentName(), e);
+            LOGGER.error("Error while creating the experiment with the name: 
{}", config.getExperimentBaseName());
+            throw new RuntimeException("Error while creating the experiment 
with the name: " + config.getExperimentBaseName(), e);
         }
     }
 
@@ -65,4 +75,56 @@ public class ExperimentHandler {
             throw new RuntimeException("Error while terminating the 
application with the experiment Id: " + experimentId, e);
         }
     }
+
+    private ExperimentModel generateExperiment(Configuration config) throws 
TException {
+        Airavata.Client airavataClient = airavataService.airavata();
+
+        String experimentName = config.getExperimentBaseName();
+
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setExperimentName(experimentName);
+        experimentModel.setProjectId(config.getProjectId());
+        experimentModel.setUserName(config.getUserId());
+        experimentModel.setGatewayId(config.getGatewayId());
+        experimentModel.setExecutionId(config.getApplicationInterfaceId());
+
+        ComputationalResourceSchedulingModel 
computationalResourceSchedulingModel = new 
ComputationalResourceSchedulingModel();
+        computationalResourceSchedulingModel.setQueueName(config.getQueue());
+        
computationalResourceSchedulingModel.setNodeCount(config.getNodeCount());
+        
computationalResourceSchedulingModel.setTotalCPUCount(config.getCpuCount());
+        
computationalResourceSchedulingModel.setWallTimeLimit(config.getWallTime());
+        
computationalResourceSchedulingModel.setTotalPhysicalMemory(config.getPhysicalMemory());
+        
computationalResourceSchedulingModel.setResourceHostId(config.getComputeResourceId());
+
+        UserConfigurationDataModel userConfigurationDataModel = new 
UserConfigurationDataModel();
+        
userConfigurationDataModel.setComputationalResourceScheduling(computationalResourceSchedulingModel);
+        userConfigurationDataModel.setAiravataAutoSchedule(false);
+        userConfigurationDataModel.setOverrideManualScheduledParams(false);
+        userConfigurationDataModel.setStorageId(config.getStorageResourceId());
+        userConfigurationDataModel.setExperimentDataDir(config.getUserId()
+                .concat(File.separator)
+                .concat(config.getProjectId())
+                .concat(File.separator)
+                .concat(experimentName));
+
+        experimentModel.setUserConfigurationData(userConfigurationDataModel);
+
+        List<InputDataObjectType> applicationInputs = 
airavataClient.getApplicationInputs(UserContext.authzToken(),
+                config.getApplicationInterfaceId());
+        List<InputDataObjectType> experimentInputs = new ArrayList<>();
+
+        for (InputDataObjectType inputDataObjectType : applicationInputs) {
+
+            Optional<Configuration.Input> input = 
config.getInputs().stream().filter(inp -> 
inp.getName().equals(inputDataObjectType.getName())).findFirst();
+            input.ifPresent(value -> 
inputDataObjectType.setValue(value.getValue()));
+            experimentInputs.add(inputDataObjectType);
+        }
+
+        experimentModel.setExperimentInputs(experimentInputs);
+        
experimentModel.setExperimentOutputs(airavataClient.getApplicationOutputs(UserContext.authzToken(),
 config.getApplicationInterfaceId()));
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        LOGGER.info("Generated the experiment: {}", 
experimentModel.getExperimentId());
+
+        return experimentModel;
+    }
 }
diff --git 
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
 
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
index 212dbc3c75..2068120a80 100644
--- 
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
+++ 
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
@@ -14,10 +14,10 @@ public class AiravataService {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AiravataService.class);
     private static final int TIMEOUT = 100000;
 
-    @Value("${airavata.server.url}, scigap02.sciencegateways.iu.edu")
+    @Value("${airavata.server.url:scigap02.sciencegateways.iu.edu}")
     private String serverUrl;
 
-    @Value("${airavata.server.port}, 9930")
+    @Value("${airavata.server.port:9930}")
     private int port;
 
     @Value("${airavata.server.truststore.path}")

Reply via email to