boxd 0.2.8__tar.gz → 0.2.9.dev452__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. {boxd-0.2.8/src/boxd.egg-info → boxd-0.2.9.dev452}/PKG-INFO +10 -2
  2. {boxd-0.2.8 → boxd-0.2.9.dev452}/README.md +9 -1
  3. {boxd-0.2.8 → boxd-0.2.9.dev452}/pyproject.toml +1 -1
  4. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_credentials.py +53 -20
  5. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_generated/api_pb2.py +159 -149
  6. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_generated/api_pb2_grpc.py +140 -0
  7. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_transport.py +16 -2
  8. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/models.py +3 -0
  9. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/machines.py +66 -9
  10. {boxd-0.2.8 → boxd-0.2.9.dev452/src/boxd.egg-info}/PKG-INFO +10 -2
  11. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_credentials.py +39 -2
  12. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_namespaces.py +18 -1
  13. {boxd-0.2.8 → boxd-0.2.9.dev452}/LICENSE +0 -0
  14. {boxd-0.2.8 → boxd-0.2.9.dev452}/setup.cfg +0 -0
  15. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/__init__.py +0 -0
  16. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_client.py +0 -0
  17. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_generated/__init__.py +0 -0
  18. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_mappers.py +0 -0
  19. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_requests.py +0 -0
  20. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_streaming.py +0 -0
  21. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_urls.py +0 -0
  22. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/_version_check.py +0 -0
  23. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/errors.py +0 -0
  24. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/__init__.py +0 -0
  25. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/account.py +0 -0
  26. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/credentials.py +0 -0
  27. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/disks.py +0 -0
  28. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/domains.py +0 -0
  29. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/orgs.py +0 -0
  30. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/snapshots.py +0 -0
  31. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd/resources/vars.py +0 -0
  32. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd.egg-info/SOURCES.txt +0 -0
  33. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd.egg-info/dependency_links.txt +0 -0
  34. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd.egg-info/requires.txt +0 -0
  35. {boxd-0.2.8 → boxd-0.2.9.dev452}/src/boxd.egg-info/top_level.txt +0 -0
  36. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_mappers.py +0 -0
  37. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_requests.py +0 -0
  38. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_streaming.py +0 -0
  39. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_transport.py +0 -0
  40. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_urls.py +0 -0
  41. {boxd-0.2.8 → boxd-0.2.9.dev452}/tests/test_version_check.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boxd
3
- Version: 0.2.8
3
+ Version: 0.2.9.dev452
4
4
  Summary: Python SDK for the boxd cloud VM platform
5
5
  Author: Azin
6
6
  License-Expression: MIT
@@ -112,6 +112,12 @@ The first of these that is present wins:
112
112
  If your key is revoked mid-session, the SDK fails fast with
113
113
  `AuthenticationError` rather than retrying.
114
114
 
115
+ The exchange endpoint is **rate-limited per source IP** (30 requests / 60s). A
116
+ session token is valid for one hour, so a fleet of workers behind one NAT
117
+ should **mint one token and share it** (`Boxd(token=...)`) rather than each
118
+ process exchanging its own key. On a 429 the SDK waits out one `Retry-After`
119
+ before raising `RateLimitError`.
120
+
115
121
  ### Inside a machine
116
122
 
117
123
  Inside a boxd machine, `Boxd()` authenticates automatically — no API key
@@ -400,7 +406,9 @@ data = boxd.machines.files.download(id, "/app/output.json") # bytes
400
406
  ```
401
407
 
402
408
  `upload` takes `str` or `bytes`, streams it in chunks so large files are fine,
403
- and returns the number of bytes the machine confirmed it wrote.
409
+ and returns the number of bytes the machine confirmed it wrote. `download`
410
+ streams too and returns the whole file as `bytes` — there is no size cap, but
411
+ it is all held in memory.
404
412
 
405
413
  ### Ports and proxies
406
414
 
@@ -80,6 +80,12 @@ The first of these that is present wins:
80
80
  If your key is revoked mid-session, the SDK fails fast with
81
81
  `AuthenticationError` rather than retrying.
82
82
 
83
+ The exchange endpoint is **rate-limited per source IP** (30 requests / 60s). A
84
+ session token is valid for one hour, so a fleet of workers behind one NAT
85
+ should **mint one token and share it** (`Boxd(token=...)`) rather than each
86
+ process exchanging its own key. On a 429 the SDK waits out one `Retry-After`
87
+ before raising `RateLimitError`.
88
+
83
89
  ### Inside a machine
84
90
 
85
91
  Inside a boxd machine, `Boxd()` authenticates automatically — no API key
@@ -368,7 +374,9 @@ data = boxd.machines.files.download(id, "/app/output.json") # bytes
368
374
  ```
369
375
 
370
376
  `upload` takes `str` or `bytes`, streams it in chunks so large files are fine,
371
- and returns the number of bytes the machine confirmed it wrote.
377
+ and returns the number of bytes the machine confirmed it wrote. `download`
378
+ streams too and returns the whole file as `bytes` — there is no size cap, but
379
+ it is all held in memory.
372
380
 
373
381
  ### Ports and proxies
374
382
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "boxd"
3
- version = "0.2.8"
3
+ version = "0.2.9.dev452"
4
4
  description = "Python SDK for the boxd cloud VM platform"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -26,7 +26,7 @@ from typing import Any
26
26
 
27
27
  import httpx
28
28
 
29
- from .errors import AuthenticationError
29
+ from .errors import AuthenticationError, RateLimitError
30
30
 
31
31
  # The in-VM metadata adapter (`crates/boxd-worker/src/metadata.rs`) listens on
32
32
  # the VM's default gateway.
@@ -125,7 +125,11 @@ def parse_exchange(status_code: int, body: str, json: Any) -> tuple[str, float]:
125
125
  if status_code == 401:
126
126
  raise AuthenticationError("invalid or expired API key")
127
127
  if status_code == 429:
128
- raise AuthenticationError("rate limit exceeded — try again later")
128
+ raise RateLimitError(
129
+ "token exchange rate limit exceeded"
130
+ + (f": {body}" if body else "")
131
+ + " — a token is valid for 1 hour; reuse one across your workers"
132
+ )
129
133
  if status_code != 200:
130
134
  raise AuthenticationError(f"exchange failed: {status_code} {body}")
131
135
  try:
@@ -155,6 +159,15 @@ def _expired(expires_at: float, skew: float) -> bool:
155
159
  return time.time() > expires_at - skew
156
160
 
157
161
 
162
+ def _retry_after_secs(resp: httpx.Response) -> float:
163
+ """Seconds to wait per the ``Retry-After`` header — capped at 60, default 5."""
164
+ try:
165
+ secs = float(resp.headers.get("retry-after", ""))
166
+ except ValueError:
167
+ return 5.0
168
+ return min(max(secs, 0.0), 60.0) or 5.0
169
+
170
+
158
171
  # ── Credential stores ────────────────────────────────────────────────
159
172
 
160
173
 
@@ -208,14 +221,25 @@ class SyncCredentials(_CredentialsBase):
208
221
  return self._cached
209
222
 
210
223
  def _exchange(self) -> None:
211
- try:
212
- with httpx.Client(timeout=_HTTP_TIMEOUT_SECS) as client:
213
- resp = client.post(self._exchange_url, json={"api_key": self._api_key})
214
- except httpx.HTTPError as e:
215
- raise AuthenticationError(f"could not reach {self._exchange_url}: {e}") from e
216
- self._cached, self._expires_at = parse_exchange(
217
- resp.status_code, resp.text, _json_or_none(resp)
218
- )
224
+ for attempt in range(2):
225
+ try:
226
+ with httpx.Client(timeout=_HTTP_TIMEOUT_SECS) as client:
227
+ resp = client.post(
228
+ self._exchange_url, json={"api_key": self._api_key}
229
+ )
230
+ except httpx.HTTPError as e:
231
+ raise AuthenticationError(
232
+ f"could not reach {self._exchange_url}: {e}"
233
+ ) from e
234
+ # The exchange endpoint is rate-limited per source IP; a NATed fleet
235
+ # can trip it legitimately. Wait out one Retry-After before failing.
236
+ if resp.status_code == 429 and attempt == 0:
237
+ time.sleep(_retry_after_secs(resp))
238
+ continue
239
+ self._cached, self._expires_at = parse_exchange(
240
+ resp.status_code, resp.text, _json_or_none(resp)
241
+ )
242
+ return
219
243
 
220
244
  def _mint_from_vm(self) -> None:
221
245
  base = self._metadata_base()
@@ -260,16 +284,25 @@ class AsyncCredentials(_CredentialsBase):
260
284
  return self._cached
261
285
 
262
286
  async def _exchange(self) -> None:
263
- try:
264
- async with httpx.AsyncClient(timeout=_HTTP_TIMEOUT_SECS) as client:
265
- resp = await client.post(
266
- self._exchange_url, json={"api_key": self._api_key}
267
- )
268
- except httpx.HTTPError as e:
269
- raise AuthenticationError(f"could not reach {self._exchange_url}: {e}") from e
270
- self._cached, self._expires_at = parse_exchange(
271
- resp.status_code, resp.text, _json_or_none(resp)
272
- )
287
+ for attempt in range(2):
288
+ try:
289
+ async with httpx.AsyncClient(timeout=_HTTP_TIMEOUT_SECS) as client:
290
+ resp = await client.post(
291
+ self._exchange_url, json={"api_key": self._api_key}
292
+ )
293
+ except httpx.HTTPError as e:
294
+ raise AuthenticationError(
295
+ f"could not reach {self._exchange_url}: {e}"
296
+ ) from e
297
+ # The exchange endpoint is rate-limited per source IP; a NATed fleet
298
+ # can trip it legitimately. Wait out one Retry-After before failing.
299
+ if resp.status_code == 429 and attempt == 0:
300
+ await asyncio.sleep(_retry_after_secs(resp))
301
+ continue
302
+ self._cached, self._expires_at = parse_exchange(
303
+ resp.status_code, resp.text, _json_or_none(resp)
304
+ )
305
+ return
273
306
 
274
307
  async def _mint_from_vm(self) -> None:
