Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions server/opensandbox_server/services/k8s/kubernetes_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,9 @@ async def _wait_for_sandbox_ready(
continue

# Get status
status_info = self.workload_provider.get_status(workload)
status_info = self._normalize_create_status(
self.workload_provider.get_status(workload)
)
current_state = status_info["state"]
current_message = status_info["message"]

Expand Down Expand Up @@ -224,6 +226,17 @@ async def _wait_for_sandbox_ready(
),
},
)

@staticmethod
def _normalize_create_status(status_info: Dict[str, Any]) -> Dict[str, Any]:
if status_info.get("state") != "Allocated":
return status_info

return {
**status_info,
"state": "Running",
"message": "Pod has IP assigned and sandbox is ready for requests",
}

def _ensure_network_policy_support(self, request: CreateSandboxRequest) -> None:
"""
Expand Down Expand Up @@ -363,7 +376,9 @@ async def create_sandbox(self, request: CreateSandboxRequest) -> CreateSandboxRe
)

# Get final status
status_info = self.workload_provider.get_status(workload)
status_info = self._normalize_create_status(
self.workload_provider.get_status(workload)
)

# Build and return response with Running state
return CreateSandboxResponse(
Expand Down
22 changes: 22 additions & 0 deletions server/tests/k8s/test_kubernetes_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,28 @@ async def test_create_sandbox_with_valid_request_succeeds(
assert response.status.state == "Running"
k8s_service.workload_provider.create_workload.assert_called_once()

@pytest.mark.asyncio
async def test_create_sandbox_normalizes_allocated_status_to_running(
self, k8s_service, create_sandbox_request, mock_workload
):
k8s_service.workload_provider.create_workload.return_value = {
"name": "test-sandbox-123",
"uid": "abc-123",
}
k8s_service.workload_provider.get_workload.return_value = mock_workload
k8s_service.workload_provider.get_status.return_value = {
"state": "Allocated",
"reason": "IP_ASSIGNED",
"message": "Pod has IP assigned but not ready",
"last_transition_at": datetime.now(timezone.utc),
}

response = await k8s_service.create_sandbox(create_sandbox_request)

assert response.status.state == "Running"
assert response.status.reason == "IP_ASSIGNED"
assert response.status.message == "Pod has IP assigned and sandbox is ready for requests"

@pytest.mark.asyncio
async def test_create_sandbox_uses_configured_timeout_and_poll_interval(
self, k8s_service, create_sandbox_request, mock_workload
Expand Down