Skip to content

Commit 7c8ac1b

Browse files
authored
feat: add field image_os to SandboxStartRequest (alibaba#623)
1 parent d3c1b25 commit 7c8ac1b

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

rock/admin/proto/request.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
class SandboxStartRequest(BaseModel):
1818
image: str = ""
1919
"""image"""
20+
image_os: str = "linux"
21+
"""The operating system of the image (e.g., 'linux', 'windows')."""
2022
auto_clear_time_minutes: int = env_vars.ROCK_DEFAULT_AUTO_CLEAR_TIME_MINUTES
2123
"""The time for automatic container cleaning, with the unit being minutes"""
2224
pull: Literal["never", "always", "missing"] = "missing"

tests/unit/admin/proto/__init__.py

Whitespace-only changes.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
"""
2+
Unit tests for SandboxStartRequest parameter passthrough.
3+
4+
Verifies that all fields in SandboxStartRequest — especially image_os —
5+
are correctly propagated through the full chain:
6+
SandboxConfig (SDK) → HTTP request data → SandboxStartRequest → DockerDeploymentConfig
7+
"""
8+
9+
from rock.admin.proto.request import SandboxStartRequest
10+
from rock.deployments.config import DockerDeploymentConfig
11+
from rock.sdk.sandbox.config import SandboxConfig
12+
13+
14+
def test_image_os_default_value():
15+
"""SandboxStartRequest should default image_os to 'linux'."""
16+
request = SandboxStartRequest()
17+
assert request.image_os == "linux"
18+
19+
20+
def test_image_os_custom_value():
21+
"""SandboxStartRequest should accept a custom image_os value."""
22+
request = SandboxStartRequest(image_os="windows")
23+
assert request.image_os == "windows"
24+
25+
26+
def test_image_os_propagates_to_docker_deployment_config():
27+
"""image_os in SandboxStartRequest must be forwarded to DockerDeploymentConfig."""
28+
request = SandboxStartRequest(image="ubuntu:22.04", image_os="windows")
29+
config = DockerDeploymentConfig.from_request(request)
30+
assert config.image_os == "windows"
31+
32+
33+
def test_image_os_default_propagates_to_docker_deployment_config():
34+
"""Default image_os ('linux') must be forwarded to DockerDeploymentConfig."""
35+
request = SandboxStartRequest(image="ubuntu:22.04")
36+
config = DockerDeploymentConfig.from_request(request)
37+
assert config.image_os == "linux"
38+
39+
40+
def test_all_fields_propagate_from_request_to_docker_config():
41+
"""Every field set on SandboxStartRequest must appear unchanged in DockerDeploymentConfig."""
42+
request = SandboxStartRequest(
43+
image="my-registry/my-image:latest",
44+
image_os="windows",
45+
pull="always",
46+
memory="16g",
47+
cpus=4.0,
48+
limit_cpus=2.0,
49+
sandbox_id="test-sandbox-001",
50+
registry_username="user",
51+
registry_password="secret",
52+
use_kata_runtime=True,
53+
)
54+
config = DockerDeploymentConfig.from_request(request)
55+
56+
assert config.image == "my-registry/my-image:latest"
57+
assert config.image_os == "windows"
58+
assert config.pull == "always"
59+
assert config.memory == "16g"
60+
assert config.cpus == 4.0
61+
assert config.limit_cpus == 2.0
62+
assert config.container_name == "test-sandbox-001"
63+
assert config.registry_username == "user"
64+
assert config.registry_password == "secret"
65+
assert config.use_kata_runtime is True
66+
67+
68+
def test_sandbox_id_becomes_container_name():
69+
"""sandbox_id from SandboxStartRequest should map to container_name in DockerDeploymentConfig."""
70+
request = SandboxStartRequest(sandbox_id="my-sandbox")
71+
config = DockerDeploymentConfig.from_request(request)
72+
assert config.container_name == "my-sandbox"
73+
74+
75+
def test_none_sandbox_id_yields_none_container_name():
76+
"""When sandbox_id is None, container_name in DockerDeploymentConfig should also be None."""
77+
request = SandboxStartRequest(sandbox_id=None)
78+
config = DockerDeploymentConfig.from_request(request)
79+
assert config.container_name is None
80+
81+
82+
def test_image_os_default_matches_between_sdk_config_and_start_request():
83+
"""SandboxConfig and SandboxStartRequest must share the same default value for image_os."""
84+
sdk_config = SandboxConfig()
85+
start_request = SandboxStartRequest()
86+
assert sdk_config.image_os == start_request.image_os
87+
88+
89+
def test_sdk_config_image_os_survives_full_chain():
90+
"""
91+
Simulate the SDK start() flow:
92+
SandboxConfig.image_os → data dict → SandboxStartRequest → DockerDeploymentConfig
93+
"""
94+
sdk_config = SandboxConfig(image="python:3.11", image_os="windows")
95+
96+
# Mimic what Sandbox.start() puts into the HTTP request body
97+
http_request_data = {
98+
"image": sdk_config.image,
99+
"image_os": sdk_config.image_os,
100+
"memory": sdk_config.memory,
101+
"cpus": sdk_config.cpus,
102+
"limit_cpus": sdk_config.limit_cpus,
103+
"registry_username": sdk_config.registry_username,
104+
"registry_password": sdk_config.registry_password,
105+
"use_kata_runtime": sdk_config.use_kata_runtime,
106+
"sandbox_id": sdk_config.sandbox_id,
107+
}
108+
109+
# SandboxStartRequest deserialises the HTTP body
110+
start_request = SandboxStartRequest(**http_request_data)
111+
assert start_request.image_os == "windows"
112+
113+
# DockerDeploymentConfig is built from the request
114+
docker_config = DockerDeploymentConfig.from_request(start_request)
115+
assert docker_config.image_os == "windows"

0 commit comments

Comments
 (0)