chore: clean up sandbox and ssh related configs (#3301)

* clean up sandbox and ssh related stuff

* remove ssh hostname

* remove ssh hostname

* remove ssh password

* update config

* fix typo that breaks the test
This commit is contained in:
Xingyao Wang
2024-08-09 06:15:40 +08:00
committed by GitHub
parent 040b9cb75c
commit a5195b0e65
14 changed files with 6 additions and 114 deletions

View File

@@ -56,7 +56,6 @@ cd "$PROJECT_ROOT" || exit 1
mkdir -p $WORKSPACE_BASE
# use environmental variable if exists, otherwise use "ssh"
SANDBOX_BOX_TYPE="${SANDBOX_TYPE:-ssh}"
TEST_RUNTIME="${TEST_RUNTIME:-eventstream}" # can be server or eventstream
# TODO: set this as default after ServerRuntime is deprecated
if [ "$TEST_RUNTIME" == "eventstream" ] && [ -z "$SANDBOX_CONTAINER_IMAGE" ]; then
@@ -64,7 +63,6 @@ if [ "$TEST_RUNTIME" == "eventstream" ] && [ -z "$SANDBOX_CONTAINER_IMAGE" ]; th
fi
MAX_ITERATIONS=15
echo "SANDBOX_BOX_TYPE: $SANDBOX_BOX_TYPE"
echo "TEST_RUNTIME: $TEST_RUNTIME"
agents=(
@@ -112,7 +110,6 @@ run_test() {
env SCRIPT_DIR="$SCRIPT_DIR" \
PROJECT_ROOT="$PROJECT_ROOT" \
SANDBOX_BOX_TYPE="$SANDBOX_BOX_TYPE" \
WORKSPACE_BASE=$WORKSPACE_BASE \
WORKSPACE_MOUNT_PATH=$WORKSPACE_MOUNT_PATH \
MAX_ITERATIONS=$MAX_ITERATIONS \
@@ -183,7 +180,6 @@ regenerate_without_llm() {
set -x
env SCRIPT_DIR="$SCRIPT_DIR" \
PROJECT_ROOT="$PROJECT_ROOT" \
SANDBOX_BOX_TYPE="$SANDBOX_BOX_TYPE" \
WORKSPACE_BASE=$WORKSPACE_BASE \
WORKSPACE_MOUNT_PATH=$WORKSPACE_MOUNT_PATH \
MAX_ITERATIONS=$MAX_ITERATIONS \
@@ -213,7 +209,6 @@ regenerate_with_llm() {
env SCRIPT_DIR="$SCRIPT_DIR" \
PROJECT_ROOT="$PROJECT_ROOT" \
DEBUG=true \
SANDBOX_BOX_TYPE="$SANDBOX_BOX_TYPE" \
WORKSPACE_BASE=$WORKSPACE_BASE \
WORKSPACE_MOUNT_PATH=$WORKSPACE_MOUNT_PATH \
DEFAULT_AGENT=$agent \

View File

@@ -29,7 +29,6 @@ CONFIG = AppConfig(
workspace_base=os.getenv('WORKSPACE_BASE'),
workspace_mount_path=os.getenv('WORKSPACE_MOUNT_PATH'),
sandbox=SandboxConfig(
box_type=os.getenv('SANDBOX_BOX_TYPE', 'ssh'),
use_host_network=True,
),
)
@@ -80,8 +79,7 @@ def validate_final_state(final_state: State | None, test_name: str):
(
os.getenv('DEFAULT_AGENT') == 'CodeActAgent'
or os.getenv('DEFAULT_AGENT') == 'CodeActSWEAgent'
)
and os.getenv('SANDBOX_BOX_TYPE', '').lower() != 'ssh',
),
reason='CodeActAgent/CodeActSWEAgent only supports ssh sandbox which is stateful',
)
@pytest.mark.skipif(
@@ -118,18 +116,13 @@ def test_write_simple_script(current_test_name: str) -> None:
(
os.getenv('DEFAULT_AGENT') == 'CodeActAgent'
or os.getenv('DEFAULT_AGENT') == 'CodeActSWEAgent'
)
and os.getenv('SANDBOX_BOX_TYPE', '').lower() != 'ssh',
),
reason='CodeActAgent/CodeActSWEAgent only supports ssh sandbox which is stateful',
)
@pytest.mark.skipif(
os.getenv('DEFAULT_AGENT') == 'PlannerAgent',
reason='We only keep basic tests for PlannerAgent',
)
@pytest.mark.skipif(
os.getenv('SANDBOX_BOX_TYPE') == 'local',
reason='local sandbox shows environment-dependent absolute path for pwd command',
)
def test_edits(current_test_name: str):
# Copy workspace artifacts to workspace_base location
source_dir = os.path.join(os.path.dirname(__file__), 'workspace/test_edits/')
@@ -163,10 +156,6 @@ Enjoy!
and os.getenv('DEFAULT_AGENT') != 'CodeActSWEAgent',
reason='currently only CodeActAgent and CodeActSWEAgent have IPython (Jupyter) execution by default',
)
@pytest.mark.skipif(
os.getenv('SANDBOX_BOX_TYPE') != 'ssh',
reason='Currently, only ssh sandbox supports stateful tasks',
)
def test_ipython(current_test_name: str):
# Execute the task
task = "Use Jupyter IPython to write a text file containing 'hello world' to '/workspace/test.txt'. Do not ask me for confirmation at any point."
@@ -191,10 +180,6 @@ def test_ipython(current_test_name: str):
os.getenv('DEFAULT_AGENT') != 'ManagerAgent',
reason='Currently, only ManagerAgent supports task rejection',
)
@pytest.mark.skipif(
os.getenv('SANDBOX_BOX_TYPE') == 'local',
reason='FIXME: local sandbox does not capture stderr',
)
def test_simple_task_rejection(current_test_name: str):
# Give an impossible task to do: cannot write a commit message because
# the workspace is not a git repo
@@ -211,10 +196,6 @@ def test_simple_task_rejection(current_test_name: str):
and os.getenv('DEFAULT_AGENT') != 'CodeActSWEAgent',
reason='currently only CodeActAgent and CodeActSWEAgent have IPython (Jupyter) execution by default',
)
@pytest.mark.skipif(
os.getenv('SANDBOX_BOX_TYPE') != 'ssh',
reason='Currently, only ssh sandbox supports stateful tasks',
)
def test_ipython_module(current_test_name: str):
# Execute the task
task = "Install and import pymsgbox==1.0.9 and print it's version in /workspace/test.txt. Do not ask me for confirmation at any point."
@@ -245,8 +226,7 @@ def test_ipython_module(current_test_name: str):
(
os.getenv('DEFAULT_AGENT') == 'CodeActAgent'
or os.getenv('DEFAULT_AGENT') == 'CodeActSWEAgent'
)
and os.getenv('SANDBOX_BOX_TYPE', '').lower() != 'ssh',
),
reason='CodeActAgent/CodeActSWEAgent only supports ssh sandbox which is stateful',
)
def test_browse_internet(http_server, current_test_name: str):

