立即让沙箱休眠
保存沙箱的内存并结束其虚拟机,不管里面正在发生什么。正在等待沙箱中某个命令的调用不会失败:它会继续等待,如果在超时之前有什么唤醒了沙箱,就能拿到命令的结果。如果没有,run 返回 202,GET …/exec/{exec_id}?wait_seconds= 返回 200,两者都带有沙箱进入休眠时命令的状态,而且都不会唤醒沙箱。已在休眠或处于 failed 的沙箱原样返回;处于 starting 的沙箱会等它启动,创建请求还没返回的沙箱(正在挂载存储卷,或在等模板推迟的启动命令:TemplateBuildRequest.start_after_volumes)也会等,最多三分钟。没有专门唤醒沙箱的调用:任何需要沙箱的操作都会唤醒它。不接受请求体,或只接受 {}。
所需权限范围:write。
https://api.glac.ai/v1/sandboxes/{id}/sleep授权
路径参数
请求头参数
请求体JSON可选
Returns
200
沙箱,状态为 sleeping。
- image_digeststring | nullrequired
其磁盘所来自的镜像,按其清单(或清单列表)的摘要,与构建其模板时镜像仓库给出的一致 (
Template.image_digest):即当时标签所指的镜像。之后移动标签,会让之后创建的沙箱使用另一个镜像(一个更新的模板),而这个沙箱的保持不变。在其模板构建期间 (starting):构建所用的镜像,如果创建时已知(发现标签指向比那里的模板更新的镜像,就按那个摘要构建),否则为 null;模板没有说明时(从磁盘文件构建的,或在模板记录这一信息之前构建的)也为 null。pattern: ^[A-Za-z0-9]+:[0-9A-Fa-f]{32,}$ - sleep_tierrequired
sleeping状态的沙箱以何种方式休眠;其他状态为 null。paused:其虚拟机连同进程和连接静止在节点的内存中(开启了暂停层级的节点会暂停空闲的沙箱,而不是保存它),调用会在约一毫秒内恢复它;其虚拟机占用的内存像运行中的沙箱一样计量(usage.memory_bytes、memory_gib_seconds),CPU 不计量。saved:其内存和设备状态保存在节点上,什么都没有在运行;调用会在几毫秒内从中唤醒它。disk:只剩下磁盘(其虚拟机自行结束了,节点守护进程没有让它休眠就结束了,或者其内存无法保留);下一个需要它的调用会从磁盘启动它,原来运行的东西都已不在。POST /v1/sandboxes/{id}/sleep会保存沙箱,无论它是暂停的还是在运行的。 - failure_coderequired
沙箱为何处于
failed,供程序使用;其他情况为 null。image_not_found:镜像不在其仓库中,或者不是公开的(对于没有指定凭据的创建请求,需要登录的仓库只会这样说)。image_pull_failed:连不上镜像仓库,或者仓库没有交出镜像,或者拉取工具因节点的某项限制被停止(failure会说明是哪一项)。registry_auth_failed:镜像仓库拒绝了创建请求指定的凭据 (image_pull_secret);failure中有仓库的说明。image_unpack_failed:镜像放不进磁盘、超过节点接受的大小(failure中有具体数字),或者无法解压。invalid_image:镜像仓库位于节点上或私有网络中的地址,或者无法按要求启动镜像(start: true却没有 ENTRYPOINT 或 CMD,或者标签要求了无法做到的事)。boot_failed:用镜像创建的虚拟机没有启动,或者其启动命令没能启动(此时failure会给出就绪检查得到的结果以及它最后打印的内容)。no_capacity:节点没有空间。memory_full:宿主机的内存没有空间容纳构建其模板所用的虚拟机,或容纳它自己的虚拟机。drive_full:构建镜像模板期间,节点的数据盘满了。record_lost:无法读取沙箱的记录;其文件保留在节点上,但它无法启动,只能删除。recovery_failed:沙箱的启动恢复无法完成;其文件和恢复意图保留在节点上,它无法启动,只能删除。start_failed:其他任何情况;节点日志中有记录。 - egressobjectrequired
沙箱存储下来的出站规则:它可以访问什么、可以向某个主机请求什么,以及它的哪些请求会被加上机密。总是存在;没有规则的沙箱,
default为allow,四个列表为空,其流量走的是没有规则时的路径。deny涉及的连接或数据包会被拒绝;allow涉及的会放行;其他的按default处理。inject中的主机视为允许,http中的主机对其条目允许的请求也视为允许。无论规则怎么说,沙箱都访问不到节点、其他沙箱、私有地址段以及各云平台的元数据地址。主机名会与 TLS 握手的服务器名称、HTTP 请求的 Host 头匹配(任何端口),也会与沙箱的 DNS 查询匹配;对于规则可以拒绝某个名称的沙箱,节点会自己回答其 DNS 查询(被拒绝的名称得到
REFUSED)。指明某个允许主机的连接,会发往节点为该名称解析出的地址,无论沙箱原本要连哪个地址。既不是 TLS 也不是 HTTP 的 TCP 连接,只有发往规则列出的地址,或节点作为某个允许名称的地址告诉沙箱的地址时,才会放行。UDP 和其他所有协议只按地址判断。在default: allow下,deny列表算不上一堵墙:任何允许的中转流量都能绕过它。 - delete_after_idle_msinteger | nullrequired
休眠多久后节点删除该沙箱,单位为毫秒,从
idle_since起算:被唤醒的沙箱从下一次休眠起重新计算。null:不会因此删除(默认);沙箱会一直保留,直到被删除或其expires_at到期。不会自行休眠的沙箱(sleep_after_seconds为 null)计算的是被让它进入的休眠(POST /v1/sandboxes/{id}/sleep、其节点重启)。冻结期间(其所有者的支出上限)不计算:冻结会连同数据保留它,解冻后,其当前的休眠从那时开始计算。format: int64 · minimum: 1000 - awake_becausestring | nullrequired
运行中的沙箱为什么还没有被休眠,用几个词说明。
status不是running时为 null。应用的实例给出节点提供的原因:手头有请求、有调用在进行中、有请求在不到其sleep_after_seconds之前刚结束,或者其应用的下限让它保持运行。被项目网络上的数据包唤醒、之后再没有别的东西让它保持运行的沙箱,会说明这一点以及是哪个数据包:woken by a packet: TCP from 10.64.0.7:41594 to port 5432 [S] …。项目内部的连接不会让任何沙箱保持运行:在它休眠期间经由这些连接到来的数据,由节点暂存 (Node.hold)。 - url_patternoptionalstring | null
端口的预览 URL,其中的
{port}和{signature}需要填入:签名为 base32(HMAC-SHA256(key =url_secret, message = port)) 的前 12 个字符(port 为十进制的端口号),使用字母表0123456789abcdefghjkmnpqrstvwxyz。对于公开端口(public_ports中的端口,或者给出public_ports_except时其中没有指定的端口),去掉-{signature}。节点没有预览域名时为 null;调用方是沙箱令牌时没有这个字段。
400
请求不符合本调用的要求。invalid_json:请求体不是 JSON 对象;unknown_field:请求体中有本调用不接受的字段;unknown_parameter:查询中有本调用不接受的参数;invalid_idempotency_key:Idempotency-Key 为空或超过 255 个字符。
401
missing_api_key, invalid_api_key, expired_api_key, invalid_token.
403
凭据无权执行此操作。needs_api_key:沙箱令牌不能执行此操作。
404
请求中指定的对象不存在。sandbox_not_found:沙箱不存在。
409
某个对象的状态不允许此操作。sandbox_failed:沙箱处于 failed 状态;idempotency_key_reused:该键已与另一个请求体一起使用过;idempotency_in_progress:使用该键的第一个请求仍在执行;busy:一次没有完成的挂载之后,某个存储卷仍占着沙箱的一个空余磁盘(客户机对它的读取被卡住,是一个数据块迟迟不来的云盘),等读取结束后才会卸下;或者沙箱的客户机在它的某个云盘上有一次读取被卡住(数据块迟迟不来:错误信息会指明是哪个云盘以及卡了多久),直到那次读取结束;或者三分钟后它的创建请求仍未返回:稍后再次发起同一调用即可。static_instance:该沙箱是节点按静态配置维护的实例 (GET /internal/static),除非节点停止,否则从不休眠。
default
其他任何失败,格式相同。internal (500):节点出错;错误信息不会多说,节点日志中以请求的 id 记录了原因。unavailable(503,可重试):no_capacity,节点的网络槽位都已占用;memory_full,调用需要启动的虚拟机(创建、唤醒、从磁盘启动、恢复、回滚、构建)在宿主机内存中放不下(还要算上已承诺给其上运行的虚拟机的内存),也没有暂停或空闲的虚拟机可以让其休眠来腾出空间(节点的 memory);drive_full,调用需要构建模板,而节点的数据盘没有空间(节点的 drive);unavailable,节点正在关闭、沙箱 10 分钟后仍处于 starting、沙箱没有响应,或者沙箱正在迁到本节点(带 Retry-After: 1);fenced,节点的租约隔离了该沙箱 (Node.lease)。moved (409):沙箱已迁到另一个节点,由 to 指明。