- DispatchSection: add cloud-hypervisor option (labelled experimental, default off); default stays docker; hint states a KVM-host CHV worker must claim the task (otherwise it stays queued; attachments are rejected by the backend at creation) and that the frontend only passes the executor value through, never bypassing the backend allowlist. - EnvSection: same option, because the backend env-create allowlist (local/docker/cloud-hypervisor) does allow it; note states env allowlist excludes cloud. - TaskListSection: add cloud-hypervisor to the executor filter so CHV tasks are findable; list rows already showed executor. - TaskDetailPanel: pure display note for cloud-hypervisor tasks (experimental, default off, no VM controls); detail already showed executor from the task API. - README: document the CHV console entry, experimental marking, and verbatim backend-error display. - Rebuilt cloud/console.html from src (tsc + vite single-file build); no backend change: executor is already returned by _task_to_dict.
43 lines
2.4 KiB
TypeScript
43 lines
2.4 KiB
TypeScript
import { useState } from "react";
|
||
import { useConsole } from "../context";
|
||
import { Card, Bar, DataListRaw } from "../components/ui";
|
||
import { shortId } from "../api/client";
|
||
|
||
export default function EnvSection() {
|
||
const ctx = useConsole();
|
||
const [name, setName] = useState("");
|
||
const [branch, setBranch] = useState("");
|
||
const [executor, setExecutor] = useState("");
|
||
return (
|
||
<Card id="nav-env" title={<>环境 <span className="muted">(选、建、管:当前项目的基准检出)</span></>}>
|
||
<Bar>
|
||
<button onClick={ctx.refreshEnvs}>刷新</button>
|
||
<span className="muted">{ctx.envCount}</span>
|
||
</Bar>
|
||
{ctx.envs.length === 0 ? <div className="muted">先选项目</div> : (
|
||
<DataListRaw>
|
||
{ctx.envs.map((e) => (
|
||
<li key={e.id}>
|
||
<span className="row-main">
|
||
{e.name}({shortId(e.id)}) / 分支 {e.branch || "默认分支"} / 执行器 {e.executor || "不限"} / 状态 {e.status}
|
||
{e.status === "failed" && e.error_text ? " / 失败原因:" + e.error_text : ""}
|
||
</span>
|
||
{e.status === "archived" ? null : <button onClick={() => void ctx.archiveEnv(e.id)}>归档</button>}
|
||
</li>
|
||
))}
|
||
</DataListRaw>
|
||
)}
|
||
<Bar>
|
||
<input type="text" placeholder="新环境名" value={name} onChange={(e) => setName(e.target.value)} />
|
||
<input type="text" placeholder="分支(可选,空=默认分支)" value={branch} onChange={(e) => setBranch(e.target.value)} />
|
||
<select aria-label="新环境执行器" value={executor} onChange={(e) => setExecutor(e.target.value)}>
|
||
<option value="">执行器:不限</option><option value="local">local</option><option value="docker">docker</option><option value="cloud-hypervisor">cloud-hypervisor(实验,默认关闭)</option>
|
||
</select>
|
||
<button onClick={async () => { await ctx.createEnv(name, branch, executor); setName(""); setBranch(""); }}>新建环境</button>
|
||
</Bar>
|
||
{executor === "cloud-hypervisor" ? <div className="muted">实验执行器,默认关闭:环境创建白名单同样允许 cloud-hypervisor(后端环境接口 allowlist:local / docker / cloud-hypervisor,不含 cloud);仍需后端有 KVM 宿主上的 CHV worker 才会认领,否则任务排队。前端只传值,不绕过后端白名单。</div> : null}
|
||
<span className="muted">{ctx.envMsg}</span>
|
||
</Card>
|
||
);
|
||
}
|