View File

@@ -52,7 +52,6 @@ def test_compat_env_to_config(monkeypatch, setup_env):
monkeypatch.setenv('AGENT_MEMORY_MAX_THREADS', '4')
monkeypatch.setenv('AGENT_MEMORY_ENABLED', 'True')
monkeypatch.setenv('DEFAULT_AGENT', 'CodeActAgent')
monkeypatch.setenv('SANDBOX_TYPE', 'local')
monkeypatch.setenv('SANDBOX_TIMEOUT', '10')
config = AppConfig()
@@ -67,7 +66,6 @@ def test_compat_env_to_config(monkeypatch, setup_env):
assert config.get_agent_config().memory_max_threads == 4
assert config.get_agent_config().memory_enabled is True
assert config.default_agent == 'CodeActAgent'
assert config.sandbox.box_type == 'local'
assert config.sandbox.timeout == 10
@@ -120,7 +118,6 @@ timeout = 1
[core]
workspace_base = "/opt/files2/workspace"
default_agent = "TestAgent"
sandbox_type = "local"
"""
)
@@ -150,12 +147,8 @@ sandbox_type = "local"
assert default_config.get_agent_config('BrowsingAgent').memory_enabled is False
assert default_config.workspace_base == '/opt/files2/workspace'
assert default_config.sandbox.box_type == 'local'
assert default_config.sandbox.timeout == 1
# default config doesn't have a field sandbox_type
assert not hasattr(default_config, 'sandbox_type')
# before finalize_config, workspace_mount_path is UndefinedString.UNDEFINED if it was not set
assert default_config.workspace_mount_path is UndefinedString.UNDEFINED
assert (
@@ -170,7 +163,7 @@ sandbox_type = "local"
assert default_config.workspace_mount_path == '/opt/files2/workspace'
def test_compat_load_sandbox_from_toml(default_config, temp_toml_file):
def test_compat_load_sandbox_from_toml(default_config: AppConfig, temp_toml_file: str):
# test loading configuration from a new-style TOML file
# uses a toml file with sandbox_vars instead of a sandbox section
with open(temp_toml_file, 'w', encoding='utf-8') as toml_file:
@@ -184,7 +177,6 @@ memory_enabled = true
[core]
workspace_base = "/opt/files2/workspace"
sandbox_type = "local"
sandbox_timeout = 500
sandbox_container_image = "node:14"
sandbox_user_id = 1001
@@ -199,7 +191,6 @@ default_agent = "TestAgent"
assert default_config.default_agent == 'TestAgent'
assert default_config.get_agent_config().memory_enabled is True
assert default_config.workspace_base == '/opt/files2/workspace'
assert default_config.sandbox.box_type == 'local'
assert default_config.sandbox.timeout == 500
assert default_config.sandbox.container_image == 'node:14'
assert default_config.sandbox.user_id == 1001
@@ -208,7 +199,6 @@ default_agent = "TestAgent"
finalize_config(default_config)
# app config doesn't have fields sandbox_*
assert not hasattr(default_config, 'sandbox_type')
assert not hasattr(default_config, 'sandbox_timeout')
assert not hasattr(default_config, 'sandbox_container_image')
assert not hasattr(default_config, 'sandbox_user_id')
@@ -229,7 +219,6 @@ api_key = "toml-api-key"
[core]
workspace_base = "/opt/files3/workspace"
sandbox_type = "local"
disable_color = true
sandbox_timeout = 500
sandbox_user_id = 1001
@@ -237,7 +226,6 @@ sandbox_user_id = 1001
monkeypatch.setenv('LLM_API_KEY', 'env-api-key')
monkeypatch.setenv('WORKSPACE_BASE', 'UNDEFINED')
monkeypatch.setenv('SANDBOX_TYPE', 'e2b')
monkeypatch.setenv('SANDBOX_TIMEOUT', '1000')
monkeypatch.setenv('SANDBOX_USER_ID', '1002')
@@ -262,7 +250,6 @@ sandbox_user_id = 1001
assert default_config.workspace_mount_path is UndefinedString.UNDEFINED
assert default_config.workspace_mount_path == 'UNDEFINED'
assert default_config.sandbox.box_type == 'e2b'
assert default_config.disable_color is True
assert default_config.sandbox.timeout == 1000
assert default_config.sandbox.user_id == 1002
@@ -285,14 +272,12 @@ api_key = "toml-api-key"
workspace_base = "/opt/files3/workspace"
[sandbox]
box_type = "e2b"
timeout = 500
user_id = 1001
""")
monkeypatch.setenv('LLM_API_KEY', 'env-api-key')
monkeypatch.setenv('WORKSPACE_BASE', 'UNDEFINED')
monkeypatch.setenv('SANDBOX_TYPE', 'local')
monkeypatch.setenv('SANDBOX_TIMEOUT', '1000')
monkeypatch.setenv('SANDBOX_USER_ID', '1002')
@@ -303,7 +288,6 @@ user_id = 1001
# before load_from_env, values are set to the values from the toml file
assert default_config.get_llm_config().api_key == 'toml-api-key'
assert default_config.sandbox.box_type == 'e2b'
assert default_config.sandbox.timeout == 500
assert default_config.sandbox.user_id == 1001
@@ -314,7 +298,6 @@ user_id = 1001
assert default_config.get_llm_config().model == 'test-model'
assert default_config.get_llm_config().api_key == 'env-api-key'
assert default_config.sandbox.box_type == 'local'
assert default_config.sandbox.timeout == 1000
assert default_config.sandbox.user_id == 1002
@@ -335,7 +318,6 @@ workspace_base = "/opt/files/workspace"
model = "test-model"
[sandbox]
box_type = "local"
timeout = 1
container_image = "custom_image"
user_id = 1001
@@ -347,7 +329,6 @@ user_id = 1001
finalize_config(default_config)
assert default_config.get_llm_config().model == 'test-model'
assert default_config.sandbox.box_type == 'local'
assert default_config.sandbox.timeout == 1
assert default_config.sandbox.container_image == 'custom_image'
assert default_config.sandbox.user_id == 1001
@@ -374,7 +355,6 @@ def test_defaults_dict_after_updates(default_config):
defaults_after_updates['workspace_mount_path']['default']
is UndefinedString.UNDEFINED
)
assert defaults_after_updates['sandbox']['box_type']['default'] == 'ssh'
assert defaults_after_updates['sandbox']['timeout']['default'] == 120
assert (
defaults_after_updates['sandbox']['container_image']['default']
@@ -393,7 +373,6 @@ def test_invalid_toml_format(monkeypatch, temp_toml_file, default_config):
load_from_toml(default_config)
load_from_env(default_config, os.environ)
default_config.ssh_password = None # prevent leak
default_config.jwt_secret = None # prevent leak
for llm in default_config.llms.values():
llm.api_key = None # prevent leak
@@ -405,13 +384,8 @@ def test_invalid_toml_format(monkeypatch, temp_toml_file, default_config):
def test_finalize_config(default_config):
# Test finalize config
assert default_config.workspace_mount_path is UndefinedString.UNDEFINED
default_config.sandbox.box_type = 'local'
finalize_config(default_config)
assert (
default_config.workspace_mount_path_in_sandbox
== default_config.workspace_mount_path
)
assert default_config.workspace_mount_path == os.path.abspath(
default_config.workspace_base
)
@@ -426,16 +400,6 @@ def test_workspace_mount_path_default(default_config):
)
def test_workspace_mount_path_in_sandbox_local(default_config):
assert default_config.workspace_mount_path_in_sandbox == '/workspace'
default_config.sandbox.box_type = 'local'
finalize_config(default_config)
assert (
default_config.workspace_mount_path_in_sandbox
== default_config.workspace_mount_path
)
def test_workspace_mount_rewrite(default_config, monkeypatch):
default_config.workspace_base = '/home/user/project'
default_config.workspace_mount_rewrite = '/home/user:/sandbox'
@@ -512,14 +476,11 @@ def test_api_keys_repr_str():
agents={'agent': agent_config},
e2b_api_key='my_e2b_api_key',
jwt_secret='my_jwt_secret',
ssh_password='my_ssh_password',
)
assert "e2b_api_key='******'" in repr(app_config)
assert "e2b_api_key='******'" in str(app_config)
assert "jwt_secret='******'" in repr(app_config)
assert "jwt_secret='******'" in str(app_config)
assert "ssh_password='******'" in repr(app_config)
assert "ssh_password='******'" in str(app_config)
# Check that no other attrs in AppConfig have 'key' or 'token' in their name
# This will fail when new attrs are added, and attract attention