接入命令的终端 (WebSocket)
连接到以 tty 启动的命令的 WebSocket。OpenAPI 无法描述其中的消息;x-websocket 列出了它们。二进制消息是原始字节:一个方向是键入的内容,另一个方向是终端显示的内容。文本消息是 JSON:客户端发送 TerminalResize 和 TerminalSignal;服务端在命令结束时发送 TerminalExit,在命令丢失时发送 TerminalError,随后以代码 1000 关闭连接;当客户端落后的程度超出沙箱保留的输出时,服务端会在接下来显示的内容之前发送 TerminalGap(显示的内容不带位置信息;如果客户端自己计数,以便用 from 重新接入,就应从那里继续计数)。如果期间沙箱被迁到另一个节点,服务端会以 TerminalError sandbox_moved 结束连接(附带沙箱去了哪里,以及 offset,即已显示到的位置),关闭代码为 1012,原因为 sandbox_moved:命令在那里继续运行,通过控制平面并把 from 设为 offset 即可重新接入终端。静默 20 秒后服务端会发送 ping。离开不会结束命令:重新接入时,会先收到终端最后显示的 64 KiB(或者从 from 开始的全部内容)。打开的终端不会让任何东西保持运行;下一次按键会唤醒休眠中的沙箱。浏览器无法为 WebSocket 设置请求头,可以把带 tty 权限范围的沙箱令牌作为 sandbox_token 传递。没有以 tty 启动的命令也可以接入:它的输出以二进制消息的形式到达。
消息格式见事件流和终端。
所需权限范围:tty,或带 tty 的沙箱令牌。
https://api.glac.ai/v1/sandboxes/{id}/exec/{exec_id}/tty授权
路径参数
查询参数
请求头参数
Returns
101
此后连接即为 WebSocket。
400
请求不符合本调用的要求。unknown_parameter:查询中有本调用不接受的参数;websocket_expected:请求不是 WebSocket 升级请求;invalid_field:某个字段或查询参数类型错误或超出范围。
401
missing_api_key, invalid_api_key, expired_api_key, invalid_token.
403
凭据无权执行此操作。token_scope:沙箱令牌缺少所需的权限范围。spend_limit_reached:沙箱因达到支出上限而被冻结;它会连同数据一起休眠,直到上限提高。
404
请求中指定的对象不存在。sandbox_not_found:沙箱不存在;exec_not_found:沙箱中没有该命令。
409
某个对象的状态不允许此操作。sandbox_failed:沙箱处于 failed 状态。
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 指明。