|
15 | 15 | SandboxExposeResult, |
16 | 16 | SandboxImageBuild, |
17 | 17 | SandboxImageBuildCreateResult, |
| 18 | + SandboxImageBuildListParams, |
| 19 | + SandboxImageBuildListResponse, |
18 | 20 | SandboxImageListParams, |
19 | 21 | SandboxImageListResponse, |
20 | 22 | SandboxImageInit, |
|
25 | 27 | SandboxNetworkPolicy, |
26 | 28 | SandboxNetworkUpdateResult, |
27 | 29 | SandboxRuntimeSession, |
| 30 | + SandboxSnapshotDeleteResult, |
28 | 31 | SandboxSnapshotListParams, |
29 | 32 | SandboxSnapshotListResponse, |
| 33 | + SandboxSnapshotSummary, |
30 | 34 | SandboxUnexposeResult, |
31 | 35 | StartSandboxFromSnapshotParams, |
32 | 36 | ) |
|
37 | 41 | CreateSandboxParams as CreateSandboxParamsDict, |
38 | 42 | SandboxExecParams as SandboxExecParamsDict, |
39 | 43 | SandboxExposeParams as SandboxExposeParamsDict, |
| 44 | + SandboxImageBuildListParams as SandboxImageBuildListParamsDict, |
40 | 45 | SandboxImageInit as SandboxImageInitDict, |
41 | 46 | SandboxImageListParams as SandboxImageListParamsDict, |
42 | 47 | SandboxListParams as SandboxListParamsDict, |
@@ -167,6 +172,10 @@ def memory_mib(self): |
167 | 172 | def disk_mib(self): |
168 | 173 | return self._detail.disk_mib |
169 | 174 |
|
| 175 | + @property |
| 176 | + def timeout_minutes(self): |
| 177 | + return self._detail.timeout_minutes |
| 178 | + |
170 | 179 | @property |
171 | 180 | def exposed_ports(self): |
172 | 181 | return self._detail.exposed_ports |
@@ -346,7 +355,7 @@ def _clear_runtime_session(self, status: Optional[str] = None) -> None: |
346 | 355 | ) |
347 | 356 |
|
348 | 357 | def _assert_runtime_available(self) -> None: |
349 | | - if self._detail.status in {"closed", "error"}: |
| 358 | + if self._detail.status in {"closed", "error", "close-error"}: |
350 | 359 | raise HyperbrowserError( |
351 | 360 | f"Sandbox {self.id} is not running", |
352 | 361 | status_code=409, |
@@ -394,7 +403,7 @@ async def start_from_snapshot( |
394 | 403 | ], |
395 | 404 | ) -> SandboxHandle: |
396 | 405 | normalized = coerce_request(params, StartSandboxFromSnapshotParams) |
397 | | - return await self.create(normalized) |
| 406 | + return await self.create(normalized.model_dump(exclude_none=True)) |
398 | 407 |
|
399 | 408 | async def get(self, sandbox_id: str) -> SandboxHandle: |
400 | 409 | return self.attach(await self.get_detail(sandbox_id)) |
@@ -450,6 +459,14 @@ async def list_snapshots( |
450 | 459 | ) |
451 | 460 | return SandboxSnapshotListResponse(**payload) |
452 | 461 |
|
| 462 | + async def get_snapshot(self, snapshot: str) -> SandboxSnapshotSummary: |
| 463 | + payload = await self._request("GET", f"/snapshots/{snapshot}") |
| 464 | + return SandboxSnapshotSummary(**payload["snapshot"]) |
| 465 | + |
| 466 | + async def delete_snapshot(self, snapshot: str) -> SandboxSnapshotDeleteResult: |
| 467 | + payload = await self._request("DELETE", f"/snapshots/{snapshot}") |
| 468 | + return SandboxSnapshotDeleteResult(**payload) |
| 469 | + |
453 | 470 | async def stop(self, sandbox_id: str) -> BasicResponse: |
454 | 471 | payload = await self._request("PUT", f"/sandbox/{sandbox_id}/stop") |
455 | 472 | return BasicResponse(**payload) |
@@ -491,6 +508,22 @@ async def cancel_image_build(self, build_id: str) -> SandboxImageBuild: |
491 | 508 | payload = await self._request("POST", f"/images/builds/{build_id}/cancel") |
492 | 509 | return SandboxImageBuild(**payload["build"]) |
493 | 510 |
|
| 511 | + async def list_image_builds( |
| 512 | + self, |
| 513 | + params: Optional[ |
| 514 | + Union[SandboxImageBuildListParamsDict, SandboxImageBuildListParams] |
| 515 | + ] = None, |
| 516 | + ) -> SandboxImageBuildListResponse: |
| 517 | + payload = await self._request( |
| 518 | + "GET", |
| 519 | + "/images/builds", |
| 520 | + params=dump_request( |
| 521 | + params if params is not None else {}, |
| 522 | + SandboxImageBuildListParams, |
| 523 | + ), |
| 524 | + ) |
| 525 | + return SandboxImageBuildListResponse(**payload) |
| 526 | + |
494 | 527 | async def wait_for_image_build( |
495 | 528 | self, |
496 | 529 | build_id: str, |
|
0 commit comments