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 4a2f16f056 extract configurations when launching experiment and agent
script
4a2f16f056 is described below
commit 4a2f16f0569d9a85d3dcf4b2647066e8ffbdd6cd
Author: lahiruj <[email protected]>
AuthorDate: Sat Jul 20 02:37:54 2024 -0400
extract configurations when launching experiment and agent script
---
.../airavata-agent/scripts/agent.sh | 17 +++
modules/agent-framework/connection-service/pom.xml | 5 -
.../agent/connection/service/UserContext.java | 8 ++
.../service/config/ClusterApplicationConfig.java | 26 +++++
.../service/controllers/ExperimentController.java | 8 +-
.../service/handlers/ExperimentHandler.java | 116 +++++++++++++++------
.../service/models/LaunchAgentRequest.java | 69 ++++++++++++
.../service/services/AiravataService.java | 4 +
.../src/main/resources/application.yml | 7 +-
.../src/main/resources/truststore.jks | Bin 1654 -> 1654 bytes
10 files changed, 217 insertions(+), 43 deletions(-)
diff --git a/modules/agent-framework/airavata-agent/scripts/agent.sh
b/modules/agent-framework/airavata-agent/scripts/agent.sh
new file mode 100644
index 0000000000..f3dc37ea64
--- /dev/null
+++ b/modules/agent-framework/airavata-agent/scripts/agent.sh
@@ -0,0 +1,17 @@
+#!/bin/sh -x
+
+while getopts i:d: option
+ do
+ case $option in
+ i ) AgentId=$OPTARG ;;
+ d ) ServerUrl=$OPTARG ;;
+ \? ) cat << ENDCAT1
+>! Usage: $0 [-i Agent ID ] !<
+>! [-d Server URL ] !<
+ENDCAT1
+# exit 1 ;;
+ esac
+done
+
+module load singularitypro
+singularity exec
/expanse/lustre/scratch/gridchem/temp_project/containers/airavata-agent.sif
/opt/airavata-agent $ServerUrl:19900 $AgentId
\ No newline at end of file
diff --git a/modules/agent-framework/connection-service/pom.xml
b/modules/agent-framework/connection-service/pom.xml
index a2db96f4d5..525c4aa7e5 100644
--- a/modules/agent-framework/connection-service/pom.xml
+++ b/modules/agent-framework/connection-service/pom.xml
@@ -79,11 +79,6 @@
<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/UserContext.java
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/UserContext.java
index 6187f3893f..0d768ae306 100644
---
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/UserContext.java
+++
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/UserContext.java
@@ -13,4 +13,12 @@ public class UserContext {
public static void setAuthzToken(AuthzToken token) {
AUTHZ_TOKEN.set(token);
}
+
+ public static String username() {
+ return AUTHZ_TOKEN.get().getClaimsMap().get("username");
+ }
+
+ public static String gatewayId() {
+ return AUTHZ_TOKEN.get().getClaimsMap().get("gatewayId");
+ }
}
diff --git
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
new file mode 100644
index 0000000000..083583a937
--- /dev/null
+++
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
@@ -0,0 +1,26 @@
+package org.apache.airavata.agent.connection.service.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+@ConfigurationProperties(prefix = "airavata.cluster")
+public class ClusterApplicationConfig {
+
+ private Map<String, String> applicationInterfaceId;
+
+ public Map<String, String> getApplicationInterfaceId() {
+ return applicationInterfaceId;
+ }
+
+ public void setApplicationInterfaceId(Map<String, String>
applicationInterfaceId) {
+ this.applicationInterfaceId = applicationInterfaceId;
+ }
+
+ public String getApplicationInterfaceIdByCluster(String clusterName) {
+ return applicationInterfaceId.get(clusterName);
+ }
+
+}
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
index 1cb99b9f48..8dc743ef0a 100644
---
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
@@ -1,8 +1,8 @@
package org.apache.airavata.agent.connection.service.controllers;
import org.apache.airavata.agent.connection.service.handlers.ExperimentHandler;
+import org.apache.airavata.agent.connection.service.models.LaunchAgentRequest;
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;
@@ -32,10 +32,10 @@ public class ExperimentController {
}
@PostMapping(value = "/launch", consumes =
MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<?> createAndLaunchExperiment(@Valid @RequestBody
Configuration experimentConfig) {
- String experimentId =
experimentHandler.createAndLaunchExperiment(experimentConfig);
+ public ResponseEntity<?> createAndLaunchExperiment(@Valid @RequestBody
LaunchAgentRequest request) {
+ String experimentId =
experimentHandler.createAndLaunchExperiment(request);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
- .path("/{id}")
+ .replacePath("/api/v1/exp/{id}")
.buildAndExpand(experimentId)
.encode()
.toUri();
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 1db954af3f..78dc63e68a 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
@@ -1,33 +1,43 @@
package org.apache.airavata.agent.connection.service.handlers;
import org.apache.airavata.agent.connection.service.UserContext;
+import
org.apache.airavata.agent.connection.service.config.ClusterApplicationConfig;
+import org.apache.airavata.agent.connection.service.models.LaunchAgentRequest;
import org.apache.airavata.agent.connection.service.services.AiravataService;
import org.apache.airavata.api.Airavata;
+import
org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
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.airavata.model.workspace.Project;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.File;
-import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
+import java.util.UUID;
+import java.util.stream.Collectors;
@Service
public class ExperimentHandler {
private final static Logger LOGGER =
LoggerFactory.getLogger(ExperimentHandler.class);
private final AiravataService airavataService;
+ private final ClusterApplicationConfig clusterApplicationConfig;
- public ExperimentHandler(AiravataService airavataService) {
+ @Value("${airavata.storageResourceId}")
+ private String storageResourceId;
+
+ public ExperimentHandler(AiravataService airavataService,
ClusterApplicationConfig clusterApplicationConfig) {
this.airavataService = airavataService;
+ this.clusterApplicationConfig = clusterApplicationConfig;
}
public ExperimentModel getExperiment(String experimentId) {
@@ -51,18 +61,18 @@ public class ExperimentHandler {
}
}
- public String createAndLaunchExperiment(Configuration config) {
+ public String createAndLaunchExperiment(LaunchAgentRequest req) {
try {
- LOGGER.info("Creating an Airavata Experiment for {}",
config.getExperimentBaseName());
- ExperimentModel experiment = generateExperiment(config);
+ LOGGER.info("Creating an Airavata Experiment for {}",
req.getExperimentName());
+ ExperimentModel experiment = generateExperiment(req);
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, experiment.getGatewayId());
return experimentId;
} catch (TException 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);
+ LOGGER.error("Error while creating the experiment with the name:
{}", req.getExperimentName());
+ throw new RuntimeException("Error while creating the experiment
with the name: " + req.getExperimentName(), e);
}
}
@@ -76,55 +86,95 @@ public class ExperimentHandler {
}
}
- private ExperimentModel generateExperiment(Configuration config) throws
TException {
+ private ExperimentModel generateExperiment(LaunchAgentRequest req) throws
TException {
Airavata.Client airavataClient = airavataService.airavata();
- String experimentName = config.getExperimentBaseName();
+ String experimentName = req.getExperimentName();
+ String projectId = extractDefaultProjectId(airavataClient);
+ String appInterfaceId =
clusterApplicationConfig.getApplicationInterfaceIdByCluster(req.getRemoteCluster());
ExperimentModel experimentModel = new ExperimentModel();
experimentModel.setExperimentName(experimentName);
- experimentModel.setProjectId(config.getProjectId());
- experimentModel.setUserName(config.getUserId());
- experimentModel.setGatewayId(config.getGatewayId());
- experimentModel.setExecutionId(config.getApplicationInterfaceId());
+ experimentModel.setProjectId(projectId);
+ experimentModel.setUserName(UserContext.username());
+ experimentModel.setGatewayId(UserContext.gatewayId());
+ experimentModel.setExecutionId(appInterfaceId);
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());
+ computationalResourceSchedulingModel.setQueueName(req.getQueue());
+ computationalResourceSchedulingModel.setNodeCount(req.getNodeCount());
+
computationalResourceSchedulingModel.setTotalCPUCount(req.getCpuCount());
+
computationalResourceSchedulingModel.setWallTimeLimit(req.getWallTime());
+
computationalResourceSchedulingModel.setTotalPhysicalMemory(req.getMemory());
+
computationalResourceSchedulingModel.setResourceHostId(extractComputeResourceId(airavataClient,
req.getRemoteCluster()));
UserConfigurationDataModel userConfigurationDataModel = new
UserConfigurationDataModel();
userConfigurationDataModel.setComputationalResourceScheduling(computationalResourceSchedulingModel);
userConfigurationDataModel.setAiravataAutoSchedule(false);
userConfigurationDataModel.setOverrideManualScheduledParams(false);
- userConfigurationDataModel.setStorageId(config.getStorageResourceId());
- userConfigurationDataModel.setExperimentDataDir(config.getUserId()
+ userConfigurationDataModel.setStorageId(storageResourceId);
+ userConfigurationDataModel.setExperimentDataDir(UserContext.username()
.concat(File.separator)
- .concat(config.getProjectId())
+ .concat(projectId)
.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) {
+ List<InputDataObjectType> applicationInputs =
airavataClient.getApplicationInputs(UserContext.authzToken(), appInterfaceId);
+ List<InputDataObjectType> experimentInputs = applicationInputs.stream()
+ .peek(input -> {
+ if ("agent_id".equals(input.getName())) {
+ input.setValue("agent_" + UUID.randomUUID());
- 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);
- }
+ } else if ("server_url".equals(input.getName())) {
+ input.setValue(airavataService.getServerUrl());
+ }
+ })
+ .collect(Collectors.toList());
experimentModel.setExperimentInputs(experimentInputs);
-
experimentModel.setExperimentOutputs(airavataClient.getApplicationOutputs(UserContext.authzToken(),
config.getApplicationInterfaceId()));
+
experimentModel.setExperimentOutputs(airavataClient.getApplicationOutputs(UserContext.authzToken(),
appInterfaceId));
experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
LOGGER.info("Generated the experiment: {}",
experimentModel.getExperimentId());
return experimentModel;
}
+
+ private String extractDefaultProjectId(Airavata.Client airavataClient)
throws TException {
+ int limit = 10;
+ int offset = 0;
+
+ while (true) {
+ List<Project> userProjects =
airavataClient.getUserProjects(UserContext.authzToken(),
UserContext.gatewayId(), UserContext.username(), limit, offset);
+
+ // Check for the "Default Project"
+ Optional<Project> defaultProject = userProjects.stream()
+ .filter(project -> "Default
Project".equals(project.getName()))
+ .findFirst();
+
+ if (defaultProject.isPresent()) {
+ return defaultProject.get().getProjectID();
+ }
+ if (userProjects.size() < limit) {
+ break;
+ }
+ offset += limit;
+ }
+
+ throw new RuntimeException("Could not find a Default project for the
user: " + UserContext.username());
+ }
+
+ private String extractComputeResourceId(Airavata.Client airavataClient,
String remoteCluster) throws TException {
+ List<GroupResourceProfile> groupResourceList =
airavataClient.getGroupResourceList(UserContext.authzToken(),
UserContext.gatewayId());
+
+ return groupResourceList.stream()
+ .filter(profile ->
"Default".equals(profile.getGroupResourceProfileName()))
+ .flatMap(profile -> profile.getComputePreferences().stream())
+ .map(GroupComputeResourcePreference::getComputeResourceId)
+ .filter(computeResourceId ->
computeResourceId.startsWith(remoteCluster))
+ .findFirst()
+ .orElseThrow(() -> new RuntimeException("Could not find a
Compute Resource in the Default group resource profile for the user: " +
UserContext.username()));
+ }
+
}
diff --git
a/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/models/LaunchAgentRequest.java
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/models/LaunchAgentRequest.java
new file mode 100644
index 0000000000..c6378f2b5e
--- /dev/null
+++
b/modules/agent-framework/connection-service/src/main/java/org/apache/airavata/agent/connection/service/models/LaunchAgentRequest.java
@@ -0,0 +1,69 @@
+package org.apache.airavata.agent.connection.service.models;
+
+public class LaunchAgentRequest {
+
+ private String experimentName;
+ private String remoteCluster;
+
+ private String queue = "shared";
+ private int wallTime = 30;
+ private int cpuCount = 2;
+ private int nodeCount = 1;
+ private int memory = 2048;
+
+ public String getExperimentName() {
+ return experimentName;
+ }
+
+ public void setExperimentName(String experimentName) {
+ this.experimentName = experimentName;
+ }
+
+ public String getRemoteCluster() {
+ return remoteCluster;
+ }
+
+ public void setRemoteCluster(String remoteCluster) {
+ this.remoteCluster = remoteCluster;
+ }
+
+ public String getQueue() {
+ return queue;
+ }
+
+ public void setQueue(String queue) {
+ this.queue = queue;
+ }
+
+ public int getWallTime() {
+ return wallTime;
+ }
+
+ public void setWallTime(int wallTime) {
+ this.wallTime = wallTime;
+ }
+
+ public int getCpuCount() {
+ return cpuCount;
+ }
+
+ public void setCpuCount(int cpuCount) {
+ this.cpuCount = cpuCount;
+ }
+
+ public int getNodeCount() {
+ return nodeCount;
+ }
+
+ public void setNodeCount(int nodeCount) {
+ this.nodeCount = nodeCount;
+ }
+
+ public int getMemory() {
+ return memory;
+ }
+
+ public void setMemory(int memory) {
+ this.memory = memory;
+ }
+}
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 2068120a80..e52634f5d9 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
@@ -33,4 +33,8 @@ public class AiravataService {
throw new RuntimeException("Error while creating Airavata client",
e);
}
}
+
+ public String getServerUrl() {
+ return serverUrl;
+ }
}
diff --git
a/modules/agent-framework/connection-service/src/main/resources/application.yml
b/modules/agent-framework/connection-service/src/main/resources/application.yml
index 52bdcbeea3..b7f87714ed 100644
---
a/modules/agent-framework/connection-service/src/main/resources/application.yml
+++
b/modules/agent-framework/connection-service/src/main/resources/application.yml
@@ -11,4 +11,9 @@ airavata:
url: scigap02.sciencegateways.iu.edu
port: 9930
truststore:
- path: CHANGE_ME
+ path:
/Users/lahiruj/Projects/airavata/lahiruj/modules/agent-framework/connection-service/src/main/resources/trustore.jks
+ storageResourceId: gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6
+ cluster:
+ applicationInterfaceId:
+ expanse: AiravataAgent_f4313e4d-20c2-4bf6-bff1-8aa0f0b0c1d6
+ jetstream: AiravataAgent_f4313e4d-20c2-4bf6-bff1-xcver3343
diff --git
a/modules/agent-framework/connection-service/src/main/resources/truststore.jks
b/modules/agent-framework/connection-service/src/main/resources/truststore.jks
index 6f4ee4e433..7006e55ba6 100644
Binary files
a/modules/agent-framework/connection-service/src/main/resources/truststore.jks
and
b/modules/agent-framework/connection-service/src/main/resources/truststore.jks
differ