275
308
  base = await self._metadata_base()
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tapi.proto\x12\x0b\x62oxd.api.v1\"\xbf\x01\n\x08VmConfig\x12\x0c\n\x04vcpu\x18\x01 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x02 \x01(\x04\x12\x12\n\ndisk_bytes\x18\x03 \x01(\x04\x12#\n\x03srf\x18\x04 \x01(\x0b\x32\x16.boxd.api.v1.SrfConfig\x12+\n\x07network\x18\x05 \x01(\x0b\x32\x1a.boxd.api.v1.NetworkConfig\x12)\n\x07volumes\x18\x06 \x03(\x0b\x32\x18.boxd.api.v1.VolumeMount\"t\n\tSrfConfig\x12&\n\x19\x61uto_suspend_timeout_secs\x18\x01 \x01(\rH\x00\x88\x01\x01\x12!\n\x19\x61uto_destroy_timeout_secs\x18\x02 \x01(\rB\x1c\n\x1a_auto_suspend_timeout_secs\"F\n\rNetworkConfig\x12\x0b\n\x03ssh\x18\x01 \x01(\x08\x12(\n\x07proxies\x18\x02 \x03(\x0b\x32\x17.boxd.api.v1.ProxyEntry\"(\n\nProxyEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\"E\n\x0bVolumeMount\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\x12\n\nmount_path\x18\x02 \x01(\t\x12\x11\n\tread_only\x18\x03 \x01(\x08\"\xfb\x01\n\x0f\x43reateVmRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\timage_ref\x18\x02 \x01(\t\x12 \n\x03\x65nv\x18\x05 \x03(\x0b\x32\x13.boxd.api.v1.EnvVar\x12\x0b\n\x03\x63md\x18\x06 \x03(\t\x12\x16\n\x0erestart_policy\x18\x07 \x01(\t\x12%\n\x06\x63onfig\x18\x08 \x01(\x0b\x32\x15.boxd.api.v1.VmConfig\x12\x0b\n\x03org\x18\t \x01(\t\x12\x0e\n\x06shared\x18\n \x01(\x08\x12\x10\n\x08networks\x18\x0b \x03(\t\x12\x10\n\x08isolated\x18\x0c \x01(\x08\x12\x0c\n\x04team\x18\r \x01(\tJ\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\"$\n\x06\x45nvVar\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x84\x01\n\x10\x43reateVmResponse\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\tpublic_ip\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\x12\r\n\x05image\x18\x05 \x01(\t\x12\x0e\n\x06status\x18\x06 \x01(\t\x12\x14\n\x0c\x62oot_time_ms\x18\x07 \x01(\x04\"!\n\x10\x44\x65stroyVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x13\n\x11\x44\x65stroyVmResponse\"\x16\n\x14SuggestVmNameRequest\"%\n\x15SuggestVmNameResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\"2\n\x0fRenameVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\" \n\x10RenameVmResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\"7\n\x14SetVmNetworksRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x10\n\x08networks\x18\x02 \x03(\t\")\n\x15SetVmNetworksResponse\x12\x10\n\x08networks\x18\x01 \x03(\t\"U\n\x11\x45xposePortRequest\x12\x11\n\x05vm_id\x18\x01 \x01(\tB\x02\x18\x01\x12\x0f\n\x07vm_port\x18\x02 \x01(\r\x12\x10\n\x08protocol\x18\x03 \x01(\t\x12\n\n\x02vm\x18\x04 \x01(\t\"y\n\x12\x45xposePortResponse\x12\x0f\n\x07vm_name\x18\x01 \x01(\t\x12\x0b\n\x03\x64ns\x18\x02 \x01(\t\x12\x13\n\x0bpublic_port\x18\x03 \x01(\r\x12\x0f\n\x07vm_port\x18\x04 \x01(\r\x12\x10\n\x08protocol\x18\x05 \x01(\t\x12\r\n\x05vm_id\x18\x06 \x01(\t\"E\n\x13UnexposePortRequest\x12\x11\n\x05vm_id\x18\x01 \x01(\tB\x02\x18\x01\x12\x0f\n\x07vm_port\x18\x02 \x01(\r\x12\n\n\x02vm\x18\x03 \x01(\t\"H\n\x14UnexposePortResponse\x12\x30\n\x07\x66orward\x18\x01 \x01(\x0b\x32\x1f.boxd.api.v1.ExposePortResponse\"%\n\x17ListExposedPortsRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"M\n\x18ListExposedPortsResponse\x12\x31\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x1f.boxd.api.v1.ExposePortResponse\"\\\n\rSetVarRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05value\x18\x04 \x01(\t\x12\r\n\x05scope\x18\x05 \x01(\tJ\x04\x08\x06\x10\x07\"\x1b\n\x08VarReply\x12\x0f\n\x07message\x18\x01 \x01(\t\",\n\x0fListVarsRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\"O\n\x07VarItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\r\n\x05scope\x18\x03 \x01(\t\x12\r\n\x05value\x18\x04 \x01(\tJ\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07\"2\n\x0cVarListReply\x12\"\n\x04vars\x18\x01 \x03(\x0b\x32\x14.boxd.api.v1.VarItem\"J\n\x10RemoveVarRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05scope\x18\x04 \x01(\t\"L\n\x15SetSecretScopeRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04\x66rom\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\"\x1f\n\x0eStartVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x11\n\x0fStartVmResponse\"\x1e\n\rStopVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x10\n\x0eStopVmResponse\" \n\x0fRebootVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x12\n\x10RebootVmResponse\"!\n\x10SuspendVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\'\n\x11SuspendVmResponse\x12\x12\n\nsuspend_us\x18\x01 \x01(\x04\" \n\x0fResumeVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"%\n\x10ResumeVmResponse\x12\x11\n\tresume_us\x18\x01 \x01(\x04\"#\n\x12HibernateVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x15\n\x13HibernateVmResponse\"\x1e\n\rWakeVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x10\n\x0eWakeVmResponse\"\x1d\n\x0cGetVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x86\x05\n\rGetVmResponse\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\timage_ref\x18\x03 \x01(\t\x12\x11\n\tpublic_ip\x18\x04 \x01(\t\x12\x0e\n\x06status\x18\x05 \x01(\t\x12\x16\n\x0erestart_policy\x18\x06 \x01(\t\x12\x12\n\ndisk_bytes\x18\x07 \x01(\x04\x12!\n\x19\x61uto_suspend_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08ssh_port\x18\t \x01(\r\x12\x0b\n\x03org\x18\n \x01(\t\x12\x13\n\x0b\x62illing_org\x18\x0b \x01(\t\x12\x15\n\raccess_domain\x18\x0c \x01(\t\x12#\n\x1b\x61uto_hibernate_timeout_secs\x18\r \x01(\r\x12\x0e\n\x06source\x18\x0e \x01(\t\x12\x0c\n\x04vcpu\x18\x0f \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x10 \x01(\x04\x12\x12\n\ncreated_at\x18\x11 \x01(\x03\x12\x18\n\x10hibernated_at_ms\x18\x12 \x01(\x03\x12!\n\x19\x61uto_destroy_timeout_secs\x18\x13 \x01(\r\x12\x14\n\x0c\x62oot_time_ms\x18\x14 \x01(\x03\x12\x19\n\x11last_connected_ms\x18\x15 \x01(\x03\x12\x0e\n\x06org_id\x18\x16 \x01(\t\x12\x16\n\x0e\x62illing_org_id\x18\x17 \x01(\t\x12*\n\x0bsource_info\x18\x18 \x01(\x0b\x32\x15.boxd.api.v1.VmSource\x12\x10\n\x08networks\x18\x19 \x03(\t\x12\x10\n\x08isolated\x18\x1a \x01(\x08\x12\x35\n\x0e\x63ustom_domains\x18\x1b \x03(\x0b\x32\x1d.boxd.api.v1.CustomDomainInfo\"C\n\x08VmSource\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x04\x12\n\n\x02id\x18\x04 \x01(\t\"3\n\x0eListVmsRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x14\n\x0c\x61ll_contexts\x18\x02 \x01(\x08\"P\n\x0fListVmsResponse\x12\'\n\x03vms\x18\x01 \x03(\x0b\x32\x1a.boxd.api.v1.GetVmResponse\x12\x14\n\x0cssh_host_key\x18\x02 \x01(\t\"2\n\x11StreamLogsRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66ollow\x18\x02 \x01(\x08\"\x18\n\x08LogChunk\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\xc1\x01\n\tExecChunk\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\r\n\x05stdin\x18\x02 \x01(\x08\x12\x0b\n\x03tty\x18\x03 \x01(\x08\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\t\x12\r\n\x05vm_id\x18\x05 \x01(\t\x12\x11\n\texit_code\x18\x06 \x01(\x05\x12\x0c\n\x04\x63ols\x18\x07 \x01(\r\x12\x0c\n\x04rows\x18\x08 \x01(\r\x12\x15\n\rwindow_change\x18\t \x01(\x08\x12\x11\n\tis_stderr\x18\n \x01(\x08\x12\x11\n\tdevice_id\x18\x0b \x01(\t\"+\n\x0c\x44\x65sktopChunk\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"$\n\x14\x43reateNetworkRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"+\n\x15\x43reateNetworkResponse\x12\x12\n\nnetwork_id\x18\x01 \x01(\t\"\x15\n\x13ListNetworksRequest\"B\n\x14ListNetworksResponse\x12*\n\x08networks\x18\x01 \x03(\x0b\x32\x18.boxd.api.v1.NetworkInfo\"A\n\x0bNetworkInfo\x12\x12\n\nnetwork_id\x18\x01 \x01(\t\x12\x0e\n\x06subnet\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\"7\n\x16\x41\x64\x64\x43ustomDomainRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\"H\n\x17\x41\x64\x64\x43ustomDomainResponse\x12-\n\x06\x64omain\x18\x01 \x01(\x0b\x32\x1d.boxd.api.v1.CustomDomainInfo\"\x1a\n\x18ListCustomDomainsRequest\"K\n\x19ListCustomDomainsResponse\x12.\n\x07\x64omains\x18\x01 \x03(\x0b\x32\x1d.boxd.api.v1.CustomDomainInfo\"+\n\x19RemoveCustomDomainRequest\x12\x0e\n\x06\x64omain\x18\x01 \x01(\t\"\x1c\n\x1aRemoveCustomDomainResponse\"f\n\x10\x43ustomDomainInfo\x12\x0e\n\x06\x64omain\x18\x01 \x01(\t\x12\r\n\x05vm_id\x18\x02 \x01(\t\x12\x0f\n\x07vm_name\x18\x03 \x01(\t\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x12\n\nlast_error\x18\x05 \x01(\t\"5\n\x13SetOrgDomainRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\"B\n\x14SetOrgDomainResponse\x12*\n\x06\x64omain\x18\x01 \x01(\x0b\x32\x1a.boxd.api.v1.OrgDomainInfo\"%\n\x13GetOrgDomainRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"B\n\x14GetOrgDomainResponse\x12*\n\x06\x64omain\x18\x01 \x01(\x0b\x32\x1a.boxd.api.v1.OrgDomainInfo\"\'\n\x15\x43learOrgDomainRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"\x18\n\x16\x43learOrgDomainResponse\"S\n\rOrgDomainInfo\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x12\n\nlast_error\x18\x04 \x01(\t\"\x12\n\x10GetConfigRequest\"8\n\x11GetConfigResponse\x12\x15\n\rdefault_image\x18\x01 \x01(\t\x12\x0c\n\x04zone\x18\x02 \x01(\t\"\x0f\n\rWhoamiRequest\"\x99\x01\n\x0eWhoamiResponse\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x1b\n\x13pubkey_fingerprints\x18\x02 \x03(\t\x12)\n\x07\x62illing\x18\x04 \x01(\x0b\x32\x18.boxd.api.v1.BillingInfo\x12\x14\n\x0c\x64isplay_name\x18\x05 \x01(\tJ\x04\x08\x03\x10\x04R\x12\x64\x65\x66\x61ult_network_id\"\xf9\x01\n\x0b\x42illingInfo\x12\x1b\n\x13subscription_status\x18\x03 \x01(\t\x12\x16\n\x0epast_due_since\x18\x06 \x01(\x03\x12\x0f\n\x07max_vms\x18\x07 \x01(\r\x12\x0c\n\x04vcpu\x18\x08 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\t \x01(\x04\x12\x19\n\x11\x62\x61lance_micro_eur\x18\n \x01(\x03\x12\x14\n\x0c\x62illing_mode\x18\x0b \x01(\tJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06R\x04tierR\x05shapeR\x12stripe_customer_idR\x16stripe_subscription_id\"\x12\n\x10ListPlansRequest\"9\n\x11ListPlansResponse\x12$\n\x05plans\x18\x01 \x03(\x0b\x32\x15.boxd.api.v1.PlanInfo\"\x85\x01\n\x08PlanInfo\x12\x13\n\x0bmonthly_eur\x18\x03 \x01(\r\x12\x12\n\nlookup_key\x18\x04 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\x12\x0c\n\x04vcpu\x18\x06 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x07 \x01(\x04J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x04tierR\x05shape\"\x13\n\x11GetBillingRequest\"?\n\x12GetBillingResponse\x12)\n\x07\x62illing\x18\x01 \x01(\x0b\x32\x18.boxd.api.v1.BillingInfo\"T\n\x1c\x43reateCheckoutSessionRequest\x12\x13\n\x0bsuccess_url\x18\x02 \x01(\t\x12\x12\n\ncancel_url\x18\x03 \x01(\tJ\x04\x08\x01\x10\x02R\x05shape\"5\n\x1d\x43reateCheckoutSessionResponse\x12\x14\n\x0c\x63heckout_url\x18\x01 \x01(\t\"7\n!CreateBillingPortalSessionRequest\x12\x12\n\nreturn_url\x18\x01 \x01(\t\"8\n\"CreateBillingPortalSessionResponse\x12\x12\n\nportal_url\x18\x01 \x01(\t\"-\n\x12\x43reateTokenRequest\x12\x17\n\x0f\x65xpires_in_secs\x18\x01 \x01(\x04\"8\n\x13\x43reateTokenResponse\x12\r\n\x05token\x18\x01 \x01(\t\x12\x12\n\nexpires_at\x18\x02 \x01(\x03\"\x13\n\x11ListTokensRequest\"<\n\x12ListTokensResponse\x12&\n\x06tokens\x18\x01 \x03(\x0b\x32\x16.boxd.api.v1.TokenInfo\"@\n\tTokenInfo\x12\x0b\n\x03jti\x18\x01 \x01(\t\x12\x12\n\ncreated_at\x18\x02 \x01(\x03\x12\x12\n\nexpires_at\x18\x03 \x01(\x03\"!\n\x12RevokeTokenRequest\x12\x0b\n\x03jti\x18\x01 \x01(\t\"\x15\n\x13RevokeTokenResponse\"E\n\x11LinkSshKeyRequest\x12\x0e\n\x06pubkey\x18\x01 \x01(\t\x12\x11\n\tdevice_id\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\"\x14\n\x12LinkSshKeyResponse\"\x8e\x01\n\rForkVmRequest\x12\x14\n\x0csource_vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12%\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x15.boxd.api.v1.VmConfig\x12\x0e\n\x06shared\x18\x04 \x01(\x08\x12\x10\n\x08networks\x18\x05 \x03(\t\x12\x10\n\x08isolated\x18\x06 \x01(\x08\"\x97\x01\n\x0e\x46orkVmResponse\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\tpublic_ip\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\x12\r\n\x05image\x18\x05 \x01(\t\x12\x0e\n\x06status\x18\x06 \x01(\t\x12\x13\n\x0b\x66orked_from\x18\x07 \x01(\t\x12\x14\n\x0c\x62oot_time_ms\x18\x08 \x01(\x04\"5\n\x12ListProxiesRequest\x12\x13\n\x07vm_name\x18\x01 \x01(\tB\x02\x18\x01\x12\n\n\x02vm\x18\x02 \x01(\t\">\n\x13ListProxiesResponse\x12\'\n\x07proxies\x18\x01 \x03(\x0b\x32\x16.boxd.api.v1.ProxyInfo\"\xac\x01\n\tProxyInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07vm_name\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\r\x12\x12\n\nis_default\x18\x05 \x01(\x08\x12\x14\n\x0cport_display\x18\x06 \x01(\t\x12\r\n\x05vm_id\x18\x07 \x01(\t\x12\x11\n\tport_mode\x18\x08 \x01(\t\x12\x16\n\x0e\x65\x66\x66\x65\x63tive_port\x18\t \x01(\r\"\x17\n\x15ListProxyNodesRequest\"E\n\x16ListProxyNodesResponse\x12+\n\x07proxies\x18\x01 \x03(\x0b\x32\x1a.boxd.api.v1.ProxyNodeInfo\")\n\rProxyNodeInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04ipv4\x18\x02 \x01(\t\"Q\n\x12\x43reateProxyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07vm_name\x18\x02 \x01(\tB\x02\x18\x01\x12\x0c\n\x04port\x18\x03 \x01(\r\x12\n\n\x02vm\x18\x04 \x01(\t\"R\n\x13\x43reateProxyResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07vm_name\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\r\"C\n\x12\x44\x65leteProxyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07vm_name\x18\x02 \x01(\tB\x02\x18\x01\x12\n\n\x02vm\x18\x03 \x01(\t\"\x15\n\x13\x44\x65leteProxyResponse\"R\n\x13SetProxyPortRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07vm_name\x18\x02 \x01(\tB\x02\x18\x01\x12\x0c\n\x04port\x18\x03 \x01(\t\x12\n\n\x02vm\x18\x04 \x01(\t\"\x16\n\x14SetProxyPortResponse\">\n\x11UploadFileRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\"+\n\x12UploadFileResponse\x12\x15\n\rbytes_written\x18\x01 \x01(\x04\"P\n\x0fUploadFileChunk\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x04\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\"2\n\x13\x44ownloadFileRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"$\n\x14\x44ownloadFileResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"1\n\x15\x43reateSnapshotRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\\\n\x16\x43reateSnapshotResponse\x12\x13\n\x0bsnapshot_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\t\"#\n\x14ListSnapshotsRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\"E\n\x15ListSnapshotsResponse\x12,\n\tsnapshots\x18\x01 \x03(\x0b\x32\x19.boxd.api.v1.SnapshotInfo\"/\n\x12GetSnapshotRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03org\x18\x02 \x01(\t\"B\n\x13GetSnapshotResponse\x12+\n\x08snapshot\x18\x01 \x01(\x0b\x32\x19.boxd.api.v1.SnapshotInfo\"2\n\x15\x44\x65leteSnapshotRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03org\x18\x02 \x01(\t\"\x18\n\x16\x44\x65leteSnapshotResponse\"\x83\x01\n\x1b\x43reateVmFromSnapshotRequest\x12\x10\n\x08snapshot\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12%\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x15.boxd.api.v1.VmConfig\x12\x0b\n\x03org\x18\x04 \x01(\t\x12\x10\n\x08isolated\x18\x05 \x01(\x08\"\xf3\x01\n\x0cSnapshotInfo\x12\x13\n\x0bsnapshot_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x12\n\nsize_bytes\x18\x07 \x01(\x04\x12\x12\n\nupdated_at\x18\x08 \x01(\x03\x12\x0c\n\x04vcpu\x18\t \x01(\r\x12\x14\n\x0cmemory_bytes\x18\n \x01(\x04\x12\x11\n\tuse_count\x18\x0b \x01(\x04\x12\x12\n\ncreated_at\x18\x0c \x01(\x03J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07R\x0eready_replicasR\x10\x64\x65sired_replicas\"3\n\x17\x43reateCheckpointRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"O\n\x18\x43reateCheckpointResponse\x12\x15\n\rcheckpoint_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\"$\n\x16ListCheckpointsRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"K\n\x17ListCheckpointsResponse\x12\x30\n\x0b\x63heckpoints\x18\x01 \x03(\x0b\x32\x1b.boxd.api.v1.CheckpointInfo\"3\n\x17\x44\x65leteCheckpointRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x1a\n\x18\x44\x65leteCheckpointResponse\"4\n\x18RestoreCheckpointRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x1b\n\x19RestoreCheckpointResponse\"\x94\x01\n\x0e\x43heckpointInfo\x12\x15\n\rcheckpoint_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x12\n\nsize_bytes\x18\x04 \x01(\x04\x12\x12\n\ncreated_at\x18\x05 \x01(\x03\x12\x12\n\ncreated_by\x18\x06 \x01(\t\x12\x11\n\tavailable\x18\x07 \x01(\x08\";\n\x11\x43reateDiskRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x04J\x04\x08\x03\x10\x04\"]\n\x12\x43reateDiskResponse\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nsize_bytes\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\tJ\x04\x08\x05\x10\x06\"\x12\n\x10ListDisksRequest\"9\n\x11ListDisksResponse\x12$\n\x05\x64isks\x18\x01 \x03(\x0b\x32\x15.boxd.api.v1.DiskInfo\"\xaa\x01\n\x08\x44iskInfo\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nsize_bytes\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x30\n\x0b\x61ttachments\x18\x06 \x03(\x0b\x32\x1b.boxd.api.v1.DiskAttachment\x12\x12\n\ncreated_at\x18\x08 \x01(\x03J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08R\tworker_id\"X\n\x0e\x44iskAttachment\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0f\n\x07vm_name\x18\x02 \x01(\t\x12\x12\n\nmount_path\x18\x03 \x01(\t\x12\x12\n\nmount_mode\x18\x04 \x01(\t\"Z\n\x11\x41ttachDiskRequest\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\r\n\x05vm_id\x18\x02 \x01(\t\x12\x12\n\nmount_path\x18\x03 \x01(\t\x12\x11\n\tread_only\x18\x04 \x01(\x08\"\x14\n\x12\x41ttachDiskResponse\"3\n\x11\x44\x65tachDiskRequest\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\r\n\x05vm_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65tachDiskResponse\"%\n\x12\x44\x65stroyDiskRequest\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\"\x15\n\x13\x44\x65stroyDiskResponse\"C\n\x1cSetAutoSuspendTimeoutRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x14\n\x0ctimeout_secs\x18\x02 \x01(\r\"\x1f\n\x1dSetAutoSuspendTimeoutResponse\"E\n\x1eSetAutoHibernateTimeoutRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x14\n\x0ctimeout_secs\x18\x02 \x01(\r\"!\n\x1fSetAutoHibernateTimeoutResponse\"W\n\x13\x43reateApiKeyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\x0f\x65xpires_in_secs\x18\x02 \x01(\x04\x12\x0b\n\x03org\x18\x03 \x01(\t\x12\x0c\n\x04kind\x18\x04 \x01(\t\"G\n\x14\x43reateApiKeyResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0f\n\x07\x61pi_key\x18\x02 \x01(\t\x12\x12\n\nexpires_at\x18\x03 \x01(\x03\"\x14\n\x12ListApiKeysRequest\"<\n\x13ListApiKeysResponse\x12%\n\x04keys\x18\x01 \x03(\x0b\x32\x17.boxd.api.v1.ApiKeyInfo\"\x93\x01\n\nApiKeyInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nkey_prefix\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x14\n\x0clast_used_at\x18\x05 \x01(\x03\x12\x12\n\nexpires_at\x18\x06 \x01(\x03\x12\x0b\n\x03org\x18\x07 \x01(\t\x12\x0c\n\x04kind\x18\x08 \x01(\t\"!\n\x13\x44\x65leteApiKeyRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\x16\n\x14\x44\x65leteApiKeyResponse\"\x1f\n\x0eShareVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x11\n\x0fShareVmResponse\"\x11\n\x0fListOrgsRequest\"W\n\x10ListOrgsResponse\x12%\n\x04orgs\x18\x01 \x03(\x0b\x32\x17.boxd.api.v1.OrgSummary\x12\x16\n\x0e\x64\x65\x66\x61ult_org_id\x18\x03 \x01(\tJ\x04\x08\x02\x10\x03\"F\n\nOrgSummary\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08is_admin\x18\x03 \x01(\x08\x12\x0c\n\x04slug\x18\x04 \x01(\t\"#\n\x14GetOrgBillingRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\"\x9a\x02\n\x15GetOrgBillingResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08is_admin\x18\x03 \x01(\x08\x12\x0f\n\x07max_vms\x18\x04 \x01(\r\x12\x0c\n\x04vcpu\x18\x05 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x06 \x01(\x04\x12\x10\n\x08vm_count\x18\x07 \x01(\r\x12%\n\x03vms\x18\x08 \x03(\x0b\x32\x18.boxd.api.v1.OrgBilledVm\x12\x19\n\x11\x62\x61lance_micro_eur\x18\t \x01(\x03\x12\x14\n\x0c\x62illing_mode\x18\n \x01(\t\x12\x1f\n\x12\x61\x63\x63ruing_micro_eur\x18\x0b \x01(\x03H\x00\x88\x01\x01\x42\x15\n\x13_accruing_micro_eur\"l\n\x0bOrgBilledVm\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05owner\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x0f\n\x07\x62illing\x18\x05 \x01(\t\x12\x12\n\nowner_name\x18\x06 \x01(\tJ\x04\x08\x04\x10\x05R\x05shape\"!\n\x10UnshareVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x13\n\x11UnshareVmResponse\"m\n\x18SetBackupScheduleRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x15\n\rschedule_kind\x18\x02 \x01(\t\x12\x16\n\x0eschedule_value\x18\x03 \x01(\t\x12\x16\n\x0eretention_secs\x18\x04 \x01(\r\"\x1b\n\x19SetBackupScheduleResponse\"(\n\x1a\x43learBackupScheduleRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"\x1d\n\x1b\x43learBackupScheduleResponse\"&\n\x18GetBackupScheduleRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"\xa3\x01\n\x19GetBackupScheduleResponse\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x15\n\rschedule_kind\x18\x02 \x01(\t\x12\x16\n\x0eschedule_value\x18\x03 \x01(\t\x12\x16\n\x0eretention_secs\x18\x04 \x01(\r\x12\x16\n\x0enext_backup_at\x18\x05 \x01(\x03\x12\x16\n\x0elast_backup_at\x18\x06 \x01(\x03\" \n\x12ListBackupsRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"\x9a\x01\n\nBackupInfo\x12\x11\n\tbackup_id\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\nsize_bytes\x18\x03 \x01(\x04\x12\x10\n\x08\x63hecksum\x18\x04 \x01(\t\x12\x1b\n\x13points_to_backup_id\x18\x05 \x01(\t\x12\x12\n\ncreated_at\x18\x06 \x01(\x03\x12\x12\n\nexpires_at\x18\x07 \x01(\x03\"?\n\x13ListBackupsResponse\x12(\n\x07\x62\x61\x63kups\x18\x01 \x03(\x0b\x32\x17.boxd.api.v1.BackupInfo\"5\n\x14RestoreBackupRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x11\n\tbackup_id\x18\x02 \x01(\t\"\x17\n\x15RestoreBackupResponse\"\x87\x01\n\x1bSetOrgBackupsDefaultRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x18\n\x0bperiod_secs\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eretention_secs\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_period_secsB\x11\n\x0f_retention_secs\"\\\n\x1cSetOrgBackupsDefaultResponse\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x13\n\x0bperiod_secs\x18\x02 \x01(\r\x12\x16\n\x0eretention_secs\x18\x03 \x01(\r\"-\n\x1bGetOrgBackupsDefaultRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"\\\n\x1cGetOrgBackupsDefaultResponse\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x13\n\x0bperiod_secs\x18\x02 \x01(\r\x12\x16\n\x0eretention_secs\x18\x03 \x01(\r\"v\n\x1cSetOrgMachineDefaultsRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x11\n\x04vcpu\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x03 \x01(\x04H\x01\x88\x01\x01\x42\x07\n\x05_vcpuB\x0f\n\r_memory_bytes\"\x1f\n\x1dSetOrgMachineDefaultsResponse\".\n\x1cGetOrgMachineDefaultsRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"D\n\x0fResizeVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04vcpu\x18\x02 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x03 \x01(\x04\"H\n\x10ResizeVmResponse\x12\x0c\n\x04vcpu\x18\x01 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x02 \x01(\x04\x12\x10\n\x08rebooted\x18\x03 \x01(\x08\"\x84\x01\n\x1dGetOrgMachineDefaultsResponse\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0c\n\x04vcpu\x18\x02 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x03 \x01(\x04\x12\x14\n\x0c\x63\x65iling_vcpu\x18\x04 \x01(\r\x12\x1c\n\x14\x63\x65iling_memory_bytes\x18\x05 \x01(\x04\x32\xda\x37\n\x07\x42oxdApi\x12G\n\x08\x43reateVm\x12\x1c.boxd.api.v1.CreateVmRequest\x1a\x1d.boxd.api.v1.CreateVmResponse\x12J\n\tDestroyVm\x12\x1d.boxd.api.v1.DestroyVmRequest\x1a\x1e.boxd.api.v1.DestroyVmResponse\x12G\n\x08RenameVm\x12\x1c.boxd.api.v1.RenameVmRequest\x1a\x1d.boxd.api.v1.RenameVmResponse\x12V\n\rSetVmNetworks\x12!.boxd.api.v1.SetVmNetworksRequest\x1a\".boxd.api.v1.SetVmNetworksResponse\x12\x44\n\x07StartVm\x12\x1b.boxd.api.v1.StartVmRequest\x1a\x1c.boxd.api.v1.StartVmResponse\x12\x41\n\x06StopVm\x12\x1a.boxd.api.v1.StopVmRequest\x1a\x1b.boxd.api.v1.StopVmResponse\x12G\n\x08RebootVm\x12\x1c.boxd.api.v1.RebootVmRequest\x1a\x1d.boxd.api.v1.RebootVmResponse\x12>\n\x05GetVm\x12\x19.boxd.api.v1.GetVmRequest\x1a\x1a.boxd.api.v1.GetVmResponse\x12\x44\n\x07ListVms\x12\x1b.boxd.api.v1.ListVmsRequest\x1a\x1c.boxd.api.v1.ListVmsResponse\x12V\n\rSuggestVmName\x12!.boxd.api.v1.SuggestVmNameRequest\x1a\".boxd.api.v1.SuggestVmNameResponse\x12M\n\nExposePort\x12\x1e.boxd.api.v1.ExposePortRequest\x1a\x1f.boxd.api.v1.ExposePortResponse\x12S\n\x0cUnexposePort\x12 .boxd.api.v1.UnexposePortRequest\x1a!.boxd.api.v1.UnexposePortResponse\x12_\n\x10ListExposedPorts\x12$.boxd.api.v1.ListExposedPortsRequest\x1a%.boxd.api.v1.ListExposedPortsResponse\x12;\n\x06SetVar\x12\x1a.boxd.api.v1.SetVarRequest\x1a\x15.boxd.api.v1.VarReply\x12\x43\n\x08ListVars\x12\x1c.boxd.api.v1.ListVarsRequest\x1a\x19.boxd.api.v1.VarListReply\x12\x41\n\tRemoveVar\x12\x1d.boxd.api.v1.RemoveVarRequest\x1a\x15.boxd.api.v1.VarReply\x12K\n\x0eSetSecretScope\x12\".boxd.api.v1.SetSecretScopeRequest\x1a\x15.boxd.api.v1.VarReply\x12\x45\n\nStreamLogs\x12\x1e.boxd.api.v1.StreamLogsRequest\x1a\x15.boxd.api.v1.LogChunk0\x01\x12:\n\x04\x45xec\x12\x16.boxd.api.v1.ExecChunk\x1a\x16.boxd.api.v1.ExecChunk(\x01\x30\x01\x12I\n\rDesktopTunnel\x12\x19.boxd.api.v1.DesktopChunk\x1a\x19.boxd.api.v1.DesktopChunk(\x01\x30\x01\x12V\n\rCreateNetwork\x12!.boxd.api.v1.CreateNetworkRequest\x1a\".boxd.api.v1.CreateNetworkResponse\x12S\n\x0cListNetworks\x12 .boxd.api.v1.ListNetworksRequest\x1a!.boxd.api.v1.ListNetworksResponse\x12\\\n\x0f\x41\x64\x64\x43ustomDomain\x12#.boxd.api.v1.AddCustomDomainRequest\x1a$.boxd.api.v1.AddCustomDomainResponse\x12\x62\n\x11ListCustomDomains\x12%.boxd.api.v1.ListCustomDomainsRequest\x1a&.boxd.api.v1.ListCustomDomainsResponse\x12\x65\n\x12RemoveCustomDomain\x12&.boxd.api.v1.RemoveCustomDomainRequest\x1a\'.boxd.api.v1.RemoveCustomDomainResponse\x12S\n\x0cSetOrgDomain\x12 .boxd.api.v1.SetOrgDomainRequest\x1a!.boxd.api.v1.SetOrgDomainResponse\x12S\n\x0cGetOrgDomain\x12 .boxd.api.v1.GetOrgDomainRequest\x1a!.boxd.api.v1.GetOrgDomainResponse\x12Y\n\x0e\x43learOrgDomain\x12\".boxd.api.v1.ClearOrgDomainRequest\x1a#.boxd.api.v1.ClearOrgDomainResponse\x12\x41\n\x06Whoami\x12\x1a.boxd.api.v1.WhoamiRequest\x1a\x1b.boxd.api.v1.WhoamiResponse\x12P\n\x0b\x43reateToken\x12\x1f.boxd.api.v1.CreateTokenRequest\x1a .boxd.api.v1.CreateTokenResponse\x12M\n\nListTokens\x12\x1e.boxd.api.v1.ListTokensRequest\x1a\x1f.boxd.api.v1.ListTokensResponse\x12P\n\x0bRevokeToken\x12\x1f.boxd.api.v1.RevokeTokenRequest\x1a .boxd.api.v1.RevokeTokenResponse\x12M\n\nLinkSshKey\x12\x1e.boxd.api.v1.LinkSshKeyRequest\x1a\x1f.boxd.api.v1.LinkSshKeyResponse\x12J\n\tGetConfig\x12\x1d.boxd.api.v1.GetConfigRequest\x1a\x1e.boxd.api.v1.GetConfigResponse\x12\x41\n\x06\x46orkVm\x12\x1a.boxd.api.v1.ForkVmRequest\x1a\x1b.boxd.api.v1.ForkVmResponse\x12P\n\x0bListProxies\x12\x1f.boxd.api.v1.ListProxiesRequest\x1a .boxd.api.v1.ListProxiesResponse\x12Y\n\x0eListProxyNodes\x12\".boxd.api.v1.ListProxyNodesRequest\x1a#.boxd.api.v1.ListProxyNodesResponse\x12P\n\x0b\x43reateProxy\x12\x1f.boxd.api.v1.CreateProxyRequest\x1a .boxd.api.v1.CreateProxyResponse\x12P\n\x0b\x44\x65leteProxy\x12\x1f.boxd.api.v1.DeleteProxyRequest\x1a .boxd.api.v1.DeleteProxyResponse\x12S\n\x0cSetProxyPort\x12 .boxd.api.v1.SetProxyPortRequest\x1a!.boxd.api.v1.SetProxyPortResponse\x12M\n\nUploadFile\x12\x1e.boxd.api.v1.UploadFileRequest\x1a\x1f.boxd.api.v1.UploadFileResponse\x12S\n\x10UploadFileStream\x12\x1c.boxd.api.v1.UploadFileChunk\x1a\x1f.boxd.api.v1.UploadFileResponse(\x01\x12S\n\x0c\x44ownloadFile\x12 .boxd.api.v1.DownloadFileRequest\x1a!.boxd.api.v1.DownloadFileResponse\x12J\n\tSuspendVm\x12\x1d.boxd.api.v1.SuspendVmRequest\x1a\x1e.boxd.api.v1.SuspendVmResponse\x12G\n\x08ResumeVm\x12\x1c.boxd.api.v1.ResumeVmRequest\x1a\x1d.boxd.api.v1.ResumeVmResponse\x12P\n\x0bHibernateVm\x12\x1f.boxd.api.v1.HibernateVmRequest\x1a .boxd.api.v1.HibernateVmResponse\x12\x41\n\x06WakeVm\x12\x1a.boxd.api.v1.WakeVmRequest\x1a\x1b.boxd.api.v1.WakeVmResponse\x12Y\n\x0e\x43reateSnapshot\x12\".boxd.api.v1.CreateSnapshotRequest\x1a#.boxd.api.v1.CreateSnapshotResponse\x12V\n\rListSnapshots\x12!.boxd.api.v1.ListSnapshotsRequest\x1a\".boxd.api.v1.ListSnapshotsResponse\x12P\n\x0bGetSnapshot\x12\x1f.boxd.api.v1.GetSnapshotRequest\x1a .boxd.api.v1.GetSnapshotResponse\x12Y\n\x0e\x44\x65leteSnapshot\x12\".boxd.api.v1.DeleteSnapshotRequest\x1a#.boxd.api.v1.DeleteSnapshotResponse\x12_\n\x14\x43reateVmFromSnapshot\x12(.boxd.api.v1.CreateVmFromSnapshotRequest\x1a\x1d.boxd.api.v1.CreateVmResponse\x12_\n\x10\x43reateCheckpoint\x12$.boxd.api.v1.CreateCheckpointRequest\x1a%.boxd.api.v1.CreateCheckpointResponse\x12\\\n\x0fListCheckpoints\x12#.boxd.api.v1.ListCheckpointsRequest\x1a$.boxd.api.v1.ListCheckpointsResponse\x12_\n\x10\x44\x65leteCheckpoint\x12$.boxd.api.v1.DeleteCheckpointRequest\x1a%.boxd.api.v1.DeleteCheckpointResponse\x12\x62\n\x11RestoreCheckpoint\x12%.boxd.api.v1.RestoreCheckpointRequest\x1a&.boxd.api.v1.RestoreCheckpointResponse\x12n\n\x15SetAutoSuspendTimeout\x12).boxd.api.v1.SetAutoSuspendTimeoutRequest\x1a*.boxd.api.v1.SetAutoSuspendTimeoutResponse\x12t\n\x17SetAutoHibernateTimeout\x12+.boxd.api.v1.SetAutoHibernateTimeoutRequest\x1a,.boxd.api.v1.SetAutoHibernateTimeoutResponse\x12M\n\nCreateDisk\x12\x1e.boxd.api.v1.CreateDiskRequest\x1a\x1f.boxd.api.v1.CreateDiskResponse\x12J\n\tListDisks\x12\x1d.boxd.api.v1.ListDisksRequest\x1a\x1e.boxd.api.v1.ListDisksResponse\x12M\n\nAttachDisk\x12\x1e.boxd.api.v1.AttachDiskRequest\x1a\x1f.boxd.api.v1.AttachDiskResponse\x12M\n\nDetachDisk\x12\x1e.boxd.api.v1.DetachDiskRequest\x1a\x1f.boxd.api.v1.DetachDiskResponse\x12P\n\x0b\x44\x65stroyDisk\x12\x1f.boxd.api.v1.DestroyDiskRequest\x1a .boxd.api.v1.DestroyDiskResponse\x12S\n\x0c\x43reateApiKey\x12 .boxd.api.v1.CreateApiKeyRequest\x1a!.boxd.api.v1.CreateApiKeyResponse\x12P\n\x0bListApiKeys\x12\x1f.boxd.api.v1.ListApiKeysRequest\x1a .boxd.api.v1.ListApiKeysResponse\x12S\n\x0c\x44\x65leteApiKey\x12 .boxd.api.v1.DeleteApiKeyRequest\x1a!.boxd.api.v1.DeleteApiKeyResponse\x12J\n\tListPlans\x12\x1d.boxd.api.v1.ListPlansRequest\x1a\x1e.boxd.api.v1.ListPlansResponse\x12M\n\nGetBilling\x12\x1e.boxd.api.v1.GetBillingRequest\x1a\x1f.boxd.api.v1.GetBillingResponse\x12n\n\x15\x43reateCheckoutSession\x12).boxd.api.v1.CreateCheckoutSessionRequest\x1a*.boxd.api.v1.CreateCheckoutSessionResponse\x12}\n\x1a\x43reateBillingPortalSession\x12..boxd.api.v1.CreateBillingPortalSessionRequest\x1a/.boxd.api.v1.CreateBillingPortalSessionResponse\x12\x44\n\x07ShareVm\x12\x1b.boxd.api.v1.ShareVmRequest\x1a\x1c.boxd.api.v1.ShareVmResponse\x12J\n\tUnshareVm\x12\x1d.boxd.api.v1.UnshareVmRequest\x1a\x1e.boxd.api.v1.UnshareVmResponse\x12G\n\x08ListOrgs\x12\x1c.boxd.api.v1.ListOrgsRequest\x1a\x1d.boxd.api.v1.ListOrgsResponse\x12V\n\rGetOrgBilling\x12!.boxd.api.v1.GetOrgBillingRequest\x1a\".boxd.api.v1.GetOrgBillingResponse\x12\x62\n\x11SetBackupSchedule\x12%.boxd.api.v1.SetBackupScheduleRequest\x1a&.boxd.api.v1.SetBackupScheduleResponse\x12h\n\x13\x43learBackupSchedule\x12\'.boxd.api.v1.ClearBackupScheduleRequest\x1a(.boxd.api.v1.ClearBackupScheduleResponse\x12\x62\n\x11GetBackupSchedule\x12%.boxd.api.v1.GetBackupScheduleRequest\x1a&.boxd.api.v1.GetBackupScheduleResponse\x12P\n\x0bListBackups\x12\x1f.boxd.api.v1.ListBackupsRequest\x1a .boxd.api.v1.ListBackupsResponse\x12V\n\rRestoreBackup\x12!.boxd.api.v1.RestoreBackupRequest\x1a\".boxd.api.v1.RestoreBackupResponse\x12k\n\x14SetOrgBackupsDefault\x12(.boxd.api.v1.SetOrgBackupsDefaultRequest\x1a).boxd.api.v1.SetOrgBackupsDefaultResponse\x12k\n\x14GetOrgBackupsDefault\x12(.boxd.api.v1.GetOrgBackupsDefaultRequest\x1a).boxd.api.v1.GetOrgBackupsDefaultResponse\x12n\n\x15SetOrgMachineDefaults\x12).boxd.api.v1.SetOrgMachineDefaultsRequest\x1a*.boxd.api.v1.SetOrgMachineDefaultsResponse\x12n\n\x15GetOrgMachineDefaults\x12).boxd.api.v1.GetOrgMachineDefaultsRequest\x1a*.boxd.api.v1.GetOrgMachineDefaultsResponse\x12G\n\x08ResizeVm\x12\x1c.boxd.api.v1.ResizeVmRequest\x1a\x1d.boxd.api.v1.ResizeVmResponseb\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tapi.proto\x12\x0b\x62oxd.api.v1\"\xbf\x01\n\x08VmConfig\x12\x0c\n\x04vcpu\x18\x01 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x02 \x01(\x04\x12\x12\n\ndisk_bytes\x18\x03 \x01(\x04\x12#\n\x03srf\x18\x04 \x01(\x0b\x32\x16.boxd.api.v1.SrfConfig\x12+\n\x07network\x18\x05 \x01(\x0b\x32\x1a.boxd.api.v1.NetworkConfig\x12)\n\x07volumes\x18\x06 \x03(\x0b\x32\x18.boxd.api.v1.VolumeMount\"t\n\tSrfConfig\x12&\n\x19\x61uto_suspend_timeout_secs\x18\x01 \x01(\rH\x00\x88\x01\x01\x12!\n\x19\x61uto_destroy_timeout_secs\x18\x02 \x01(\rB\x1c\n\x1a_auto_suspend_timeout_secs\"F\n\rNetworkConfig\x12\x0b\n\x03ssh\x18\x01 \x01(\x08\x12(\n\x07proxies\x18\x02 \x03(\x0b\x32\x17.boxd.api.v1.ProxyEntry\"(\n\nProxyEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\"E\n\x0bVolumeMount\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\x12\n\nmount_path\x18\x02 \x01(\t\x12\x11\n\tread_only\x18\x03 \x01(\x08\"\xfb\x01\n\x0f\x43reateVmRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\timage_ref\x18\x02 \x01(\t\x12 \n\x03\x65nv\x18\x05 \x03(\x0b\x32\x13.boxd.api.v1.EnvVar\x12\x0b\n\x03\x63md\x18\x06 \x03(\t\x12\x16\n\x0erestart_policy\x18\x07 \x01(\t\x12%\n\x06\x63onfig\x18\x08 \x01(\x0b\x32\x15.boxd.api.v1.VmConfig\x12\x0b\n\x03org\x18\t \x01(\t\x12\x0e\n\x06shared\x18\n \x01(\x08\x12\x10\n\x08networks\x18\x0b \x03(\t\x12\x10\n\x08isolated\x18\x0c \x01(\x08\x12\x0c\n\x04team\x18\r \x01(\tJ\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\"$\n\x06\x45nvVar\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x84\x01\n\x10\x43reateVmResponse\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\tpublic_ip\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\x12\r\n\x05image\x18\x05 \x01(\t\x12\x0e\n\x06status\x18\x06 \x01(\t\x12\x14\n\x0c\x62oot_time_ms\x18\x07 \x01(\x04\"!\n\x10\x44\x65stroyVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x13\n\x11\x44\x65stroyVmResponse\"\x16\n\x14SuggestVmNameRequest\"%\n\x15SuggestVmNameResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\"2\n\x0fRenameVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\" \n\x10RenameVmResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\"7\n\x14SetVmNetworksRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x10\n\x08networks\x18\x02 \x03(\t\")\n\x15SetVmNetworksResponse\x12\x10\n\x08networks\x18\x01 \x03(\t\"U\n\x11\x45xposePortRequest\x12\x11\n\x05vm_id\x18\x01 \x01(\tB\x02\x18\x01\x12\x0f\n\x07vm_port\x18\x02 \x01(\r\x12\x10\n\x08protocol\x18\x03 \x01(\t\x12\n\n\x02vm\x18\x04 \x01(\t\"y\n\x12\x45xposePortResponse\x12\x0f\n\x07vm_name\x18\x01 \x01(\t\x12\x0b\n\x03\x64ns\x18\x02 \x01(\t\x12\x13\n\x0bpublic_port\x18\x03 \x01(\r\x12\x0f\n\x07vm_port\x18\x04 \x01(\r\x12\x10\n\x08protocol\x18\x05 \x01(\t\x12\r\n\x05vm_id\x18\x06 \x01(\t\"E\n\x13UnexposePortRequest\x12\x11\n\x05vm_id\x18\x01 \x01(\tB\x02\x18\x01\x12\x0f\n\x07vm_port\x18\x02 \x01(\r\x12\n\n\x02vm\x18\x03 \x01(\t\"H\n\x14UnexposePortResponse\x12\x30\n\x07\x66orward\x18\x01 \x01(\x0b\x32\x1f.boxd.api.v1.ExposePortResponse\"%\n\x17ListExposedPortsRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"M\n\x18ListExposedPortsResponse\x12\x31\n\x08\x66orwards\x18\x01 \x03(\x0b\x32\x1f.boxd.api.v1.ExposePortResponse\"\\\n\rSetVarRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05value\x18\x04 \x01(\t\x12\r\n\x05scope\x18\x05 \x01(\tJ\x04\x08\x06\x10\x07\"\x1b\n\x08VarReply\x12\x0f\n\x07message\x18\x01 \x01(\t\",\n\x0fListVarsRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\"O\n\x07VarItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\r\n\x05scope\x18\x03 \x01(\t\x12\r\n\x05value\x18\x04 \x01(\tJ\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07\"2\n\x0cVarListReply\x12\"\n\x04vars\x18\x01 \x03(\x0b\x32\x14.boxd.api.v1.VarItem\"J\n\x10RemoveVarRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05scope\x18\x04 \x01(\t\"L\n\x15SetSecretScopeRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04\x66rom\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\"\x1f\n\x0eStartVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x11\n\x0fStartVmResponse\"\x1e\n\rStopVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x10\n\x0eStopVmResponse\" \n\x0fRebootVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x12\n\x10RebootVmResponse\"!\n\x10SuspendVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\'\n\x11SuspendVmResponse\x12\x12\n\nsuspend_us\x18\x01 \x01(\x04\" \n\x0fResumeVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"%\n\x10ResumeVmResponse\x12\x11\n\tresume_us\x18\x01 \x01(\x04\"#\n\x12HibernateVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x15\n\x13HibernateVmResponse\"\x1e\n\rWakeVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x10\n\x0eWakeVmResponse\"\x1d\n\x0cGetVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x86\x05\n\rGetVmResponse\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\timage_ref\x18\x03 \x01(\t\x12\x11\n\tpublic_ip\x18\x04 \x01(\t\x12\x0e\n\x06status\x18\x05 \x01(\t\x12\x16\n\x0erestart_policy\x18\x06 \x01(\t\x12\x12\n\ndisk_bytes\x18\x07 \x01(\x04\x12!\n\x19\x61uto_suspend_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08ssh_port\x18\t \x01(\r\x12\x0b\n\x03org\x18\n \x01(\t\x12\x13\n\x0b\x62illing_org\x18\x0b \x01(\t\x12\x15\n\raccess_domain\x18\x0c \x01(\t\x12#\n\x1b\x61uto_hibernate_timeout_secs\x18\r \x01(\r\x12\x0e\n\x06source\x18\x0e \x01(\t\x12\x0c\n\x04vcpu\x18\x0f \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x10 \x01(\x04\x12\x12\n\ncreated_at\x18\x11 \x01(\x03\x12\x18\n\x10hibernated_at_ms\x18\x12 \x01(\x03\x12!\n\x19\x61uto_destroy_timeout_secs\x18\x13 \x01(\r\x12\x14\n\x0c\x62oot_time_ms\x18\x14 \x01(\x03\x12\x19\n\x11last_connected_ms\x18\x15 \x01(\x03\x12\x0e\n\x06org_id\x18\x16 \x01(\t\x12\x16\n\x0e\x62illing_org_id\x18\x17 \x01(\t\x12*\n\x0bsource_info\x18\x18 \x01(\x0b\x32\x15.boxd.api.v1.VmSource\x12\x10\n\x08networks\x18\x19 \x03(\t\x12\x10\n\x08isolated\x18\x1a \x01(\x08\x12\x35\n\x0e\x63ustom_domains\x18\x1b \x03(\x0b\x32\x1d.boxd.api.v1.CustomDomainInfo\"C\n\x08VmSource\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x04\x12\n\n\x02id\x18\x04 \x01(\t\"3\n\x0eListVmsRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x14\n\x0c\x61ll_contexts\x18\x02 \x01(\x08\"P\n\x0fListVmsResponse\x12\'\n\x03vms\x18\x01 \x03(\x0b\x32\x1a.boxd.api.v1.GetVmResponse\x12\x14\n\x0cssh_host_key\x18\x02 \x01(\t\"2\n\x11StreamLogsRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66ollow\x18\x02 \x01(\x08\"\x18\n\x08LogChunk\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\xc1\x01\n\tExecChunk\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\r\n\x05stdin\x18\x02 \x01(\x08\x12\x0b\n\x03tty\x18\x03 \x01(\x08\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\t\x12\r\n\x05vm_id\x18\x05 \x01(\t\x12\x11\n\texit_code\x18\x06 \x01(\x05\x12\x0c\n\x04\x63ols\x18\x07 \x01(\r\x12\x0c\n\x04rows\x18\x08 \x01(\r\x12\x15\n\rwindow_change\x18\t \x01(\x08\x12\x11\n\tis_stderr\x18\n \x01(\x08\x12\x11\n\tdevice_id\x18\x0b \x01(\t\"+\n\x0c\x44\x65sktopChunk\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"$\n\x14\x43reateNetworkRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"+\n\x15\x43reateNetworkResponse\x12\x12\n\nnetwork_id\x18\x01 \x01(\t\"\x15\n\x13ListNetworksRequest\"B\n\x14ListNetworksResponse\x12*\n\x08networks\x18\x01 \x03(\x0b\x32\x18.boxd.api.v1.NetworkInfo\"A\n\x0bNetworkInfo\x12\x12\n\nnetwork_id\x18\x01 \x01(\t\x12\x0e\n\x06subnet\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\"7\n\x16\x41\x64\x64\x43ustomDomainRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\"H\n\x17\x41\x64\x64\x43ustomDomainResponse\x12-\n\x06\x64omain\x18\x01 \x01(\x0b\x32\x1d.boxd.api.v1.CustomDomainInfo\"\x1a\n\x18ListCustomDomainsRequest\"K\n\x19ListCustomDomainsResponse\x12.\n\x07\x64omains\x18\x01 \x03(\x0b\x32\x1d.boxd.api.v1.CustomDomainInfo\"+\n\x19RemoveCustomDomainRequest\x12\x0e\n\x06\x64omain\x18\x01 \x01(\t\"\x1c\n\x1aRemoveCustomDomainResponse\"f\n\x10\x43ustomDomainInfo\x12\x0e\n\x06\x64omain\x18\x01 \x01(\t\x12\r\n\x05vm_id\x18\x02 \x01(\t\x12\x0f\n\x07vm_name\x18\x03 \x01(\t\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x12\n\nlast_error\x18\x05 \x01(\t\"5\n\x13SetOrgDomainRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\"B\n\x14SetOrgDomainResponse\x12*\n\x06\x64omain\x18\x01 \x01(\x0b\x32\x1a.boxd.api.v1.OrgDomainInfo\"%\n\x13GetOrgDomainRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"B\n\x14GetOrgDomainResponse\x12*\n\x06\x64omain\x18\x01 \x01(\x0b\x32\x1a.boxd.api.v1.OrgDomainInfo\"\'\n\x15\x43learOrgDomainRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"\x18\n\x16\x43learOrgDomainResponse\"S\n\rOrgDomainInfo\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x12\n\nlast_error\x18\x04 \x01(\t\"\x12\n\x10GetConfigRequest\"8\n\x11GetConfigResponse\x12\x15\n\rdefault_image\x18\x01 \x01(\t\x12\x0c\n\x04zone\x18\x02 \x01(\t\"\x0f\n\rWhoamiRequest\"\x99\x01\n\x0eWhoamiResponse\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x1b\n\x13pubkey_fingerprints\x18\x02 \x03(\t\x12)\n\x07\x62illing\x18\x04 \x01(\x0b\x32\x18.boxd.api.v1.BillingInfo\x12\x14\n\x0c\x64isplay_name\x18\x05 \x01(\tJ\x04\x08\x03\x10\x04R\x12\x64\x65\x66\x61ult_network_id\"\xf9\x01\n\x0b\x42illingInfo\x12\x1b\n\x13subscription_status\x18\x03 \x01(\t\x12\x16\n\x0epast_due_since\x18\x06 \x01(\x03\x12\x0f\n\x07max_vms\x18\x07 \x01(\r\x12\x0c\n\x04vcpu\x18\x08 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\t \x01(\x04\x12\x19\n\x11\x62\x61lance_micro_eur\x18\n \x01(\x03\x12\x14\n\x0c\x62illing_mode\x18\x0b \x01(\tJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06R\x04tierR\x05shapeR\x12stripe_customer_idR\x16stripe_subscription_id\"\x12\n\x10ListPlansRequest\"9\n\x11ListPlansResponse\x12$\n\x05plans\x18\x01 \x03(\x0b\x32\x15.boxd.api.v1.PlanInfo\"\x85\x01\n\x08PlanInfo\x12\x13\n\x0bmonthly_eur\x18\x03 \x01(\r\x12\x12\n\nlookup_key\x18\x04 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\x12\x0c\n\x04vcpu\x18\x06 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x07 \x01(\x04J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x04tierR\x05shape\"\x13\n\x11GetBillingRequest\"?\n\x12GetBillingResponse\x12)\n\x07\x62illing\x18\x01 \x01(\x0b\x32\x18.boxd.api.v1.BillingInfo\"T\n\x1c\x43reateCheckoutSessionRequest\x12\x13\n\x0bsuccess_url\x18\x02 \x01(\t\x12\x12\n\ncancel_url\x18\x03 \x01(\tJ\x04\x08\x01\x10\x02R\x05shape\"5\n\x1d\x43reateCheckoutSessionResponse\x12\x14\n\x0c\x63heckout_url\x18\x01 \x01(\t\"7\n!CreateBillingPortalSessionRequest\x12\x12\n\nreturn_url\x18\x01 \x01(\t\"8\n\"CreateBillingPortalSessionResponse\x12\x12\n\nportal_url\x18\x01 \x01(\t\"-\n\x12\x43reateTokenRequest\x12\x17\n\x0f\x65xpires_in_secs\x18\x01 \x01(\x04\"8\n\x13\x43reateTokenResponse\x12\r\n\x05token\x18\x01 \x01(\t\x12\x12\n\nexpires_at\x18\x02 \x01(\x03\"\x13\n\x11ListTokensRequest\"<\n\x12ListTokensResponse\x12&\n\x06tokens\x18\x01 \x03(\x0b\x32\x16.boxd.api.v1.TokenInfo\"@\n\tTokenInfo\x12\x0b\n\x03jti\x18\x01 \x01(\t\x12\x12\n\ncreated_at\x18\x02 \x01(\x03\x12\x12\n\nexpires_at\x18\x03 \x01(\x03\"!\n\x12RevokeTokenRequest\x12\x0b\n\x03jti\x18\x01 \x01(\t\"\x15\n\x13RevokeTokenResponse\"E\n\x11LinkSshKeyRequest\x12\x0e\n\x06pubkey\x18\x01 \x01(\t\x12\x11\n\tdevice_id\x18\x02 \x01(\t\x12\r\n\x05label\x18\x03 \x01(\t\"\x14\n\x12LinkSshKeyResponse\"\x8e\x01\n\rForkVmRequest\x12\x14\n\x0csource_vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12%\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x15.boxd.api.v1.VmConfig\x12\x0e\n\x06shared\x18\x04 \x01(\x08\x12\x10\n\x08networks\x18\x05 \x03(\t\x12\x10\n\x08isolated\x18\x06 \x01(\x08\"\x97\x01\n\x0e\x46orkVmResponse\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\tpublic_ip\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\x12\r\n\x05image\x18\x05 \x01(\t\x12\x0e\n\x06status\x18\x06 \x01(\t\x12\x13\n\x0b\x66orked_from\x18\x07 \x01(\t\x12\x14\n\x0c\x62oot_time_ms\x18\x08 \x01(\x04\"5\n\x12ListProxiesRequest\x12\x13\n\x07vm_name\x18\x01 \x01(\tB\x02\x18\x01\x12\n\n\x02vm\x18\x02 \x01(\t\">\n\x13ListProxiesResponse\x12\'\n\x07proxies\x18\x01 \x03(\x0b\x32\x16.boxd.api.v1.ProxyInfo\"\xac\x01\n\tProxyInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07vm_name\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\r\x12\x12\n\nis_default\x18\x05 \x01(\x08\x12\x14\n\x0cport_display\x18\x06 \x01(\t\x12\r\n\x05vm_id\x18\x07 \x01(\t\x12\x11\n\tport_mode\x18\x08 \x01(\t\x12\x16\n\x0e\x65\x66\x66\x65\x63tive_port\x18\t \x01(\r\"\x17\n\x15ListProxyNodesRequest\"E\n\x16ListProxyNodesResponse\x12+\n\x07proxies\x18\x01 \x03(\x0b\x32\x1a.boxd.api.v1.ProxyNodeInfo\")\n\rProxyNodeInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04ipv4\x18\x02 \x01(\t\"Q\n\x12\x43reateProxyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07vm_name\x18\x02 \x01(\tB\x02\x18\x01\x12\x0c\n\x04port\x18\x03 \x01(\r\x12\n\n\x02vm\x18\x04 \x01(\t\"R\n\x13\x43reateProxyResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07vm_name\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\r\"C\n\x12\x44\x65leteProxyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07vm_name\x18\x02 \x01(\tB\x02\x18\x01\x12\n\n\x02vm\x18\x03 \x01(\t\"\x15\n\x13\x44\x65leteProxyResponse\"R\n\x13SetProxyPortRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07vm_name\x18\x02 \x01(\tB\x02\x18\x01\x12\x0c\n\x04port\x18\x03 \x01(\t\x12\n\n\x02vm\x18\x04 \x01(\t\"\x16\n\x14SetProxyPortResponse\">\n\x11UploadFileRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\"+\n\x12UploadFileResponse\x12\x15\n\rbytes_written\x18\x01 \x01(\x04\"P\n\x0fUploadFileChunk\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x12\n\ntotal_size\x18\x03 \x01(\x04\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\"2\n\x13\x44ownloadFileRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"$\n\x14\x44ownloadFileResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"5\n\x11\x44ownloadFileChunk\x12\x12\n\ntotal_size\x18\x01 \x01(\x04\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"1\n\x15\x43reateSnapshotRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\\\n\x16\x43reateSnapshotResponse\x12\x13\n\x0bsnapshot_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\t\"#\n\x14ListSnapshotsRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\"E\n\x15ListSnapshotsResponse\x12,\n\tsnapshots\x18\x01 \x03(\x0b\x32\x19.boxd.api.v1.SnapshotInfo\"/\n\x12GetSnapshotRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03org\x18\x02 \x01(\t\"B\n\x13GetSnapshotResponse\x12+\n\x08snapshot\x18\x01 \x01(\x0b\x32\x19.boxd.api.v1.SnapshotInfo\"2\n\x15\x44\x65leteSnapshotRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03org\x18\x02 \x01(\t\"\x18\n\x16\x44\x65leteSnapshotResponse\"\x83\x01\n\x1b\x43reateVmFromSnapshotRequest\x12\x10\n\x08snapshot\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12%\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x15.boxd.api.v1.VmConfig\x12\x0b\n\x03org\x18\x04 \x01(\t\x12\x10\n\x08isolated\x18\x05 \x01(\x08\"\xf3\x01\n\x0cSnapshotInfo\x12\x13\n\x0bsnapshot_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x12\n\nsize_bytes\x18\x07 \x01(\x04\x12\x12\n\nupdated_at\x18\x08 \x01(\x03\x12\x0c\n\x04vcpu\x18\t \x01(\r\x12\x14\n\x0cmemory_bytes\x18\n \x01(\x04\x12\x11\n\tuse_count\x18\x0b \x01(\x04\x12\x12\n\ncreated_at\x18\x0c \x01(\x03J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07R\x0eready_replicasR\x10\x64\x65sired_replicas\"3\n\x17\x43reateCheckpointRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"O\n\x18\x43reateCheckpointResponse\x12\x15\n\rcheckpoint_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\"$\n\x16ListCheckpointsRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"K\n\x17ListCheckpointsResponse\x12\x30\n\x0b\x63heckpoints\x18\x01 \x03(\x0b\x32\x1b.boxd.api.v1.CheckpointInfo\"3\n\x17\x44\x65leteCheckpointRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x1a\n\x18\x44\x65leteCheckpointResponse\"4\n\x18RestoreCheckpointRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x1b\n\x19RestoreCheckpointResponse\"\x94\x01\n\x0e\x43heckpointInfo\x12\x15\n\rcheckpoint_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x12\n\nsize_bytes\x18\x04 \x01(\x04\x12\x12\n\ncreated_at\x18\x05 \x01(\x03\x12\x12\n\ncreated_by\x18\x06 \x01(\t\x12\x11\n\tavailable\x18\x07 \x01(\x08\";\n\x11\x43reateDiskRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x04J\x04\x08\x03\x10\x04\"]\n\x12\x43reateDiskResponse\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nsize_bytes\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\tJ\x04\x08\x05\x10\x06\"\x12\n\x10ListDisksRequest\"9\n\x11ListDisksResponse\x12$\n\x05\x64isks\x18\x01 \x03(\x0b\x32\x15.boxd.api.v1.DiskInfo\"\xaa\x01\n\x08\x44iskInfo\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nsize_bytes\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x30\n\x0b\x61ttachments\x18\x06 \x03(\x0b\x32\x1b.boxd.api.v1.DiskAttachment\x12\x12\n\ncreated_at\x18\x08 \x01(\x03J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08R\tworker_id\"X\n\x0e\x44iskAttachment\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0f\n\x07vm_name\x18\x02 \x01(\t\x12\x12\n\nmount_path\x18\x03 \x01(\t\x12\x12\n\nmount_mode\x18\x04 \x01(\t\"Z\n\x11\x41ttachDiskRequest\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\r\n\x05vm_id\x18\x02 \x01(\t\x12\x12\n\nmount_path\x18\x03 \x01(\t\x12\x11\n\tread_only\x18\x04 \x01(\x08\"\x14\n\x12\x41ttachDiskResponse\"3\n\x11\x44\x65tachDiskRequest\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\x12\r\n\x05vm_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65tachDiskResponse\"%\n\x12\x44\x65stroyDiskRequest\x12\x0f\n\x07\x64isk_id\x18\x01 \x01(\t\"\x15\n\x13\x44\x65stroyDiskResponse\"C\n\x1cSetAutoSuspendTimeoutRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x14\n\x0ctimeout_secs\x18\x02 \x01(\r\"\x1f\n\x1dSetAutoSuspendTimeoutResponse\"E\n\x1eSetAutoHibernateTimeoutRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x14\n\x0ctimeout_secs\x18\x02 \x01(\r\"!\n\x1fSetAutoHibernateTimeoutResponse\"W\n\x13\x43reateApiKeyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\x0f\x65xpires_in_secs\x18\x02 \x01(\x04\x12\x0b\n\x03org\x18\x03 \x01(\t\x12\x0c\n\x04kind\x18\x04 \x01(\t\"G\n\x14\x43reateApiKeyResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0f\n\x07\x61pi_key\x18\x02 \x01(\t\x12\x12\n\nexpires_at\x18\x03 \x01(\x03\"\x14\n\x12ListApiKeysRequest\"<\n\x13ListApiKeysResponse\x12%\n\x04keys\x18\x01 \x03(\x0b\x32\x17.boxd.api.v1.ApiKeyInfo\"\x93\x01\n\nApiKeyInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nkey_prefix\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x14\n\x0clast_used_at\x18\x05 \x01(\x03\x12\x12\n\nexpires_at\x18\x06 \x01(\x03\x12\x0b\n\x03org\x18\x07 \x01(\t\x12\x0c\n\x04kind\x18\x08 \x01(\t\"!\n\x13\x44\x65leteApiKeyRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\x16\n\x14\x44\x65leteApiKeyResponse\"\x1f\n\x0eShareVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x11\n\x0fShareVmResponse\"\x11\n\x0fListOrgsRequest\"W\n\x10ListOrgsResponse\x12%\n\x04orgs\x18\x01 \x03(\x0b\x32\x17.boxd.api.v1.OrgSummary\x12\x16\n\x0e\x64\x65\x66\x61ult_org_id\x18\x03 \x01(\tJ\x04\x08\x02\x10\x03\"F\n\nOrgSummary\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08is_admin\x18\x03 \x01(\x08\x12\x0c\n\x04slug\x18\x04 \x01(\t\"#\n\x14GetOrgBillingRequest\x12\x0b\n\x03org\x18\x01 \x01(\t\"\x9a\x02\n\x15GetOrgBillingResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08is_admin\x18\x03 \x01(\x08\x12\x0f\n\x07max_vms\x18\x04 \x01(\r\x12\x0c\n\x04vcpu\x18\x05 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x06 \x01(\x04\x12\x10\n\x08vm_count\x18\x07 \x01(\r\x12%\n\x03vms\x18\x08 \x03(\x0b\x32\x18.boxd.api.v1.OrgBilledVm\x12\x19\n\x11\x62\x61lance_micro_eur\x18\t \x01(\x03\x12\x14\n\x0c\x62illing_mode\x18\n \x01(\t\x12\x1f\n\x12\x61\x63\x63ruing_micro_eur\x18\x0b \x01(\x03H\x00\x88\x01\x01\x42\x15\n\x13_accruing_micro_eur\"l\n\x0bOrgBilledVm\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05owner\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x0f\n\x07\x62illing\x18\x05 \x01(\t\x12\x12\n\nowner_name\x18\x06 \x01(\tJ\x04\x08\x04\x10\x05R\x05shape\"!\n\x10UnshareVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\"\x13\n\x11UnshareVmResponse\"m\n\x18SetBackupScheduleRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x15\n\rschedule_kind\x18\x02 \x01(\t\x12\x16\n\x0eschedule_value\x18\x03 \x01(\t\x12\x16\n\x0eretention_secs\x18\x04 \x01(\r\"\x1b\n\x19SetBackupScheduleResponse\"(\n\x1a\x43learBackupScheduleRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"\x1d\n\x1b\x43learBackupScheduleResponse\"&\n\x18GetBackupScheduleRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"\xa3\x01\n\x19GetBackupScheduleResponse\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x15\n\rschedule_kind\x18\x02 \x01(\t\x12\x16\n\x0eschedule_value\x18\x03 \x01(\t\x12\x16\n\x0eretention_secs\x18\x04 \x01(\r\x12\x16\n\x0enext_backup_at\x18\x05 \x01(\x03\x12\x16\n\x0elast_backup_at\x18\x06 \x01(\x03\" \n\x12ListBackupsRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"\x9a\x01\n\nBackupInfo\x12\x11\n\tbackup_id\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\nsize_bytes\x18\x03 \x01(\x04\x12\x10\n\x08\x63hecksum\x18\x04 \x01(\t\x12\x1b\n\x13points_to_backup_id\x18\x05 \x01(\t\x12\x12\n\ncreated_at\x18\x06 \x01(\x03\x12\x12\n\nexpires_at\x18\x07 \x01(\x03\"?\n\x13ListBackupsResponse\x12(\n\x07\x62\x61\x63kups\x18\x01 \x03(\x0b\x32\x17.boxd.api.v1.BackupInfo\"\"\n\x14TriggerBackupRequest\x12\n\n\x02vm\x18\x01 \x01(\t\"*\n\x15TriggerBackupResponse\x12\x11\n\tbackup_id\x18\x01 \x01(\t\"4\n\x13\x44\x65leteBackupRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x11\n\tbackup_id\x18\x02 \x01(\t\"\x16\n\x14\x44\x65leteBackupResponse\"5\n\x14RestoreBackupRequest\x12\n\n\x02vm\x18\x01 \x01(\t\x12\x11\n\tbackup_id\x18\x02 \x01(\t\"\x17\n\x15RestoreBackupResponse\"\x87\x01\n\x1bSetOrgBackupsDefaultRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x18\n\x0bperiod_secs\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eretention_secs\x18\x03 \x01(\rH\x01\x88\x01\x01\x42\x0e\n\x0c_period_secsB\x11\n\x0f_retention_secs\"\\\n\x1cSetOrgBackupsDefaultResponse\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x13\n\x0bperiod_secs\x18\x02 \x01(\r\x12\x16\n\x0eretention_secs\x18\x03 \x01(\r\"-\n\x1bGetOrgBackupsDefaultRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"\\\n\x1cGetOrgBackupsDefaultResponse\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x13\n\x0bperiod_secs\x18\x02 \x01(\r\x12\x16\n\x0eretention_secs\x18\x03 \x01(\r\"v\n\x1cSetOrgMachineDefaultsRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x11\n\x04vcpu\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x03 \x01(\x04H\x01\x88\x01\x01\x42\x07\n\x05_vcpuB\x0f\n\r_memory_bytes\"\x1f\n\x1dSetOrgMachineDefaultsResponse\".\n\x1cGetOrgMachineDefaultsRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"D\n\x0fResizeVmRequest\x12\r\n\x05vm_id\x18\x01 \x01(\t\x12\x0c\n\x04vcpu\x18\x02 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x03 \x01(\x04\"H\n\x10ResizeVmResponse\x12\x0c\n\x04vcpu\x18\x01 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x02 \x01(\x04\x12\x10\n\x08rebooted\x18\x03 \x01(\x08\"\x84\x01\n\x1dGetOrgMachineDefaultsResponse\x12\x0b\n\x03set\x18\x01 \x01(\x08\x12\x0c\n\x04vcpu\x18\x02 \x01(\r\x12\x14\n\x0cmemory_bytes\x18\x03 \x01(\x04\x12\x14\n\x0c\x63\x65iling_vcpu\x18\x04 \x01(\r\x12\x1c\n\x14\x63\x65iling_memory_bytes\x18\x05 \x01(\x04\x32\xe1\x39\n\x07\x42oxdApi\x12G\n\x08\x43reateVm\x12\x1c.boxd.api.v1.CreateVmRequest\x1a\x1d.boxd.api.v1.CreateVmResponse\x12J\n\tDestroyVm\x12\x1d.boxd.api.v1.DestroyVmRequest\x1a\x1e.boxd.api.v1.DestroyVmResponse\x12G\n\x08RenameVm\x12\x1c.boxd.api.v1.RenameVmRequest\x1a\x1d.boxd.api.v1.RenameVmResponse\x12V\n\rSetVmNetworks\x12!.boxd.api.v1.SetVmNetworksRequest\x1a\".boxd.api.v1.SetVmNetworksResponse\x12\x44\n\x07StartVm\x12\x1b.boxd.api.v1.StartVmRequest\x1a\x1c.boxd.api.v1.StartVmResponse\x12\x41\n\x06StopVm\x12\x1a.boxd.api.v1.StopVmRequest\x1a\x1b.boxd.api.v1.StopVmResponse\x12G\n\x08RebootVm\x12\x1c.boxd.api.v1.RebootVmRequest\x1a\x1d.boxd.api.v1.RebootVmResponse\x12>\n\x05GetVm\x12\x19.boxd.api.v1.GetVmRequest\x1a\x1a.boxd.api.v1.GetVmResponse\x12\x44\n\x07ListVms\x12\x1b.boxd.api.v1.ListVmsRequest\x1a\x1c.boxd.api.v1.ListVmsResponse\x12V\n\rSuggestVmName\x12!.boxd.api.v1.SuggestVmNameRequest\x1a\".boxd.api.v1.SuggestVmNameResponse\x12M\n\nExposePort\x12\x1e.boxd.api.v1.ExposePortRequest\x1a\x1f.boxd.api.v1.ExposePortResponse\x12S\n\x0cUnexposePort\x12 .boxd.api.v1.UnexposePortRequest\x1a!.boxd.api.v1.UnexposePortResponse\x12_\n\x10ListExposedPorts\x12$.boxd.api.v1.ListExposedPortsRequest\x1a%.boxd.api.v1.ListExposedPortsResponse\x12;\n\x06SetVar\x12\x1a.boxd.api.v1.SetVarRequest\x1a\x15.boxd.api.v1.VarReply\x12\x43\n\x08ListVars\x12\x1c.boxd.api.v1.ListVarsRequest\x1a\x19.boxd.api.v1.VarListReply\x12\x41\n\tRemoveVar\x12\x1d.boxd.api.v1.RemoveVarRequest\x1a\x15.boxd.api.v1.VarReply\x12K\n\x0eSetSecretScope\x12\".boxd.api.v1.SetSecretScopeRequest\x1a\x15.boxd.api.v1.VarReply\x12\x45\n\nStreamLogs\x12\x1e.boxd.api.v1.StreamLogsRequest\x1a\x15.boxd.api.v1.LogChunk0\x01\x12:\n\x04\x45xec\x12\x16.boxd.api.v1.ExecChunk\x1a\x16.boxd.api.v1.ExecChunk(\x01\x30\x01\x12I\n\rDesktopTunnel\x12\x19.boxd.api.v1.DesktopChunk\x1a\x19.boxd.api.v1.DesktopChunk(\x01\x30\x01\x12V\n\rCreateNetwork\x12!.boxd.api.v1.CreateNetworkRequest\x1a\".boxd.api.v1.CreateNetworkResponse\x12S\n\x0cListNetworks\x12 .boxd.api.v1.ListNetworksRequest\x1a!.boxd.api.v1.ListNetworksResponse\x12\\\n\x0f\x41\x64\x64\x43ustomDomain\x12#.boxd.api.v1.AddCustomDomainRequest\x1a$.boxd.api.v1.AddCustomDomainResponse\x12\x62\n\x11ListCustomDomains\x12%.boxd.api.v1.ListCustomDomainsRequest\x1a&.boxd.api.v1.ListCustomDomainsResponse\x12\x65\n\x12RemoveCustomDomain\x12&.boxd.api.v1.RemoveCustomDomainRequest\x1a\'.boxd.api.v1.RemoveCustomDomainResponse\x12S\n\x0cSetOrgDomain\x12 .boxd.api.v1.SetOrgDomainRequest\x1a!.boxd.api.v1.SetOrgDomainResponse\x12S\n\x0cGetOrgDomain\x12 .boxd.api.v1.GetOrgDomainRequest\x1a!.boxd.api.v1.GetOrgDomainResponse\x12Y\n\x0e\x43learOrgDomain\x12\".boxd.api.v1.ClearOrgDomainRequest\x1a#.boxd.api.v1.ClearOrgDomainResponse\x12\x41\n\x06Whoami\x12\x1a.boxd.api.v1.WhoamiRequest\x1a\x1b.boxd.api.v1.WhoamiResponse\x12P\n\x0b\x43reateToken\x12\x1f.boxd.api.v1.CreateTokenRequest\x1a .boxd.api.v1.CreateTokenResponse\x12M\n\nListTokens\x12\x1e.boxd.api.v1.ListTokensRequest\x1a\x1f.boxd.api.v1.ListTokensResponse\x12P\n\x0bRevokeToken\x12\x1f.boxd.api.v1.RevokeTokenRequest\x1a .boxd.api.v1.RevokeTokenResponse\x12M\n\nLinkSshKey\x12\x1e.boxd.api.v1.LinkSshKeyRequest\x1a\x1f.boxd.api.v1.LinkSshKeyResponse\x12J\n\tGetConfig\x12\x1d.boxd.api.v1.GetConfigRequest\x1a\x1e.boxd.api.v1.GetConfigResponse\x12\x41\n\x06\x46orkVm\x12\x1a.boxd.api.v1.ForkVmRequest\x1a\x1b.boxd.api.v1.ForkVmResponse\x12P\n\x0bListProxies\x12\x1f.boxd.api.v1.ListProxiesRequest\x1a .boxd.api.v1.ListProxiesResponse\x12Y\n\x0eListProxyNodes\x12\".boxd.api.v1.ListProxyNodesRequest\x1a#.boxd.api.v1.ListProxyNodesResponse\x12P\n\x0b\x43reateProxy\x12\x1f.boxd.api.v1.CreateProxyRequest\x1a .boxd.api.v1.CreateProxyResponse\x12P\n\x0b\x44\x65leteProxy\x12\x1f.boxd.api.v1.DeleteProxyRequest\x1a .boxd.api.v1.DeleteProxyResponse\x12S\n\x0cSetProxyPort\x12 .boxd.api.v1.SetProxyPortRequest\x1a!.boxd.api.v1.SetProxyPortResponse\x12M\n\nUploadFile\x12\x1e.boxd.api.v1.UploadFileRequest\x1a\x1f.boxd.api.v1.UploadFileResponse\x12S\n\x10UploadFileStream\x12\x1c.boxd.api.v1.UploadFileChunk\x1a\x1f.boxd.api.v1.UploadFileResponse(\x01\x12S\n\x0c\x44ownloadFile\x12 .boxd.api.v1.DownloadFileRequest\x1a!.boxd.api.v1.DownloadFileResponse\x12X\n\x12\x44ownloadFileStream\x12 .boxd.api.v1.DownloadFileRequest\x1a\x1e.boxd.api.v1.DownloadFileChunk0\x01\x12J\n\tSuspendVm\x12\x1d.boxd.api.v1.SuspendVmRequest\x1a\x1e.boxd.api.v1.SuspendVmResponse\x12G\n\x08ResumeVm\x12\x1c.boxd.api.v1.ResumeVmRequest\x1a\x1d.boxd.api.v1.ResumeVmResponse\x12P\n\x0bHibernateVm\x12\x1f.boxd.api.v1.HibernateVmRequest\x1a .boxd.api.v1.HibernateVmResponse\x12\x41\n\x06WakeVm\x12\x1a.boxd.api.v1.WakeVmRequest\x1a\x1b.boxd.api.v1.WakeVmResponse\x12Y\n\x0e\x43reateSnapshot\x12\".boxd.api.v1.CreateSnapshotRequest\x1a#.boxd.api.v1.CreateSnapshotResponse\x12V\n\rListSnapshots\x12!.boxd.api.v1.ListSnapshotsRequest\x1a\".boxd.api.v1.ListSnapshotsResponse\x12P\n\x0bGetSnapshot\x12\x1f.boxd.api.v1.GetSnapshotRequest\x1a .boxd.api.v1.GetSnapshotResponse\x12Y\n\x0e\x44\x65leteSnapshot\x12\".boxd.api.v1.DeleteSnapshotRequest\x1a#.boxd.api.v1.DeleteSnapshotResponse\x12_\n\x14\x43reateVmFromSnapshot\x12(.boxd.api.v1.CreateVmFromSnapshotRequest\x1a\x1d.boxd.api.v1.CreateVmResponse\x12_\n\x10\x43reateCheckpoint\x12$.boxd.api.v1.CreateCheckpointRequest\x1a%.boxd.api.v1.CreateCheckpointResponse\x12\\\n\x0fListCheckpoints\x12#.boxd.api.v1.ListCheckpointsRequest\x1a$.boxd.api.v1.ListCheckpointsResponse\x12_\n\x10\x44\x65leteCheckpoint\x12$.boxd.api.v1.DeleteCheckpointRequest\x1a%.boxd.api.v1.DeleteCheckpointResponse\x12\x62\n\x11RestoreCheckpoint\x12%.boxd.api.v1.RestoreCheckpointRequest\x1a&.boxd.api.v1.RestoreCheckpointResponse\x12n\n\x15SetAutoSuspendTimeout\x12).boxd.api.v1.SetAutoSuspendTimeoutRequest\x1a*.boxd.api.v1.SetAutoSuspendTimeoutResponse\x12t\n\x17SetAutoHibernateTimeout\x12+.boxd.api.v1.SetAutoHibernateTimeoutRequest\x1a,.boxd.api.v1.SetAutoHibernateTimeoutResponse\x12M\n\nCreateDisk\x12\x1e.boxd.api.v1.CreateDiskRequest\x1a\x1f.boxd.api.v1.CreateDiskResponse\x12J\n\tListDisks\x12\x1d.boxd.api.v1.ListDisksRequest\x1a\x1e.boxd.api.v1.ListDisksResponse\x12M\n\nAttachDisk\x12\x1e.boxd.api.v1.AttachDiskRequest\x1a\x1f.boxd.api.v1.AttachDiskResponse\x12M\n\nDetachDisk\x12\x1e.boxd.api.v1.DetachDiskRequest\x1a\x1f.boxd.api.v1.DetachDiskResponse\x12P\n\x0b\x44\x65stroyDisk\x12\x1f.boxd.api.v1.DestroyDiskRequest\x1a .boxd.api.v1.DestroyDiskResponse\x12S\n\x0c\x43reateApiKey\x12 .boxd.api.v1.CreateApiKeyRequest\x1a!.boxd.api.v1.CreateApiKeyResponse\x12P\n\x0bListApiKeys\x12\x1f.boxd.api.v1.ListApiKeysRequest\x1a .boxd.api.v1.ListApiKeysResponse\x12S\n\x0c\x44\x65leteApiKey\x12 .boxd.api.v1.DeleteApiKeyRequest\x1a!.boxd.api.v1.DeleteApiKeyResponse\x12J\n\tListPlans\x12\x1d.boxd.api.v1.ListPlansRequest\x1a\x1e.boxd.api.v1.ListPlansResponse\x12M\n\nGetBilling\x12\x1e.boxd.api.v1.GetBillingRequest\x1a\x1f.boxd.api.v1.GetBillingResponse\x12n\n\x15\x43reateCheckoutSession\x12).boxd.api.v1.CreateCheckoutSessionRequest\x1a*.boxd.api.v1.CreateCheckoutSessionResponse\x12}\n\x1a\x43reateBillingPortalSession\x12..boxd.api.v1.CreateBillingPortalSessionRequest\x1a/.boxd.api.v1.CreateBillingPortalSessionResponse\x12\x44\n\x07ShareVm\x12\x1b.boxd.api.v1.ShareVmRequest\x1a\x1c.boxd.api.v1.ShareVmResponse\x12J\n\tUnshareVm\x12\x1d.boxd.api.v1.UnshareVmRequest\x1a\x1e.boxd.api.v1.UnshareVmResponse\x12G\n\x08ListOrgs\x12\x1c.boxd.api.v1.ListOrgsRequest\x1a\x1d.boxd.api.v1.ListOrgsResponse\x12V\n\rGetOrgBilling\x12!.boxd.api.v1.GetOrgBillingRequest\x1a\".boxd.api.v1.GetOrgBillingResponse\x12\x62\n\x11SetBackupSchedule\x12%.boxd.api.v1.SetBackupScheduleRequest\x1a&.boxd.api.v1.SetBackupScheduleResponse\x12h\n\x13\x43learBackupSchedule\x12\'.boxd.api.v1.ClearBackupScheduleRequest\x1a(.boxd.api.v1.ClearBackupScheduleResponse\x12\x62\n\x11GetBackupSchedule\x12%.boxd.api.v1.GetBackupScheduleRequest\x1a&.boxd.api.v1.GetBackupScheduleResponse\x12P\n\x0bListBackups\x12\x1f.boxd.api.v1.ListBackupsRequest\x1a .boxd.api.v1.ListBackupsResponse\x12V\n\rTriggerBackup\x12!.boxd.api.v1.TriggerBackupRequest\x1a\".boxd.api.v1.TriggerBackupResponse\x12S\n\x0c\x44\x65leteBackup\x12 .boxd.api.v1.DeleteBackupRequest\x1a!.boxd.api.v1.DeleteBackupResponse\x12V\n\rRestoreBackup\x12!.boxd.api.v1.RestoreBackupRequest\x1a\".boxd.api.v1.RestoreBackupResponse\x12k\n\x14SetOrgBackupsDefault\x12(.boxd.api.v1.SetOrgBackupsDefaultRequest\x1a).boxd.api.v1.SetOrgBackupsDefaultResponse\x12k\n\x14GetOrgBackupsDefault\x12(.boxd.api.v1.GetOrgBackupsDefaultRequest\x1a).boxd.api.v1.GetOrgBackupsDefaultResponse\x12n\n\x15SetOrgMachineDefaults\x12).boxd.api.v1.SetOrgMachineDefaultsRequest\x1a*.boxd.api.v1.SetOrgMachineDefaultsResponse\x12n\n\x15GetOrgMachineDefaults\x12).boxd.api.v1.GetOrgMachineDefaultsRequest\x1a*.boxd.api.v1.GetOrgMachineDefaultsResponse\x12G\n\x08ResizeVm\x12\x1c.boxd.api.v1.ResizeVmRequest\x1a\x1d.boxd.api.v1.ResizeVmResponseb\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -269,152 +269,162 @@ if not _descriptor._USE_C_DESCRIPTORS:
269
269
  _globals['_DOWNLOADFILEREQUEST']._serialized_end=7645
270
270
  _globals['_DOWNLOADFILERESPONSE']._serialized_start=7647
271
271
  _globals['_DOWNLOADFILERESPONSE']._serialized_end=7683
272
- _globals['_CREATESNAPSHOTREQUEST']._serialized_start=7685
273
- _globals['_CREATESNAPSHOTREQUEST']._serialized_end=7734
274
- _globals['_CREATESNAPSHOTRESPONSE']._serialized_start=7736
275
- _globals['_CREATESNAPSHOTRESPONSE']._serialized_end=7828
276
- _globals['_LISTSNAPSHOTSREQUEST']._serialized_start=7830
277
- _globals['_LISTSNAPSHOTSREQUEST']._serialized_end=7865
278
- _globals['_LISTSNAPSHOTSRESPONSE']._serialized_start=7867
279
- _globals['_LISTSNAPSHOTSRESPONSE']._serialized_end=7936
280
- _globals['_GETSNAPSHOTREQUEST']._serialized_start=7938
281
- _globals['_GETSNAPSHOTREQUEST']._serialized_end=7985
282
- _globals['_GETSNAPSHOTRESPONSE']._serialized_start=7987
283
- _globals['_GETSNAPSHOTRESPONSE']._serialized_end=8053
284
- _globals['_DELETESNAPSHOTREQUEST']._serialized_start=8055
285
- _globals['_DELETESNAPSHOTREQUEST']._serialized_end=8105
286
- _globals['_DELETESNAPSHOTRESPONSE']._serialized_start=8107
287
- _globals['_DELETESNAPSHOTRESPONSE']._serialized_end=8131
288
- _globals['_CREATEVMFROMSNAPSHOTREQUEST']._serialized_start=8134
289
- _globals['_CREATEVMFROMSNAPSHOTREQUEST']._serialized_end=8265
290
- _globals['_SNAPSHOTINFO']._serialized_start=8268
291
- _globals['_SNAPSHOTINFO']._serialized_end=8511
292
- _globals['_CREATECHECKPOINTREQUEST']._serialized_start=8513
293
- _globals['_CREATECHECKPOINTREQUEST']._serialized_end=8564
294
- _globals['_CREATECHECKPOINTRESPONSE']._serialized_start=8566
295
- _globals['_CREATECHECKPOINTRESPONSE']._serialized_end=8645
296
- _globals['_LISTCHECKPOINTSREQUEST']._serialized_start=8647
297
- _globals['_LISTCHECKPOINTSREQUEST']._serialized_end=8683
298
- _globals['_LISTCHECKPOINTSRESPONSE']._serialized_start=8685
299
- _globals['_LISTCHECKPOINTSRESPONSE']._serialized_end=8760
300
- _globals['_DELETECHECKPOINTREQUEST']._serialized_start=8762
301
- _globals['_DELETECHECKPOINTREQUEST']._serialized_end=8813
302
- _globals['_DELETECHECKPOINTRESPONSE']._serialized_start=8815
303
- _globals['_DELETECHECKPOINTRESPONSE']._serialized_end=8841
304
- _globals['_RESTORECHECKPOINTREQUEST']._serialized_start=8843
305
- _globals['_RESTORECHECKPOINTREQUEST']._serialized_end=8895
306
- _globals['_RESTORECHECKPOINTRESPONSE']._serialized_start=8897
307
- _globals['_RESTORECHECKPOINTRESPONSE']._serialized_end=8924
308
- _globals['_CHECKPOINTINFO']._serialized_start=8927
309
- _globals['_CHECKPOINTINFO']._serialized_end=9075
310
- _globals['_CREATEDISKREQUEST']._serialized_start=9077
311
- _globals['_CREATEDISKREQUEST']._serialized_end=9136
312
- _globals['_CREATEDISKRESPONSE']._serialized_start=9138
313
- _globals['_CREATEDISKRESPONSE']._serialized_end=9231
314
- _globals['_LISTDISKSREQUEST']._serialized_start=9233
315
- _globals['_LISTDISKSREQUEST']._serialized_end=9251
316
- _globals['_LISTDISKSRESPONSE']._serialized_start=9253
317
- _globals['_LISTDISKSRESPONSE']._serialized_end=9310
318
- _globals['_DISKINFO']._serialized_start=9313
319
- _globals['_DISKINFO']._serialized_end=9483
320
- _globals['_DISKATTACHMENT']._serialized_start=9485
321
- _globals['_DISKATTACHMENT']._serialized_end=9573
322
- _globals['_ATTACHDISKREQUEST']._serialized_start=9575
323
- _globals['_ATTACHDISKREQUEST']._serialized_end=9665
324
- _globals['_ATTACHDISKRESPONSE']._serialized_start=9667
325
- _globals['_ATTACHDISKRESPONSE']._serialized_end=9687
326
- _globals['_DETACHDISKREQUEST']._serialized_start=9689
327
- _globals['_DETACHDISKREQUEST']._serialized_end=9740
328
- _globals['_DETACHDISKRESPONSE']._serialized_start=9742
329
- _globals['_DETACHDISKRESPONSE']._serialized_end=9762
330
- _globals['_DESTROYDISKREQUEST']._serialized_start=9764
331
- _globals['_DESTROYDISKREQUEST']._serialized_end=9801
332
- _globals['_DESTROYDISKRESPONSE']._serialized_start=9803
333
- _globals['_DESTROYDISKRESPONSE']._serialized_end=9824
334
- _globals['_SETAUTOSUSPENDTIMEOUTREQUEST']._serialized_start=9826
335
- _globals['_SETAUTOSUSPENDTIMEOUTREQUEST']._serialized_end=9893
336
- _globals['_SETAUTOSUSPENDTIMEOUTRESPONSE']._serialized_start=9895
337
- _globals['_SETAUTOSUSPENDTIMEOUTRESPONSE']._serialized_end=9926
338
- _globals['_SETAUTOHIBERNATETIMEOUTREQUEST']._serialized_start=9928
339
- _globals['_SETAUTOHIBERNATETIMEOUTREQUEST']._serialized_end=9997
340
- _globals['_SETAUTOHIBERNATETIMEOUTRESPONSE']._serialized_start=9999
341
- _globals['_SETAUTOHIBERNATETIMEOUTRESPONSE']._serialized_end=10032
342
- _globals['_CREATEAPIKEYREQUEST']._serialized_start=10034
343
- _globals['_CREATEAPIKEYREQUEST']._serialized_end=10121
344
- _globals['_CREATEAPIKEYRESPONSE']._serialized_start=10123
345
- _globals['_CREATEAPIKEYRESPONSE']._serialized_end=10194
346
- _globals['_LISTAPIKEYSREQUEST']._serialized_start=10196
347
- _globals['_LISTAPIKEYSREQUEST']._serialized_end=10216
348
- _globals['_LISTAPIKEYSRESPONSE']._serialized_start=10218
349
- _globals['_LISTAPIKEYSRESPONSE']._serialized_end=10278
350
- _globals['_APIKEYINFO']._serialized_start=10281
351
- _globals['_APIKEYINFO']._serialized_end=10428
352
- _globals['_DELETEAPIKEYREQUEST']._serialized_start=10430
353
- _globals['_DELETEAPIKEYREQUEST']._serialized_end=10463
354
- _globals['_DELETEAPIKEYRESPONSE']._serialized_start=10465
355
- _globals['_DELETEAPIKEYRESPONSE']._serialized_end=10487
356
- _globals['_SHAREVMREQUEST']._serialized_start=10489
357
- _globals['_SHAREVMREQUEST']._serialized_end=10520
358
- _globals['_SHAREVMRESPONSE']._serialized_start=10522
359
- _globals['_SHAREVMRESPONSE']._serialized_end=10539
360
- _globals['_LISTORGSREQUEST']._serialized_start=10541
361
- _globals['_LISTORGSREQUEST']._serialized_end=10558
362
- _globals['_LISTORGSRESPONSE']._serialized_start=10560
363
- _globals['_LISTORGSRESPONSE']._serialized_end=10647
364
- _globals['_ORGSUMMARY']._serialized_start=10649
365
- _globals['_ORGSUMMARY']._serialized_end=10719
366
- _globals['_GETORGBILLINGREQUEST']._serialized_start=10721
367
- _globals['_GETORGBILLINGREQUEST']._serialized_end=10756
368
- _globals['_GETORGBILLINGRESPONSE']._serialized_start=10759
369
- _globals['_GETORGBILLINGRESPONSE']._serialized_end=11041
370
- _globals['_ORGBILLEDVM']._serialized_start=11043
371
- _globals['_ORGBILLEDVM']._serialized_end=11151
372
- _globals['_UNSHAREVMREQUEST']._serialized_start=11153
373
- _globals['_UNSHAREVMREQUEST']._serialized_end=11186
374
- _globals['_UNSHAREVMRESPONSE']._serialized_start=11188
375
- _globals['_UNSHAREVMRESPONSE']._serialized_end=11207
376
- _globals['_SETBACKUPSCHEDULEREQUEST']._serialized_start=11209
377
- _globals['_SETBACKUPSCHEDULEREQUEST']._serialized_end=11318
378
- _globals['_SETBACKUPSCHEDULERESPONSE']._serialized_start=11320
379
- _globals['_SETBACKUPSCHEDULERESPONSE']._serialized_end=11347
380
- _globals['_CLEARBACKUPSCHEDULEREQUEST']._serialized_start=11349
381
- _globals['_CLEARBACKUPSCHEDULEREQUEST']._serialized_end=11389
382
- _globals['_CLEARBACKUPSCHEDULERESPONSE']._serialized_start=11391
383
- _globals['_CLEARBACKUPSCHEDULERESPONSE']._serialized_end=11420
384
- _globals['_GETBACKUPSCHEDULEREQUEST']._serialized_start=11422
385
- _globals['_GETBACKUPSCHEDULEREQUEST']._serialized_end=11460
386
- _globals['_GETBACKUPSCHEDULERESPONSE']._serialized_start=11463
387
- _globals['_GETBACKUPSCHEDULERESPONSE']._serialized_end=11626
388
- _globals['_LISTBACKUPSREQUEST']._serialized_start=11628
389
- _globals['_LISTBACKUPSREQUEST']._serialized_end=11660
390
- _globals['_BACKUPINFO']._serialized_start=11663
391
- _globals['_BACKUPINFO']._serialized_end=11817
392
- _globals['_LISTBACKUPSRESPONSE']._serialized_start=11819
393
- _globals['_LISTBACKUPSRESPONSE']._serialized_end=11882
394
- _globals['_RESTOREBACKUPREQUEST']._serialized_start=11884
395
- _globals['_RESTOREBACKUPREQUEST']._serialized_end=11937
396
- _globals['_RESTOREBACKUPRESPONSE']._serialized_start=11939
397
- _globals['_RESTOREBACKUPRESPONSE']._serialized_end=11962
398
- _globals['_SETORGBACKUPSDEFAULTREQUEST']._serialized_start=11965
399
- _globals['_SETORGBACKUPSDEFAULTREQUEST']._serialized_end=12100
400
- _globals['_SETORGBACKUPSDEFAULTRESPONSE']._serialized_start=12102
401
- _globals['_SETORGBACKUPSDEFAULTRESPONSE']._serialized_end=12194
402
- _globals['_GETORGBACKUPSDEFAULTREQUEST']._serialized_start=12196
403
- _globals['_GETORGBACKUPSDEFAULTREQUEST']._serialized_end=12241
404
- _globals['_GETORGBACKUPSDEFAULTRESPONSE']._serialized_start=12243
405
- _globals['_GETORGBACKUPSDEFAULTRESPONSE']._serialized_end=12335
406
- _globals['_SETORGMACHINEDEFAULTSREQUEST']._serialized_start=12337
407
- _globals['_SETORGMACHINEDEFAULTSREQUEST']._serialized_end=12455
408
- _globals['_SETORGMACHINEDEFAULTSRESPONSE']._serialized_start=12457
409
- _globals['_SETORGMACHINEDEFAULTSRESPONSE']._serialized_end=12488
410
- _globals['_GETORGMACHINEDEFAULTSREQUEST']._serialized_start=12490
411
- _globals['_GETORGMACHINEDEFAULTSREQUEST']._serialized_end=12536
412
- _globals['_RESIZEVMREQUEST']._serialized_start=12538
413
- _globals['_RESIZEVMREQUEST']._serialized_end=12606
414
- _globals['_RESIZEVMRESPONSE']._serialized_start=12608
415
- _globals['_RESIZEVMRESPONSE']._serialized_end=12680
416
- _globals['_GETORGMACHINEDEFAULTSRESPONSE']._serialized_start=12683
417
- _globals['_GETORGMACHINEDEFAULTSRESPONSE']._serialized_end=12815
418
- _globals['_BOXDAPI']._serialized_start=12818
419
- _globals['_BOXDAPI']._serialized_end=19948
272
+ _globals['_DOWNLOADFILECHUNK']._serialized_start=7685
273
+ _globals['_DOWNLOADFILECHUNK']._serialized_end=7738
274
+ _globals['_CREATESNAPSHOTREQUEST']._serialized_start=7740
275
+ _globals['_CREATESNAPSHOTREQUEST']._serialized_end=7789
276
+ _globals['_CREATESNAPSHOTRESPONSE']._serialized_start=7791
277
+ _globals['_CREATESNAPSHOTRESPONSE']._serialized_end=7883
278
+ _globals['_LISTSNAPSHOTSREQUEST']._serialized_start=7885
279
+ _globals['_LISTSNAPSHOTSREQUEST']._serialized_end=7920
280
+ _globals['_LISTSNAPSHOTSRESPONSE']._serialized_start=7922
281
+ _globals['_LISTSNAPSHOTSRESPONSE']._serialized_end=7991
282
+ _globals['_GETSNAPSHOTREQUEST']._serialized_start=7993
283
+ _globals['_GETSNAPSHOTREQUEST']._serialized_end=8040
284
+ _globals['_GETSNAPSHOTRESPONSE']._serialized_start=8042
285
+ _globals['_GETSNAPSHOTRESPONSE']._serialized_end=8108
286
+ _globals['_DELETESNAPSHOTREQUEST']._serialized_start=8110
287
+ _globals['_DELETESNAPSHOTREQUEST']._serialized_end=8160
288
+ _globals['_DELETESNAPSHOTRESPONSE']._serialized_start=8162
289
+ _globals['_DELETESNAPSHOTRESPONSE']._serialized_end=8186
290
+ _globals['_CREATEVMFROMSNAPSHOTREQUEST']._serialized_start=8189
291
+ _globals['_CREATEVMFROMSNAPSHOTREQUEST']._serialized_end=8320
292
+ _globals['_SNAPSHOTINFO']._serialized_start=8323
293
+ _globals['_SNAPSHOTINFO']._serialized_end=8566
294
+ _globals['_CREATECHECKPOINTREQUEST']._serialized_start=8568
295
+ _globals['_CREATECHECKPOINTREQUEST']._serialized_end=8619
296
+ _globals['_CREATECHECKPOINTRESPONSE']._serialized_start=8621
297
+ _globals['_CREATECHECKPOINTRESPONSE']._serialized_end=8700
298
+ _globals['_LISTCHECKPOINTSREQUEST']._serialized_start=8702
299
+ _globals['_LISTCHECKPOINTSREQUEST']._serialized_end=8738
300
+ _globals['_LISTCHECKPOINTSRESPONSE']._serialized_start=8740
301
+ _globals['_LISTCHECKPOINTSRESPONSE']._serialized_end=8815
302
+ _globals['_DELETECHECKPOINTREQUEST']._serialized_start=8817
303
+ _globals['_DELETECHECKPOINTREQUEST']._serialized_end=8868
304
+ _globals['_DELETECHECKPOINTRESPONSE']._serialized_start=8870
305
+ _globals['_DELETECHECKPOINTRESPONSE']._serialized_end=8896
306
+ _globals['_RESTORECHECKPOINTREQUEST']._serialized_start=8898
307
+ _globals['_RESTORECHECKPOINTREQUEST']._serialized_end=8950
308
+ _globals['_RESTORECHECKPOINTRESPONSE']._serialized_start=8952
309
+ _globals['_RESTORECHECKPOINTRESPONSE']._serialized_end=8979
310
+ _globals['_CHECKPOINTINFO']._serialized_start=8982
311
+ _globals['_CHECKPOINTINFO']._serialized_end=9130
312
+ _globals['_CREATEDISKREQUEST']._serialized_start=9132
313
+ _globals['_CREATEDISKREQUEST']._serialized_end=9191
314
+ _globals['_CREATEDISKRESPONSE']._serialized_start=9193
315
+ _globals['_CREATEDISKRESPONSE']._serialized_end=9286
316
+ _globals['_LISTDISKSREQUEST']._serialized_start=9288
317
+ _globals['_LISTDISKSREQUEST']._serialized_end=9306
318
+ _globals['_LISTDISKSRESPONSE']._serialized_start=9308
319
+ _globals['_LISTDISKSRESPONSE']._serialized_end=9365
320
+ _globals['_DISKINFO']._serialized_start=9368
321
+ _globals['_DISKINFO']._serialized_end=9538
322
+ _globals['_DISKATTACHMENT']._serialized_start=9540
323
+ _globals['_DISKATTACHMENT']._serialized_end=9628
324
+ _globals['_ATTACHDISKREQUEST']._serialized_start=9630
325
+ _globals['_ATTACHDISKREQUEST']._serialized_end=9720
326
+ _globals['_ATTACHDISKRESPONSE']._serialized_start=9722
327
+ _globals['_ATTACHDISKRESPONSE']._serialized_end=9742
328
+ _globals['_DETACHDISKREQUEST']._serialized_start=9744
329
+ _globals['_DETACHDISKREQUEST']._serialized_end=9795
330
+ _globals['_DETACHDISKRESPONSE']._serialized_start=9797
331
+ _globals['_DETACHDISKRESPONSE']._serialized_end=9817
332
+ _globals['_DESTROYDISKREQUEST']._serialized_start=9819
333
+ _globals['_DESTROYDISKREQUEST']._serialized_end=9856
334
+ _globals['_DESTROYDISKRESPONSE']._serialized_start=9858
335
+ _globals['_DESTROYDISKRESPONSE']._serialized_end=9879
336
+ _globals['_SETAUTOSUSPENDTIMEOUTREQUEST']._serialized_start=9881
337
+ _globals['_SETAUTOSUSPENDTIMEOUTREQUEST']._serialized_end=9948
338
+ _globals['_SETAUTOSUSPENDTIMEOUTRESPONSE']._serialized_start=9950
339
+ _globals['_SETAUTOSUSPENDTIMEOUTRESPONSE']._serialized_end=9981
340
+ _globals['_SETAUTOHIBERNATETIMEOUTREQUEST']._serialized_start=9983
341
+ _globals['_SETAUTOHIBERNATETIMEOUTREQUEST']._serialized_end=10052
342
+ _globals['_SETAUTOHIBERNATETIMEOUTRESPONSE']._serialized_start=10054
343
+ _globals['_SETAUTOHIBERNATETIMEOUTRESPONSE']._serialized_end=10087
344
+ _globals['_CREATEAPIKEYREQUEST']._serialized_start=10089
345
+ _globals['_CREATEAPIKEYREQUEST']._serialized_end=10176
346
+ _globals['_CREATEAPIKEYRESPONSE']._serialized_start=10178
347
+ _globals['_CREATEAPIKEYRESPONSE']._serialized_end=10249
348
+ _globals['_LISTAPIKEYSREQUEST']._serialized_start=10251
349
+ _globals['_LISTAPIKEYSREQUEST']._serialized_end=10271
350
+ _globals['_LISTAPIKEYSRESPONSE']._serialized_start=10273
351
+ _globals['_LISTAPIKEYSRESPONSE']._serialized_end=10333
352
+ _globals['_APIKEYINFO']._serialized_start=10336
353
+ _globals['_APIKEYINFO']._serialized_end=10483
354
+ _globals['_DELETEAPIKEYREQUEST']._serialized_start=10485
355
+ _globals['_DELETEAPIKEYREQUEST']._serialized_end=10518
356
+ _globals['_DELETEAPIKEYRESPONSE']._serialized_start=10520
357
+ _globals['_DELETEAPIKEYRESPONSE']._serialized_end=10542
358
+ _globals['_SHAREVMREQUEST']._serialized_start=10544
359
+ _globals['_SHAREVMREQUEST']._serialized_end=10575
360
+ _globals['_SHAREVMRESPONSE']._serialized_start=10577
361
+ _globals['_SHAREVMRESPONSE']._serialized_end=10594
362
+ _globals['_LISTORGSREQUEST']._serialized_start=10596
363
+ _globals['_LISTORGSREQUEST']._serialized_end=10613
364
+ _globals['_LISTORGSRESPONSE']._serialized_start=10615
365
+ _globals['_LISTORGSRESPONSE']._serialized_end=10702
366
+ _globals['_ORGSUMMARY']._serialized_start=10704
367
+ _globals['_ORGSUMMARY']._serialized_end=10774
368
+ _globals['_GETORGBILLINGREQUEST']._serialized_start=10776
369
+ _globals['_GETORGBILLINGREQUEST']._serialized_end=10811
370
+ _globals['_GETORGBILLINGRESPONSE']._serialized_start=10814
371
+ _globals['_GETORGBILLINGRESPONSE']._serialized_end=11096
372
+ _globals['_ORGBILLEDVM']._serialized_start=11098
373
+ _globals['_ORGBILLEDVM']._serialized_end=11206
374
+ _globals['_UNSHAREVMREQUEST']._serialized_start=11208
375
+ _globals['_UNSHAREVMREQUEST']._serialized_end=11241
376
+ _globals['_UNSHAREVMRESPONSE']._serialized_start=11243
377
+ _globals['_UNSHAREVMRESPONSE']._serialized_end=11262
378
+ _globals['_SETBACKUPSCHEDULEREQUEST']._serialized_start=11264
379
+ _globals['_SETBACKUPSCHEDULEREQUEST']._serialized_end=11373
380
+ _globals['_SETBACKUPSCHEDULERESPONSE']._serialized_start=11375
381
+ _globals['_SETBACKUPSCHEDULERESPONSE']._serialized_end=11402
382
+ _globals['_CLEARBACKUPSCHEDULEREQUEST']._serialized_start=11404
383
+ _globals['_CLEARBACKUPSCHEDULEREQUEST']._serialized_end=11444
384
+ _globals['_CLEARBACKUPSCHEDULERESPONSE']._serialized_start=11446
385
+ _globals['_CLEARBACKUPSCHEDULERESPONSE']._serialized_end=11475
386
+ _globals['_GETBACKUPSCHEDULEREQUEST']._serialized_start=11477
387
+ _globals['_GETBACKUPSCHEDULEREQUEST']._serialized_end=11515
388
+ _globals['_GETBACKUPSCHEDULERESPONSE']._serialized_start=11518
389
+ _globals['_GETBACKUPSCHEDULERESPONSE']._serialized_end=11681
390
+ _globals['_LISTBACKUPSREQUEST']._serialized_start=11683
391
+ _globals['_LISTBACKUPSREQUEST']._serialized_end=11715
392
+ _globals['_BACKUPINFO']._serialized_start=11718
393
+ _globals['_BACKUPINFO']._serialized_end=11872
394
+ _globals['_LISTBACKUPSRESPONSE']._serialized_start=11874
395
+ _globals['_LISTBACKUPSRESPONSE']._serialized_end=11937
396
+ _globals['_TRIGGERBACKUPREQUEST']._serialized_start=11939
397
+ _globals['_TRIGGERBACKUPREQUEST']._serialized_end=11973
398
+ _globals['_TRIGGERBACKUPRESPONSE']._serialized_start=11975
399
+ _globals['_TRIGGERBACKUPRESPONSE']._serialized_end=12017
400
+ _globals['_DELETEBACKUPREQUEST']._serialized_start=12019
401
+ _globals['_DELETEBACKUPREQUEST']._serialized_end=12071
402
+ _globals['_DELETEBACKUPRESPONSE']._serialized_start=12073
403
+ _globals['_DELETEBACKUPRESPONSE']._serialized_end=12095
404
+ _globals['_RESTOREBACKUPREQUEST']._serialized_start=12097
405
+ _globals['_RESTOREBACKUPREQUEST']._serialized_end=12150
406
+ _globals['_RESTOREBACKUPRESPONSE']._serialized_start=12152
407
+ _globals['_RESTOREBACKUPRESPONSE']._serialized_end=12175
408
+ _globals['_SETORGBACKUPSDEFAULTREQUEST']._serialized_start=12178
409
+ _globals['_SETORGBACKUPSDEFAULTREQUEST']._serialized_end=12313
410
+ _globals['_SETORGBACKUPSDEFAULTRESPONSE']._serialized_start=12315
411
+ _globals['_SETORGBACKUPSDEFAULTRESPONSE']._serialized_end=12407
412
+ _globals['_GETORGBACKUPSDEFAULTREQUEST']._serialized_start=12409
413
+ _globals['_GETORGBACKUPSDEFAULTREQUEST']._serialized_end=12454
414
+ _globals['_GETORGBACKUPSDEFAULTRESPONSE']._serialized_start=12456
415
+ _globals['_GETORGBACKUPSDEFAULTRESPONSE']._serialized_end=12548
416
+ _globals['_SETORGMACHINEDEFAULTSREQUEST']._serialized_start=12550
417
+ _globals['_SETORGMACHINEDEFAULTSREQUEST']._serialized_end=12668
418
+ _globals['_SETORGMACHINEDEFAULTSRESPONSE']._serialized_start=12670
419
+ _globals['_SETORGMACHINEDEFAULTSRESPONSE']._serialized_end=12701
420
+ _globals['_GETORGMACHINEDEFAULTSREQUEST']._serialized_start=12703
421
+ _globals['_GETORGMACHINEDEFAULTSREQUEST']._serialized_end=12749
422
+ _globals['_RESIZEVMREQUEST']._serialized_start=12751
423
+ _globals['_RESIZEVMREQUEST']._serialized_end=12819
424
+ _globals['_RESIZEVMRESPONSE']._serialized_start=12821
425
+ _globals['_RESIZEVMRESPONSE']._serialized_end=12893
426
+ _globals['_GETORGMACHINEDEFAULTSRESPONSE']._serialized_start=12896
427
+ _globals['_GETORGMACHINEDEFAULTSRESPONSE']._serialized_end=13028
428
+ _globals['_BOXDAPI']._serialized_start=13031
429
+ _globals['_BOXDAPI']._serialized_end=20424
420
430
  # @@protoc_insertion_point(module_scope)
@@ -249,6 +249,11 @@ class BoxdApiStub(object):
249
249
  request_serializer=api__pb2.DownloadFileRequest.SerializeToString,
250
250
  response_deserializer=api__pb2.DownloadFileResponse.FromString,
251
251
  _registered_method=True)
252
+ self.DownloadFileStream = channel.unary_stream(
253
+ '/boxd.api.v1.BoxdApi/DownloadFileStream',
254
+ request_serializer=api__pb2.DownloadFileRequest.SerializeToString,
255
+ response_deserializer=api__pb2.DownloadFileChunk.FromString,
256
+ _registered_method=True)
252
257
  self.SuspendVm = channel.unary_unary(
253
258
  '/boxd.api.v1.BoxdApi/SuspendVm',
254
259
  request_serializer=api__pb2.SuspendVmRequest.SerializeToString,
@@ -424,6 +429,16 @@ class BoxdApiStub(object):
424
429
  request_serializer=api__pb2.ListBackupsRequest.SerializeToString,
425
430
  response_deserializer=api__pb2.ListBackupsResponse.FromString,
426
431
  _registered_method=True)
432
+ self.TriggerBackup = channel.unary_unary(
433
+ '/boxd.api.v1.BoxdApi/TriggerBackup',
434
+ request_serializer=api__pb2.TriggerBackupRequest.SerializeToString,
435
+ response_deserializer=api__pb2.TriggerBackupResponse.FromString,
436
+ _registered_method=True)
437
+ self.DeleteBackup = channel.unary_unary(
438
+ '/boxd.api.v1.BoxdApi/DeleteBackup',
439
+ request_serializer=api__pb2.DeleteBackupRequest.SerializeToString,
440
+ response_deserializer=api__pb2.DeleteBackupResponse.FromString,
441
+ _registered_method=True)
427
442
  self.RestoreBackup = channel.unary_unary(
428
443
  '/boxd.api.v1.BoxdApi/RestoreBackup',
429
444
  request_serializer=api__pb2.RestoreBackupRequest.SerializeToString,
@@ -752,6 +767,18 @@ class BoxdApiServicer(object):
752
767
  context.set_details('Method not implemented!')
753
768
  raise NotImplementedError('Method not implemented!')
754
769
 
770
+ def DownloadFileStream(self, request, context):
771
+ """Streaming download: the sibling of UploadFileStream, lifting the 4 MiB
772
+ single-message gRPC cap of DownloadFile. The first response chunk carries
773
+ `total_size`; every chunk (the first included) carries a slice of the
774
+ file's bytes in order. The client concatenates them and MUST verify the
775
+ received byte count against `total_size` — a short stream is an error,
776
+ not a truncated file.
777
+ """
778
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
779
+ context.set_details('Method not implemented!')
780
+ raise NotImplementedError('Method not implemented!')
781
+
755
782
  def SuspendVm(self, request, context):
756
783
  """Missing associated documentation comment in .proto file."""
757
784
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -986,6 +1013,23 @@ class BoxdApiServicer(object):
986
1013
  context.set_details('Method not implemented!')
987
1014
  raise NotImplementedError('Method not implemented!')
988
1015
 
1016
+ def TriggerBackup(self, request, context):
1017
+ """On-demand "back up now" (BOX-148) — captures immediately, independent of
1018
+ (and without disturbing) any schedule. Retention resolves from the VM's
1019
+ schedule, else the org default, else the platform default.
1020
+ """
1021
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
1022
+ context.set_details('Method not implemented!')
1023
+ raise NotImplementedError('Method not implemented!')
1024
+
1025
+ def DeleteBackup(self, request, context):
1026
+ """Manual deletion of a single backup by id (BOX-148). Refused for a backup
1027
+ still being captured or one a newer dedup pointer depends on.
1028
+ """
1029
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
1030
+ context.set_details('Method not implemented!')
1031
+ raise NotImplementedError('Method not implemented!')
1032
+
989
1033
  def RestoreBackup(self, request, context):
990
1034
  """Restore is IN-PLACE and DESTRUCTIVE (Q1: full disk rewrite, no
991
1035
  fork-from-backup) — callers must get explicit user confirmation first.
@@ -1262,6 +1306,11 @@ def add_BoxdApiServicer_to_server(servicer, server):
1262
1306
  request_deserializer=api__pb2.DownloadFileRequest.FromString,
1263
1307
  response_serializer=api__pb2.DownloadFileResponse.SerializeToString,
1264
1308
  ),
1309
+ 'DownloadFileStream': grpc.unary_stream_rpc_method_handler(
1310
+ servicer.DownloadFileStream,
1311
+ request_deserializer=api__pb2.DownloadFileRequest.FromString,
1312
+ response_serializer=api__pb2.DownloadFileChunk.SerializeToString,
1313
+ ),
1265
1314
  'SuspendVm': grpc.unary_unary_rpc_method_handler(
1266
1315
  servicer.SuspendVm,
1267
1316
  request_deserializer=api__pb2.SuspendVmRequest.FromString,
@@ -1437,6 +1486,16 @@ def add_BoxdApiServicer_to_server(servicer, server):
1437
1486
  request_deserializer=api__pb2.ListBackupsRequest.FromString,
1438
1487
  response_serializer=api__pb2.ListBackupsResponse.SerializeToString,
1439
1488
  ),
1489
+ 'TriggerBackup': grpc.unary_unary_rpc_method_handler(
1490
+ servicer.TriggerBackup,
1491
+ request_deserializer=api__pb2.TriggerBackupRequest.FromString,
1492
+ response_serializer=api__pb2.TriggerBackupResponse.SerializeToString,
1493
+ ),
1494
+ 'DeleteBackup': grpc.unary_unary_rpc_method_handler(
1495
+ servicer.DeleteBackup,
1496
+ request_deserializer=api__pb2.DeleteBackupRequest.FromString,
1497
+ response_serializer=api__pb2.DeleteBackupResponse.SerializeToString,
1498
+ ),
1440
1499
  'RestoreBackup': grpc.unary_unary_rpc_method_handler(
1441
1500
  servicer.RestoreBackup,
1442
1501
  request_deserializer=api__pb2.RestoreBackupRequest.FromString,
@@ -2639,6 +2698,33 @@ class BoxdApi(object):
2639
2698
  metadata,
2640
2699
  _registered_method=True)
2641
2700
 
2701
+ @staticmethod
2702
+ def DownloadFileStream(request,
2703
+ target,
2704
+ options=(),
2705
+ channel_credentials=None,
2706
+ call_credentials=None,
2707
+ insecure=False,
2708
+ compression=None,
2709
+ wait_for_ready=None,
2710
+ timeout=None,
2711
+ metadata=None):
2712
+ return grpc.experimental.unary_stream(
2713
+ request,
2714
+ target,
2715
+ '/boxd.api.v1.BoxdApi/DownloadFileStream',
2716
+ api__pb2.DownloadFileRequest.SerializeToString,
2717
+ api__pb2.DownloadFileChunk.FromString,
2718
+ options,
2719
+ channel_credentials,
2720
+ insecure,
2721
+ call_credentials,
2722
+ compression,
2723
+ wait_for_ready,
2724
+ timeout,
2725
+ metadata,
2726
+ _registered_method=True)
2727
+
2642
2728
  @staticmethod
2643
2729
  def SuspendVm(request,
2644
2730
  target,
@@ -3584,6 +3670,60 @@ class BoxdApi(object):
3584
3670
  metadata,
3585
3671
  _registered_method=True)
3586
3672
 
3673
+ @staticmethod
3674
+ def TriggerBackup(request,
3675
+ target,
3676
+ options=(),
3677
+ channel_credentials=None,
3678
+ call_credentials=None,
3679
+ insecure=False,
3680
+ compression=None,
3681
+ wait_for_ready=None,
3682
+ timeout=None,
3683
+ metadata=None):
3684
+ return grpc.experimental.unary_unary(
3685
+ request,
3686
+ target,
3687
+ '/boxd.api.v1.BoxdApi/TriggerBackup',
3688
+ api__pb2.TriggerBackupRequest.SerializeToString,
3689
+ api__pb2.TriggerBackupResponse.FromString,
3690
+ options,
3691
+ channel_credentials,
3692
+ insecure,
3693
+ call_credentials,
3694
+ compression,
3695
+ wait_for_ready,
3696
+ timeout,
3697
+ metadata,
3698
+ _registered_method=True)
3699
+
3700
+ @staticmethod
3701
+ def DeleteBackup(request,
3702
+ target,
3703
+ options=(),
3704
+ channel_credentials=None,
3705
+ call_credentials=None,
3706
+ insecure=False,
3707
+ compression=None,
3708
+ wait_for_ready=None,
3709
+ timeout=None,
3710
+ metadata=None):
3711
+ return grpc.experimental.unary_unary(
3712
+ request,
3713
+ target,
3714
+ '/boxd.api.v1.BoxdApi/DeleteBackup',
3715
+ api__pb2.DeleteBackupRequest.SerializeToString,
3716
+ api__pb2.DeleteBackupResponse.FromString,
3717
+ options,
3718
+ channel_credentials,
3719
+ insecure,
3720
+ call_credentials,
3721
+ compression,
3722
+ wait_for_ready,
3723
+ timeout,
3724
+ metadata,
3725
+ _registered_method=True)
3726
+
3587
3727
  @staticmethod
3588
3728
  def RestoreBackup(request,
3589
3729
  target,
@@ -23,6 +23,16 @@ from .errors import BoxdError, from_grpc_error, is_retryable
23
23
  # First backoff, doubled per attempt. Two retries by default ⇒ 0.5s then 1.0s.
24
24
  _BACKOFF_BASE_SECS = 0.5
25
25
 
26
+ # grpcio defaults the receive limit to 4 MiB, which quietly caps
27
+ # ``machines.download()`` and any other large unary response. Lift both
28
+ # directions to 64 MiB — enough for realistic single-message file reads while
29
+ # still bounding memory. Larger transfers should use the streaming file path.
30
+ _MAX_MESSAGE_BYTES = 64 * 1024 * 1024
31
+ _CHANNEL_OPTIONS = [
32
+ ("grpc.max_receive_message_length", _MAX_MESSAGE_BYTES),
33
+ ("grpc.max_send_message_length", _MAX_MESSAGE_BYTES),
34
+ ]
35
+
26
36
 
27
37
  class _TransportBase:
28
38
  def __init__(
@@ -63,8 +73,12 @@ class _TransportBase:
63
73
  def _build_channel(self, factory_secure, factory_insecure):
64
74
  endpoint = resolve_endpoint(self.base_url)
65
75
  if endpoint.use_tls:
66
- return factory_secure(endpoint.target, grpc.ssl_channel_credentials())
67
- return factory_insecure(endpoint.target)
76
+ return factory_secure(
77
+ endpoint.target,
78
+ grpc.ssl_channel_credentials(),
79
+ options=_CHANNEL_OPTIONS,
80
+ )
81
+ return factory_insecure(endpoint.target, options=_CHANNEL_OPTIONS)
68
82
 
69
83
  def _metadata(self, token: str) -> list[tuple[str, str]]:
70
84
  return [("authorization", f"Bearer {token}"), *_version_check.request_metadata()]
@@ -59,6 +59,9 @@ class MachineResources(BaseModel):
59
59
  vcpu: int
60
60
  memory_bytes: int
61
61
  disk_bytes: int
62
+ """The machine's fixed disk *allocation* — always the platform constant
63
+ (100 GiB), identical on every machine. Not a usage figure: it does not grow
64
+ as the disk fills. There is no "disk used" field on the API yet."""
62
65
 
63
66
 
64
67
  class MachineAccess(BaseModel):
@@ -560,12 +560,24 @@ class Files(Namespace):
560
560
  return resp.bytes_written
561
561
 
562
562
  def download(self, machine_id: str, path: str) -> bytes:
563
- """Read a file out of the machine."""
564
- resp = self._transport.call(
565
- "DownloadFile",
563
+ """Read a file out of the machine. Streamed, so there is no size cap."""
564
+ chunks: list[bytes] = []
565
+ received = 0
566
+ total: int | None = None
567
+ for chunk in self._transport.server_stream(
568
+ "DownloadFileStream",
566
569
  api_pb2.DownloadFileRequest(vm_id=machine_id, path=path),
567
- )
568
- return resp.data
570
+ ):
571
+ if chunk.total_size:
572
+ total = chunk.total_size
573
+ if chunk.data:
574
+ chunks.append(chunk.data)
575
+ received += len(chunk.data)
576
+ if total is not None and received != total:
577
+ raise BoxdError(
578
+ f"download truncated: expected {total} bytes, got {received}"
579
+ )
580
+ return b"".join(chunks)
569
581
 
570
582
 
571
583
  class Ports(Namespace):
@@ -746,6 +758,22 @@ class Backups(Namespace):
746
758
  )
747
759
  return [m.backup(b) for b in resp.backups]
748
760
 
761
+ def trigger(self, machine_id: str) -> str:
762
+ """Back up the machine's disk right now, regardless of any schedule.
763
+ Returns the id of the queued backup."""
764
+ resp = self._transport.call(
765
+ "TriggerBackup", api_pb2.TriggerBackupRequest(vm=machine_id)
766
+ )
767
+ return resp.backup_id
768
+
769
+ def delete(self, machine_id: str, backup_id: str) -> None:
770
+ """Delete a single backup. Refused while it is still being captured or
771
+ while a newer unchanged-since backup still points at it."""
772
+ self._transport.call(
773
+ "DeleteBackup",
774
+ api_pb2.DeleteBackupRequest(vm=machine_id, backup_id=backup_id),
775
+ )
776
+
749
777
  def restore(self, machine_id: str, backup_id: str) -> None:
750
778
  """Restore the machine's disk from a backup IN PLACE. Destructive:
751
779
  overwrites the machine's current disk; anything since is lost."""
@@ -1138,12 +1166,25 @@ class AsyncFiles(Namespace):
1138
1166
  return resp.bytes_written
1139
1167
 
1140
1168
  async def download(self, machine_id: str, path: str) -> bytes:
1141
- """Read a file out of the machine."""
1142
- resp = await self._transport.call(
1143
- "DownloadFile",
1169
+ """Read a file out of the machine. Streamed, so there is no size cap."""
1170
+ chunks: list[bytes] = []
1171
+ received = 0
1172
+ total: int | None = None
1173
+ stream = await self._transport.server_stream(
1174
+ "DownloadFileStream",
1144
1175
  api_pb2.DownloadFileRequest(vm_id=machine_id, path=path),
1145
1176
  )
1146
- return resp.data
1177
+ async for chunk in stream:
1178
+ if chunk.total_size:
1179
+ total = chunk.total_size
1180
+ if chunk.data:
1181
+ chunks.append(chunk.data)
1182
+ received += len(chunk.data)
1183
+ if total is not None and received != total:
1184
+ raise BoxdError(
1185
+ f"download truncated: expected {total} bytes, got {received}"
1186
+ )
1187
+ return b"".join(chunks)
1147
1188
 
1148
1189
 
1149
1190
  class AsyncPorts(Namespace):
@@ -1300,6 +1341,22 @@ class AsyncBackups(Namespace):
1300
1341
  )
1301
1342
  return [m.backup(b) for b in resp.backups]
1302
1343
 
1344
+ async def trigger(self, machine_id: str) -> str:
1345
+ """Back up the machine's disk right now, regardless of any schedule.
1346
+ Returns the id of the queued backup."""
1347
+ resp = await self._transport.call(
1348
+ "TriggerBackup", api_pb2.TriggerBackupRequest(vm=machine_id)
1349
+ )
1350
+ return resp.backup_id
1351
+
1352
+ async def delete(self, machine_id: str, backup_id: str) -> None:
1353
+ """Delete a single backup. Refused while it is still being captured or
1354
+ while a newer unchanged-since backup still points at it."""
1355
+ await self._transport.call(
1356
+ "DeleteBackup",
1357
+ api_pb2.DeleteBackupRequest(vm=machine_id, backup_id=backup_id),
1358
+ )
1359
+
1303
1360
  async def restore(self, machine_id: str, backup_id: str) -> None:
1304
1361
  """Restore the machine's disk from a backup IN PLACE. Destructive."""
1305
1362
  await self._transport.call(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boxd
3
- Version: 0.2.8
3
+ Version: 0.2.9.dev452
4
4
  Summary: Python SDK for the boxd cloud VM platform
5
5
  Author: Azin
6
6
  License-Expression: MIT
@@ -112,6 +112,12 @@ The first of these that is present wins:
112
112
  If your key is revoked mid-session, the SDK fails fast with
113
113
  `AuthenticationError` rather than retrying.
114
114
 
115
+ The exchange endpoint is **rate-limited per source IP** (30 requests / 60s). A
116
+ session token is valid for one hour, so a fleet of workers behind one NAT
117
+ should **mint one token and share it** (`Boxd(token=...)`) rather than each
118
+ process exchanging its own key. On a 429 the SDK waits out one `Retry-After`
119
+ before raising `RateLimitError`.
120
+
115
121
  ### Inside a machine
116
122
 
117
123
  Inside a boxd machine, `Boxd()` authenticates automatically — no API key
@@ -400,7 +406,9 @@ data = boxd.machines.files.download(id, "/app/output.json") # bytes
400
406
  ```
401
407
 
402
408
  `upload` takes `str` or `bytes`, streams it in chunks so large files are fine,
403
- and returns the number of bytes the machine confirmed it wrote.
409
+ and returns the number of bytes the machine confirmed it wrote. `download`
410
+ streams too and returns the whole file as `bytes` — there is no size cap, but
411
+ it is all held in memory.
404
412
 
405
413
  ### Ports and proxies
406
414
 
@@ -14,7 +14,7 @@ from boxd._credentials import (
14
14
  parse_exchange,
15
15
  parse_vm_token,
16
16
  )
17
- from boxd.errors import AuthenticationError
17
+ from boxd.errors import AuthenticationError, RateLimitError
18
18
 
19
19
  EXCHANGE = "https://app.boxd.sh/api/v1/auth/token"
20
20
 
@@ -200,13 +200,18 @@ def test_parse_exchange_ok():
200
200
 
201
201
  @pytest.mark.parametrize(
202
202
  ("status", "match"),
203
- [(401, "invalid or expired"), (429, "rate limit"), (500, "exchange failed")],
203
+ [(401, "invalid or expired"), (500, "exchange failed")],
204
204
  )
205
205
  def test_parse_exchange_errors(status, match):
206
206
  with pytest.raises(AuthenticationError, match=match):
207
207
  parse_exchange(status, "body", None)
208
208
 
209
209
 
210
+ def test_parse_exchange_rate_limited():
211
+ with pytest.raises(RateLimitError, match="rate limit"):
212
+ parse_exchange(429, "body", None)
213
+
214
+
210
215
  def test_parse_exchange_rejects_malformed_body():
211
216
  with pytest.raises(AuthenticationError, match="malformed"):
212
217
  parse_exchange(200, "not json", None)
@@ -277,6 +282,38 @@ def test_exchange_refreshes_inside_the_skew_window(monkeypatch):
277
282
  assert c.token() == "jwt-2"
278
283
 
279
284
 
285
+ def test_exchange_retries_once_on_429(monkeypatch):
286
+ calls = {"n": 0}
287
+
288
+ class FakeResponse:
289
+ def __init__(self, status: int):
290
+ self.status_code = status
291
+ self.text = "{}"
292
+ self.headers = {"retry-after": "0"}
293
+
294
+ def json(self):
295
+ return {"token": "jwt-after-429", "expires_at": time.time() + 3600}
296
+
297
+ class FakeClient:
298
+ def __init__(self, **kwargs):
299
+ pass
300
+
301
+ def __enter__(self):
302
+ return self
303
+
304
+ def __exit__(self, *a):
305
+ return False
306
+
307
+ def post(self, url, json=None):
308
+ calls["n"] += 1
309
+ return FakeResponse(429 if calls["n"] == 1 else 200)
310
+
311
+ monkeypatch.setattr("boxd._credentials.httpx.Client", FakeClient)
312
+ c = creds(api_key="bxd_key")
313
+ assert c.token() == "jwt-after-429"
314
+ assert calls["n"] == 2
315
+
316
+
280
317
  # --- async twin behaves identically ---
281
318
 
282
319
 
@@ -224,8 +224,25 @@ def test_files_upload_streams_and_returns_bytes_written():
224
224
 
225
225
 
226
226
  def test_files_download_returns_bytes():
227
- transport = FakeTransport([api_pb2.DownloadFileResponse(data=b"payload")])
227
+ transport = FakeTransport(
228
+ [
229
+ [
230
+ api_pb2.DownloadFileChunk(total_size=7),
231
+ api_pb2.DownloadFileChunk(data=b"pay"),
232
+ api_pb2.DownloadFileChunk(data=b"load"),
233
+ ]
234
+ ]
235
+ )
228
236
  assert Machines(transport).files.download("alpha", "/tmp/x") == b"payload"
237
+ assert transport.calls[0][0] == "DownloadFileStream"
238
+
239
+
240
+ def test_files_download_rejects_truncated_stream():
241
+ transport = FakeTransport(
242
+ [[api_pb2.DownloadFileChunk(total_size=100), api_pb2.DownloadFileChunk(data=b"short")]]
243
+ )
244
+ with pytest.raises(BoxdError, match="truncated"):
245
+ Machines(transport).files.download("alpha", "/tmp/x")
229
246
 
230
247
 
231
248
  def test_ports_expose():
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes