|
| 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