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

Reply via email to