This is an automated email from the ASF dual-hosted git repository.
yasith 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 e3d14df161 fix issues in agent/sdk for creating custom environments.
update agent deployment scripts
e3d14df161 is described below
commit e3d14df1612b052a32cbdcc2b39a7a0f5372b63c
Author: yasith <[email protected]>
AuthorDate: Mon Apr 7 22:29:40 2025 -0400
fix issues in agent/sdk for creating custom environments. update agent
deployment scripts
---
.../airavata_experiments/airavata.py | 12 +++----
.../airavata_jupyter_magic/__init__.py | 2 +-
.../airavata-python-sdk/pyproject.toml | 2 +-
modules/agent-framework/airavata-agent/Makefile | 40 +++++++++++-----------
modules/agent-framework/airavata-agent/agent.go | 34 ++++++++++--------
modules/agent-framework/airavata-agent/agent.sh | 36 ++++++++++---------
6 files changed, 67 insertions(+), 59 deletions(-)
diff --git
a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_experiments/airavata.py
b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_experiments/airavata.py
index e352d909af..b3308f5995 100644
---
a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_experiments/airavata.py
+++
b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_experiments/airavata.py
@@ -348,7 +348,7 @@ class AiravataOperator:
b64data = base64.b64encode(rawdata).decode()
res = requests.post(f"{self.connection_svc_url()}/agent/execute/shell",
json={
"agentId": agent_ref,
- "envName": "base",
+ "envName": agent_ref,
"workingDir": ".",
"arguments": ["sh", "-c", f"echo {b64data} | base64 -d > {fp}"]
})
@@ -390,7 +390,7 @@ class AiravataOperator:
"""
res = requests.post(f"{self.connection_svc_url()}/agent/execute/shell",
json={
"agentId": agent_ref,
- "envName": "base",
+ "envName": agent_ref,
"workingDir": ".",
"arguments": ["sh", "-c", r"find /data -type d -name 'venv' -prune -o
-type f -printf '%P\n' | sort"]
})
@@ -428,7 +428,7 @@ class AiravataOperator:
fp = os.path.join("/data", remote_file)
res = requests.post(f"{self.connection_svc_url()}/agent/execute/shell",
json={
"agentId": agent_ref,
- "envName": "base",
+ "envName": agent_ref,
"workingDir": ".",
"arguments": ["sh", "-c", f"cat {fp} | base64 -w0"]
})
@@ -474,7 +474,7 @@ class AiravataOperator:
fp = os.path.join("/data", remote_file)
res = requests.post(f"{self.connection_svc_url()}/agent/execute/shell",
json={
"agentId": agent_ref,
- "envName": "base",
+ "envName": agent_ref,
"workingDir": ".",
"arguments": ["sh", "-c", f"cat {fp} | base64 -w0"]
})
@@ -752,7 +752,7 @@ class AiravataOperator:
print(f"[av] Agent {agent_id} found! creating environment...")
res = requests.post(f"{self.connection_svc_url()}/setup/env", json={
"agentId": agent_id,
- "envName": "base",
+ "envName": agent_id,
"libraries": ["python=3.10", "pip"],
"pip": libraries,
})
@@ -770,7 +770,7 @@ class AiravataOperator:
print(f"[av] Agent {agent_id} env created! executing code...")
res = requests.post(f"{self.connection_svc_url()}/agent/execute/python",
json={
"agentId": agent_id,
- "envName": "base",
+ "envName": agent_id,
"workingDir": ".",
"code": code,
})
diff --git
a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_jupyter_magic/__init__.py
b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_jupyter_magic/__init__.py
index 839fda942d..04b1fbd491 100644
---
a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_jupyter_magic/__init__.py
+++
b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_jupyter_magic/__init__.py
@@ -474,7 +474,7 @@ def run_on_runtime(rt_name: str, code_obj: str, result:
ExecutionResult) -> bool
url = api_base_url + '/api/v1/agent/execute/jupyter'
data = {
"agentId": rt.agentId,
- "envName": "base",
+ "envName": rt.agentId,
"code": code_obj,
}
json_data = json.dumps(data)
diff --git
a/airavata-api/airavata-client-sdks/airavata-python-sdk/pyproject.toml
b/airavata-api/airavata-client-sdks/airavata-python-sdk/pyproject.toml
index 58c49a9e4e..9c3df6fe11 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/pyproject.toml
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "airavata-python-sdk"
-version = "2.0.6"
+version = "2.0.7"
description = "Apache Airavata Python SDK"
readme = "README.md"
license = "Apache-2.0"
diff --git a/modules/agent-framework/airavata-agent/Makefile
b/modules/agent-framework/airavata-agent/Makefile
index 8fd4614dad..193ed7b11d 100644
--- a/modules/agent-framework/airavata-agent/Makefile
+++ b/modules/agent-framework/airavata-agent/Makefile
@@ -13,41 +13,41 @@ run-container:
deploy-anvil: deploy-anvil-scigap deploy-anvil-waterhub
deploy-anvil-gcommunityus
deploy-anvil-scigap:
- ssh x-scigap@anvil srun -p shared --mem 4G -t 30 singularity pull \
- --disable-cache \
- --force \
+ ssh x-scigap@anvil \
+ "srun -N1 -n1 -p shared --mem 4G -t 30 \
+ singularity pull --disable-cache --force \
cybershuttle/container/remote-agent-base.sif \
- docker://$(IMAGE_NAME)
+ docker://$(IMAGE_NAME)"
deploy-anvil-waterhub:
- ssh x-waterhub@anvil srun -p shared --mem 4G -t 30 singularity pull \
- --disable-cache \
- --force \
+ ssh x-waterhub@anvil \
+ "srun -N1 -n1 -p shared --mem 4G -t 30 \
+ singularity pull --disable-cache --force \
cybershuttle/container/remote-agent-base.sif \
- docker://$(IMAGE_NAME)
+ docker://$(IMAGE_NAME)"
deploy-anvil-gcommunityus:
- ssh x-gcommunityus@anvil srun -p shared --mem 4G -t 30 singularity pull
\
- --disable-cache \
- --force \
+ ssh x-gcommunityus@anvil \
+ "srun -N1 -n1 -p shared --mem 4G -t 30 \
+ singularity pull --disable-cache --force \
cybershuttle/container/remote-agent-base.sif \
- docker://$(IMAGE_NAME)
+ docker://$(IMAGE_NAME)"
deploy-expanse: deploy-expanse-scigap deploy-expanse-gridchem
deploy-expanse-scigap:
- ssh scigap@expanse srun -p shared --mem 4G -t 30 singularity pull \
- --disable-cache \
- --force \
+ ssh scigap@expanse \
+ "module load singularitypro && srun -N1 -n1 -A uic151 -p shared --mem
4G -t 30 \
+ singularity pull --disable-cache --force \
cybershuttle/container/remote-agent-base.sif \
- docker://$(IMAGE_NAME)
+ docker://$(IMAGE_NAME)"
deploy-expanse-gridchem:
- ssh gridchem@expanse srun -p shared --mem 4G -t 30 singularity pull \
- --disable-cache \
- --force \
+ ssh gridchem@expanse \
+ "module load singularitypro && srun -N1 -n1 -A uic151 -p shared --mem
4G -t 30 \
+ singularity pull --disable-cache --force \
cybershuttle/container/remote-agent-base.sif \
- docker://$(IMAGE_NAME)
+ docker://$(IMAGE_NAME)"
deploy-bootstrap:
scp agent.sh x-scigap@anvil:~/cybershuttle/agent.sh && \
diff --git a/modules/agent-framework/airavata-agent/agent.go
b/modules/agent-framework/airavata-agent/agent.go
index 6814328326..c5be62443c 100644
--- a/modules/agent-framework/airavata-agent/agent.go
+++ b/modules/agent-framework/airavata-agent/agent.go
@@ -25,8 +25,8 @@ import (
type Stream = grpc.BidiStreamingClient[protos.AgentMessage,
protos.ServerMessage]
-var envName = "base"
var pidMap = make(map[string]int)
+var defaultLibs = []string{"python<3.12", "pip", "ipykernel", "git", "flask",
"jupyter_client"}
func main() {
@@ -38,6 +38,10 @@ func main() {
// Parse the flags provided by the user.
flag.Parse()
+ log.Printf("[agent.go] main() --server=%s\n", *serverUrl)
+ log.Printf("[agent.go] main() --agent=%s\n", *agentId)
+ log.Printf("[agent.go] main() --lib=%s\n", *lib)
+ log.Printf("[agent.go] main() --pip=%s\n", *pip)
// Validate required flags
if *serverUrl == "" {
@@ -63,12 +67,14 @@ func main() {
var libList []string
if strings.TrimSpace(*lib) != "" {
- libList = strings.Split(*lib, ",")
+ libList = append(strings.Split(*lib, ","), defaultLibs...)
log.Printf("[agent.go] main() Installing --lib: %v\n", libList)
- libCmd := exec.Command("micromamba", "install", "-n", envName,
"--yes")
+ libCmd := exec.Command("micromamba", "install", "-n", *agentId,
"--yes")
libCmd.Args = append(libCmd.Args, libList...)
+ libCmd.Stdout = os.Stdout
+ libCmd.Stderr = os.Stderr
if err := libCmd.Run(); err != nil {
- log.Fatalf("[agent.go] main() Error Installing --lib:
%v\n%s\n", err, libCmd.Stderr)
+ log.Fatalf("[agent.go] main() Error Installing --lib:
%v\n", err)
}
log.Printf("[agent.go] main() Installed --lib: %v\n", libList)
} else {
@@ -79,13 +85,14 @@ func main() {
if strings.TrimSpace(*pip) != "" {
pipList = strings.Split(*pip, ",")
log.Printf("[agent.go] main() Installing --pip: %v\n", pipList)
- pipCmd := exec.Command("micromamba", "run", "-n", envName,
"pip", "install")
+ pipCmd := exec.Command("micromamba", "run", "-n", *agentId,
"pip", "install")
pipCmd.Args = append(pipCmd.Args, pipList...)
+ pipCmd.Stdout = os.Stdout
+ pipCmd.Stderr = os.Stderr
if err := pipCmd.Run(); err != nil {
- log.Fatalf("[agent.go] main() Error Installing --pip:
%v\n%s\n", err, pipCmd.Stderr)
+ log.Fatalf("[agent.go] main() Error Installing --pip:
%v\n", err)
}
log.Printf("[agent.go] main() Installed --pip: %v\n", pipList)
-
} else {
log.Printf("[agent.go] main() No --pip to install.\n")
}
@@ -132,15 +139,15 @@ func startInterceptor(stream Stream, grpcStreamChannel
chan struct{}) {
case *protos.ServerMessage_EnvSetupRequest:
log.Printf("[agent.go] Recived a env setup request\n")
executionId := x.EnvSetupRequest.ExecutionId
- envName = x.EnvSetupRequest.EnvName
+ envName := x.EnvSetupRequest.EnvName
envLibs := x.EnvSetupRequest.Libraries
envPip := x.EnvSetupRequest.Pip
- go createEnv(stream, executionId, envName, envLibs,
envPip)
+ go createEnv(stream, executionId, envName,
append(envLibs, defaultLibs...), envPip)
case *protos.ServerMessage_PythonExecutionRequest:
log.Printf("[agent.go] Recived a python execution
request\n")
executionId := x.PythonExecutionRequest.ExecutionId
- envName = x.PythonExecutionRequest.EnvName
+ envName := x.PythonExecutionRequest.EnvName
workingDir := x.PythonExecutionRequest.WorkingDir
code := x.PythonExecutionRequest.Code
go executePython(stream, executionId, envName,
workingDir, code)
@@ -148,7 +155,7 @@ func startInterceptor(stream Stream, grpcStreamChannel chan
struct{}) {
case *protos.ServerMessage_CommandExecutionRequest:
log.Printf("[agent.go] Recived a shell execution
request\n")
executionId := x.CommandExecutionRequest.ExecutionId
- envName = x.CommandExecutionRequest.EnvName
+ envName := x.CommandExecutionRequest.EnvName
workingDir := x.CommandExecutionRequest.WorkingDir
execArgs := x.CommandExecutionRequest.Arguments
go executeShell(stream, executionId, envName,
workingDir, execArgs)
@@ -156,14 +163,14 @@ func startInterceptor(stream Stream, grpcStreamChannel
chan struct{}) {
case *protos.ServerMessage_JupyterExecutionRequest:
log.Printf("[agent.go] Recived a jupyter execution
request\n")
executionId := x.JupyterExecutionRequest.ExecutionId
- envName = x.JupyterExecutionRequest.EnvName
+ envName := x.JupyterExecutionRequest.EnvName
code := x.JupyterExecutionRequest.Code
go executeJupyter(stream, executionId, envName, code)
case *protos.ServerMessage_KernelRestartRequest:
log.Printf("[agent.go] Recived a kernel restart
request\n")
executionId := x.KernelRestartRequest.ExecutionId
- envName = x.KernelRestartRequest.EnvName
+ envName := x.KernelRestartRequest.EnvName
go restartKernel(stream, executionId, envName)
case *protos.ServerMessage_TunnelCreationRequest:
@@ -203,7 +210,6 @@ func createEnv(stream Stream, executionId string, envName
string, envLibs []stri
}
log.Printf("[agent.go] createEnv() Environment created: %s\n",
envName)
}
- envLibs = append(envLibs, "python<3.12", "pip", "ipykernel", "git",
"flask", "jupyter_client")
installDepsCmd := exec.Command("micromamba", "install", "-n", envName,
"--yes")
installDepsCmd.Args = append(installDepsCmd.Args, envLibs...)
if err := installDepsCmd.Run(); err != nil {
diff --git a/modules/agent-framework/airavata-agent/agent.sh
b/modules/agent-framework/airavata-agent/agent.sh
index 9059ae09cf..3e2c18f794 100755
--- a/modules/agent-framework/airavata-agent/agent.sh
+++ b/modules/agent-framework/airavata-agent/agent.sh
@@ -49,7 +49,9 @@ while true; do
--mounts)
IFS=',' read -ra MOUNTS <<< "$2"
for MOUNT in "${MOUNTS[@]}"; do
- BIND_OPTS+=("--bind $(eval echo $MOUNT):ro")
+ IFS=':' read -r SRC DEST <<< "$MOUNT"
+ SRC=$(eval echo "$SRC")
+ BIND_OPTS+=("--bind $SRC:$DEST:ro")
done
shift 2 ;;
--bind) BIND_OPTS+=("--bind $2:ro"); shift 2 ;;
@@ -65,22 +67,22 @@ echo "SERVER=$SERVER"
echo "CONTAINER=$CONTAINER"
echo "LIBRARIES=$LIBRARIES"
echo "PIP=$PIP"
-echo "BIND_OPTS=$BIND_OPTS"
+echo "BIND_OPTS=${BIND_OPTS[@]}"
# ----------------------------------------------------------------------
-# STEP 2 - RUN AGENT
+# STEP 2 - RUN USING AGENT
# ----------------------------------------------------------------------
-# Create overlay image (4GB) if it doesn't exist
-if [ ! -f workspace.img ]; then
- singularity overlay create --size 4096 workspace.img
-fi
-# Start agent with the given params and overlay
-KERNEL_SOCK=$(mktemp) singularity exec \
- --overlay workspace.img \
- ${BIND_OPTS[@]} \
- $CS_HOME/container/$CONTAINER /opt/airavata-agent \
- --server $SERVER:19900 \
- --agent $AGENT \
- --lib $LIBRARIES \
- --pip $PIP \
- $@
+
+mkdir -p $CS_HOME/scratch/tmp
+
+# Run container in environment
+singularity exec \
+ --bind $CS_HOME/scratch:/scratch ${BIND_OPTS[@]} \
+ --env MAMBA_ROOT_PREFIX=/scratch \
+ --env TMPDIR=/scratch/tmp \
+ --env KERNEL_SOCK=$(mktemp) \
+ $CS_HOME/container/$CONTAINER \
+ bash -c "\
+ micromamba create -n $AGENT && \
+ /opt/airavata-agent --server $SERVER:19900 --agent $AGENT --lib $LIBRARIES
--pip $PIP $@\
+ "