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}")