Skip to content

Commit a8b5026

Browse files
authored
refactor: move non-management methods back to proxy service (#433)
1 parent f97d20c commit a8b5026

5 files changed

Lines changed: 22 additions & 46 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ admin = [
4646
"boto3",
4747
"ray[default]==2.43.0",
4848
"pip",
49-
"cryptography==39.0.1"
49+
"cryptography==39.0.1",
50+
"fakeredis[json]",
5051
]
5152

5253
rocklet = [
@@ -111,7 +112,6 @@ test = [
111112
"pytest-trio",
112113
"pytest-twisted",
113114
"pytest-env",
114-
"fakeredis[json]",
115115
]
116116

117117
[tool.setuptools.packages.find]

rock/admin/entrypoints/sandbox_api.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
UploadResponse,
1414
WriteFileResponse,
1515
)
16+
from rock.actions.response import ResponseStatus
1617
from rock.admin.proto.request import (
1718
SandboxBashAction,
1819
SandboxCloseBashSessionRequest,
@@ -103,7 +104,10 @@ async def create_session(request: SandboxCreateBashSessionRequest) -> RockRespon
103104
@sandbox_router.post("/run_in_session")
104105
@handle_exceptions(error_message="run in session failed")
105106
async def run(action: SandboxBashAction) -> RockResponse[BashObservation]:
106-
return RockResponse(result=await sandbox_manager.run_in_session(action))
107+
result = await sandbox_manager.run_in_session(action)
108+
if result.exit_code is not None and result.exit_code == -1:
109+
return RockResponse(status=ResponseStatus.FAILED, error=result.failure_reason)
110+
return RockResponse(result=result)
107111

108112

109113
@sandbox_router.post("/close_session")

rock/admin/main.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ async def lifespan(app: FastAPI):
5454
# init redis provider
5555
if args.env == "local":
5656
redis_provider = None
57+
elif args.env == "test":
58+
from fakeredis import aioredis
59+
60+
redis_provider = RedisProvider(host=None, port=None, password="")
61+
redis_provider.client = aioredis.FakeRedis(decode_responses=True)
5762
else:
5863
redis_provider = RedisProvider(
5964
host=rock_config.redis.host,

rock/sandbox/sandbox_manager.py

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from rock.sandbox.base_manager import BaseManager
3838
from rock.sandbox.operator.abstract import AbstractOperator
3939
from rock.sandbox.sandbox_actor import SandboxActor
40+
from rock.sandbox.service.sandbox_proxy_service import SandboxProxyService
4041
from rock.sdk.common.exceptions import BadRequestRockError, InternalServerRockError
4142
from rock.utils import (
4243
EAGLE_EYE_TRACE_ID,
@@ -71,6 +72,7 @@ def __init__(
7172
self._ray_namespace = ray_namespace
7273
self._operator = operator
7374
self._aes_encrypter = AESEncryption()
75+
self._proxy_service = SandboxProxyService(rock_config=rock_config, redis_provider=redis_provider)
7476
if redis_provider:
7577
self._operator.set_redis_provider(redis_provider)
7678
logger.info("sandbox service init success")
@@ -318,63 +320,28 @@ async def get_remote_status(self, sandbox_id: str, host_ip: str) -> ServiceStatu
318320
return ServiceStatus()
319321

320322
async def create_session(self, request: CreateSessionRequest) -> CreateBashSessionResponse:
321-
actor_name = self.deployment_manager.get_actor_name(request.sandbox_id)
322-
sandbox_actor = await self._ray_service.async_ray_get_actor(actor_name, self._ray_namespace)
323-
if sandbox_actor is None:
324-
raise Exception(f"sandbox {request.sandbox_id} not found to create session")
325-
await self._update_expire_time(request.sandbox_id)
326-
return await self._ray_service.async_ray_get(sandbox_actor.create_session.remote(request))
323+
return await self._proxy_service.create_session(request)
327324

328325
@monitor_sandbox_operation()
329326
async def run_in_session(self, action: Action) -> BashObservation:
330-
actor_name = self.deployment_manager.get_actor_name(action.sandbox_id)
331-
sandbox_actor = await self._ray_service.async_ray_get_actor(actor_name, self._ray_namespace)
332-
if sandbox_actor is None:
333-
raise Exception(f"sandbox {action.sandbox_id} not found to run in session")
334-
await self._update_expire_time(action.sandbox_id)
335-
return await self._ray_service.async_ray_get(sandbox_actor.run_in_session.remote(action))
327+
return await self._proxy_service.run_in_session(action)
336328

337329
async def close_session(self, request: CloseBashSessionRequest) -> CloseBashSessionResponse:
338-
actor_name = self.deployment_manager.get_actor_name(request.sandbox_id)
339-
sandbox_actor = await self._ray_service.async_ray_get_actor(actor_name, self._ray_namespace)
340-
if sandbox_actor is None:
341-
raise Exception(f"sandbox {request.sandbox_id} not found to close session")
342-
await self._update_expire_time(request.sandbox_id)
343-
return await self._ray_service.async_ray_get(sandbox_actor.close_session.remote(request))
330+
return await self._proxy_service.close_session(request)
344331

345332
async def execute(self, command: Command) -> CommandResponse:
346-
actor_name = self.deployment_manager.get_actor_name(command.sandbox_id)
347-
sandbox_actor = await self._ray_service.async_ray_get_actor(actor_name, self._ray_namespace)
348-
if sandbox_actor is None:
349-
raise Exception(f"sandbox {command.sandbox_id} not found to execute")
350-
await self._update_expire_time(command.sandbox_id)
351-
return await self._ray_service.async_ray_get(sandbox_actor.execute.remote(command))
333+
return await self._proxy_service.execute(command)
352334

353335
async def read_file(self, request: ReadFileRequest) -> ReadFileResponse:
354-
actor_name = self.deployment_manager.get_actor_name(request.sandbox_id)
355-
sandbox_actor = await self._ray_service.async_ray_get_actor(actor_name, self._ray_namespace)
356-
if sandbox_actor is None:
357-
raise Exception(f"sandbox {request.sandbox_id} not found to read file")
358-
await self._update_expire_time(request.sandbox_id)
359-
return await self._ray_service.async_ray_get(sandbox_actor.read_file.remote(request))
336+
return await self._proxy_service.read_file(request)
360337

361338
@monitor_sandbox_operation()
362339
async def write_file(self, request: WriteFileRequest) -> WriteFileResponse:
363-
actor_name = self.deployment_manager.get_actor_name(request.sandbox_id)
364-
sandbox_actor = await self._ray_service.async_ray_get_actor(actor_name, self._ray_namespace)
365-
if sandbox_actor is None:
366-
raise Exception(f"sandbox {request.sandbox_id} not found to write file")
367-
await self._update_expire_time(request.sandbox_id)
368-
return await self._ray_service.async_ray_get(sandbox_actor.write_file.remote(request))
340+
return await self._proxy_service.write_file(request)
369341

370342
@monitor_sandbox_operation()
371343
async def upload(self, file: UploadFile, target_path: str, sandbox_id: str) -> UploadResponse:
372-
actor_name = self.deployment_manager.get_actor_name(sandbox_id)
373-
sandbox_actor = await self._ray_service.async_ray_get_actor(actor_name, self._ray_namespace)
374-
if sandbox_actor is None:
375-
raise Exception(f"sandbox {sandbox_id} not found to upload file")
376-
await self._update_expire_time(sandbox_id)
377-
return await self._ray_service.async_ray_get(sandbox_actor.upload.remote(file, target_path))
344+
return await self._proxy_service.upload(file, target_path, sandbox_id)
378345

379346
async def _is_expired(self, sandbox_id):
380347
timeout_dict = await self._redis_provider.json_get(timeout_sandbox_key(sandbox_id), "$")

tests/integration/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def admin_remote_server():
106106
[
107107
"admin",
108108
"--env",
109-
"local",
109+
"test",
110110
"--role",
111111
"admin",
112112
"--port",

0 commit comments

Comments
 (0)