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

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


The following commit(s) were added to refs/heads/cybershuttle-staging by this 
push:
     new 3069b06b8b Meta scheduling behavior for agent launch
3069b06b8b is described below

commit 3069b06b8b666f2cd2e6ca382deef6c2c07add7e
Author: DImuthuUpe <[email protected]>
AuthorDate: Thu Apr 10 04:36:12 2025 -0400

    Meta scheduling behavior for agent launch
---
 .../service/controllers/ExperimentController.java  | 18 ++++++++++++++
 .../service/handlers/AgentManagementHandler.java   | 28 ++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
index c1cb78812c..fcd93327a4 100644
--- 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
@@ -8,6 +8,8 @@ import 
org.apache.airavata.agent.connection.service.models.AgentLaunchResponse;
 import 
org.apache.airavata.agent.connection.service.models.AgentTerminateResponse;
 import org.apache.airavata.model.experiment.ExperimentModel;
 import org.apache.airavata.model.process.ProcessModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -17,10 +19,14 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("/api/v1/exp")
 public class ExperimentController {
 
+    private final static Logger logger = 
LoggerFactory.getLogger(ExperimentController.class);
+
     private final AgentManagementHandler agentManagementHandler;
 
     public ExperimentController(AgentManagementHandler agentManagementHandler) 
{
@@ -38,6 +44,18 @@ public class ExperimentController {
         return ResponseEntity.ok(agentResponse);
     }
 
+    @PostMapping(value = "/launchoptimize", consumes = 
MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<AgentLaunchResponse> 
createAndLaunchOptimizedExperiment(@Valid @RequestBody List<AgentLaunchRequest> 
request) {
+        try {
+            AgentLaunchRequest agentLaunchRequest = 
agentManagementHandler.filterOptimumLaunchRequest(request);
+            AgentLaunchResponse agentResponse = 
agentManagementHandler.createAndLaunchExperiment(agentLaunchRequest);
+            return ResponseEntity.ok(agentResponse);
+        } catch (Exception e) {
+            logger.error("Failed to fetch optimum launch request", e);
+            throw new RuntimeException("Failed to fetch optimum launch 
request");
+        }
+    }
+
     @GetMapping(value = "/terminate/{expId}", produces = 
MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<AgentTerminateResponse> 
terminateExperiment(@PathVariable("expId") String expId) {
         return 
ResponseEntity.ok(agentManagementHandler.terminateExperiment(expId));
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
index fb3b6900a5..48c16c16b8 100644
--- 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
@@ -16,6 +16,7 @@ import 
org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeRes
 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.ExperimentStatistics;
 import org.apache.airavata.model.experiment.ExperimentType;
 import org.apache.airavata.model.experiment.UserConfigurationDataModel;
 import org.apache.airavata.model.process.ProcessModel;
@@ -78,6 +79,33 @@ public class AgentManagementHandler {
         }
     }
 
+    /**
+     * Meta-scheduling logic
+     * @param launchRequests
+     * @return
+     * @throws Exception
+     */
+    public AgentLaunchRequest 
filterOptimumLaunchRequest(List<AgentLaunchRequest> launchRequests) throws 
Exception {
+        int leastRunningExpCount = Integer.MAX_VALUE;
+        AgentLaunchRequest sortedLaunchRequest = launchRequests.get(0);
+
+        for (AgentLaunchRequest req : launchRequests) {
+            String appInterfaceId = 
clusterApplicationConfig.getApplicationInterfaceIdByCluster(req.getApplicationInterfaceName());
+            ExperimentStatistics experimentStatistics = 
airavataService.airavata().getExperimentStatistics(UserContext.authzToken(), 
UserContext.gatewayId(),
+                    System.currentTimeMillis() -  60 * 60 * 1000, 
System.currentTimeMillis(), null,
+                    appInterfaceId, null, 100, 0);
+
+            int runningExperimentCount = 
experimentStatistics.getRunningExperimentCount();
+            int failedExperimentCount = 
experimentStatistics.getFailedExperimentCount();
+            LOGGER.info("Running count {} failed count {} for appInterfaceId 
{}", runningExperimentCount, failedExperimentCount, appInterfaceId);
+            if (runningExperimentCount + failedExperimentCount < 
leastRunningExpCount) {
+                leastRunningExpCount = runningExperimentCount + 
failedExperimentCount;
+                sortedLaunchRequest = req;
+            }
+        }
+        return sortedLaunchRequest;
+    }
+
     public AgentLaunchResponse createAndLaunchExperiment(AgentLaunchRequest 
req) {
         try {
             String agentId = "agent_" + UUID.randomUUID().toString();

Reply via email to