import{E as ee}from"./index-BjEW7-SA.js";import{E as te}from"./index-BDEF353-.js";import{E as ae,a as le}from"./el-select-Dl-FRZQd.js";import{E as ne}from"./el-progress-DuOxpLST.js";import{E as se}from"./el-space-Bcqwkggw.js";import{a as oe,E as ie}from"./el-table-D8K5zLyz.js";import{a as ue,E as de}from"./el-tab-pane-DliV6btA.js";import{v as re}from"./directive-DsZckUTJ.js";import{aF as N,aG as T,d as pe,y as c,D as me,G as ce,ah as _e,K as fe,c as _,q as i,aa as o,g as I,s as t,w as a,ac as be,j as k,o as p,x as u,M as B,ad as D,e as E,v as ge}from"./index-BKKvzUDD.js";import"./el-scrollbar-ClJnvz-9.js";import"./el-popper-D6_hxRbQ.js";/* empty css */import"./el-tooltip-l0sNRNKZ.js";import"./el-checkbox-qGZ2-RM2.js";import{_ as ve}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./index-CWUnzf90.js";import"./castArray-5uErZEc3.js";import"./vnode-78qeDweP.js";import"./index-D5ryD3I5.js";import"./raf-C-x62Pcl.js";import"./scroll-BkzZKETR.js";import"./index-DLzof2Fz.js";import"./clamp-CbbY8h6F.js";import"./toNumber-Dkj3QRv9.js";import"./_baseIteratee-BAilevJ_.js";import"./index-GAnQrJsQ.js";import"./_baseClone-B5RBzbh5.js";import"./debounce-ByXPNh5F.js";import"./omit-BTSq4AYh.js";const he=()=>N("/compute/nodes"),ye=m=>T(`/compute/nodes/${m}/test-connection`),we=m=>T(`/compute/nodes/${m}/enable`),Ce=m=>T(`/compute/nodes/${m}/disable`),ke=m=>T(`/compute/nodes/${m}/drain`),Ee=()=>N("/compute/gpus"),Ne=()=>N("/compute/queue"),Te=m=>N(`/compute/nodes/${m}/replicas`),Ge={class:"compute-page"},Ve={class:"compute-header"},Pe={class:"header-actions"},Se={key:0,class:"last-updated"},Ue={class:"summary-grid"},$e={class:"summary-tile"},qe={class:"summary-tile"},xe={class:"summary-tile"},Ie={class:"summary-tile"},Be={class:"mono"},De={class:"muted mono"},Le={class:"muted"},ze={class:"muted"},Re={key:0,class:"muted"},je={class:"muted"},Me={class:"replica-toolbar"},Fe={key:0,class:"muted"},Ae=pe({__name:"ComputeNodesView",setup(m){const L=be(),j=ge(),G=c(String(L.query.tab||"nodes")),V=c(!1),f=c([]),v=c([]),P=c([]),S=c([]),b=c(""),U=c("");let $=null;const z=k(()=>f.value.find(l=>l.id===b.value)),M=k(()=>f.value.filter(l=>l.enabled).length),F=k(()=>v.value.filter(l=>l.status==="busy"||l.status==="reserved").length),A=k(()=>f.value.reduce((l,n)=>l+n.current_running_jobs,0));me(()=>L.query.tab,l=>{G.value=String(l||"nodes")});async function h(){V.value=!0;try{const[l,n,d]=await Promise.all([he(),Ee(),Ne()]);f.value=l,v.value=n,P.value=d,!b.value&&l.length&&(b.value=l[0].id),await R(),U.value=new Date().toLocaleTimeString("zh-CN",{hour12:!1})}finally{V.value=!1}}async function R(){if(!b.value){S.value=[];return}S.value=await Te(b.value)}async function J(l){await j.replace({path:"/compute",query:{tab:String(l)}})}async function y(l,n){const d=String(n.id);l==="enable"&&await we(d),l==="disable"&&await Ce(d),l==="drain"&&await ke(d),l==="test"&&await ye(d),await h()}function K(l){return l==="online"?"success":l==="draining"||l==="maintenance"?"warning":"info"}function O(l){return l==="running"?"success":l==="syncing"||l==="queued"?"warning":l==="failed"?"danger":"info"}function Q(l){return l==="busy"?"success":l==="reserved"?"warning":"info"}return ce(()=>{h(),$=setInterval(h,5e3)}),_e(()=>{$&&clearInterval($)}),(l,n)=>{const d=ee,s=ie,g=te,W=se,w=oe,C=de,q=ne,H=le,X=ae,Y=ue,Z=re;return fe((p(),_("section",Ge,[i("header",Ve,[n[3]||(n[3]=i("div",null,[i("h1",null,"算力节点"),i("p",null,"维护训练算力节点、GPU 状态、任务队列和模型/数据集本地副本。")],-1)),i("div",Pe,[U.value?(p(),_("span",Se,"更新 "+o(U.value),1)):I("",!0),t(d,{onClick:h},{default:a(()=>[...n[2]||(n[2]=[u("刷新",-1)])]),_:1})])]),i("div",Ue,[i("div",$e,[n[4]||(n[4]=i("span",null,"在线节点",-1)),i("strong",null,o(M.value)+" / "+o(f.value.length),1)]),i("div",qe,[n[5]||(n[5]=i("span",null,"GPU 占用",-1)),i("strong",null,o(F.value)+" / "+o(v.value.length),1)]),i("div",xe,[n[6]||(n[6]=i("span",null,"运行任务",-1)),i("strong",null,o(A.value),1)]),i("div",Ie,[n[7]||(n[7]=i("span",null,"队列任务",-1)),i("strong",null,o(P.value.length),1)])]),t(Y,{modelValue:G.value,"onUpdate:modelValue":n[1]||(n[1]=e=>G.value=e),class:"compute-tabs",onTabChange:J},{default:a(()=>[t(C,{label:"节点",name:"nodes"},{default:a(()=>[t(w,{data:f.value,height:"100%"},{default:a(()=>[t(s,{prop:"code",label:"节点编码","min-width":"150"}),t(s,{prop:"name",label:"节点名称","min-width":"150"}),t(s,{label:"状态",width:"120"},{default:a(({row:e})=>[t(g,{type:K(e.scheduler_status)},{default:a(()=>[u(o(e.scheduler_status),1)]),_:2},1032,["type"])]),_:1}),t(s,{label:"启用",width:"90"},{default:a(({row:e})=>[t(g,{type:e.enabled?"success":"info"},{default:a(()=>[u(o(e.enabled?"启用":"停用"),1)]),_:2},1032,["type"])]),_:1}),t(s,{prop:"scheduler_weight",label:"权重",width:"90"}),t(s,{label:"标签","min-width":"220"},{default:a(({row:e})=>[t(W,{wrap:""},{default:a(()=>[(p(!0),_(B,null,D(e.tags,r=>(p(),E(g,{key:r,effect:"plain"},{default:a(()=>[u(o(r),1)]),_:2},1024))),128))]),_:2},1024)]),_:1}),t(s,{label:"任务/GPU",width:"120"},{default:a(({row:e})=>[u(o(e.current_running_jobs)+" / "+o(e.gpu_count),1)]),_:1}),t(s,{label:"服务地址","min-width":"260"},{default:a(({row:e})=>[i("div",Be,o(e.api_base_url),1),i("div",De,o(e.file_gateway_url),1)]),_:1}),t(s,{label:"操作",width:"260",fixed:"right"},{default:a(({row:e})=>[t(d,{size:"small",onClick:r=>y("test",e)},{default:a(()=>[...n[8]||(n[8]=[u("测试",-1)])]),_:1},8,["onClick"]),e.enabled?(p(),E(d,{key:0,size:"small",onClick:r=>y("disable",e)},{default:a(()=>[...n[9]||(n[9]=[u("停用",-1)])]),_:1},8,["onClick"])):(p(),E(d,{key:1,size:"small",type:"primary",onClick:r=>y("enable",e)},{default:a(()=>[...n[10]||(n[10]=[u("启用",-1)])]),_:1},8,["onClick"])),t(d,{size:"small",type:"warning",plain:"",onClick:r=>y("drain",e)},{default:a(()=>[...n[11]||(n[11]=[u("维护",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])]),_:1}),t(C,{label:"GPU",name:"gpus"},{default:a(()=>[t(w,{data:v.value,height:"100%"},{default:a(()=>[t(s,{label:"GPU","min-width":"220"},{default:a(({row:e})=>[i("strong",null,o(e.node_code)+" / GPU "+o(e.id),1),i("div",Le,o(e.name),1)]),_:1}),t(s,{label:"状态",width:"100"},{default:a(({row:e})=>[t(g,{type:Q(e.status)},{default:a(()=>[u(o(e.status),1)]),_:2},1032,["type"])]),_:1}),t(s,{label:"利用率","min-width":"180"},{default:a(({row:e})=>[t(q,{percentage:e.gpu_percent,"stroke-width":8},null,8,["percentage"])]),_:1}),t(s,{label:"显存","min-width":"190"},{default:a(({row:e})=>[t(q,{percentage:Math.round(e.memory_percent),"stroke-width":8},null,8,["percentage"]),i("span",ze,o(e.memory_used_gb)+" / "+o(e.memory_total_gb)+" GB",1)]),_:1}),t(s,{label:"温度/功耗",width:"150"},{default:a(({row:e})=>[u(o(e.temperature)+" C / "+o(e.power_w)+" W",1)]),_:1}),t(s,{label:"进程","min-width":"220"},{default:a(({row:e})=>{var r;return[(r=e.processes)!=null&&r.length?I("",!0):(p(),_("span",Re,"空闲")),(p(!0),_(B,null,D(e.processes,x=>(p(),_("div",{key:x.pid},[u(o(x.task_name)+" ",1),i("span",je,"PID "+o(x.pid),1)]))),128))]}),_:1})]),_:1},8,["data"])]),_:1}),t(C,{label:"队列",name:"queue"},{default:a(()=>[t(w,{data:P.value,height:"100%"},{default:a(()=>[t(s,{prop:"name",label:"任务名称","min-width":"200"}),t(s,{label:"状态",width:"110"},{default:a(({row:e})=>[t(g,{type:O(e.status)},{default:a(()=>[u(o(e.status),1)]),_:2},1032,["type"])]),_:1}),t(s,{label:"进度","min-width":"220"},{default:a(({row:e})=>[t(q,{percentage:e.progress,"stroke-width":8},null,8,["percentage"])]),_:1}),t(s,{prop:"compute_node_id",label:"节点",width:"140"}),t(s,{label:"GPU",width:"120"},{default:a(({row:e})=>{var r;return[u(o(((r=e.gpus)==null?void 0:r.join(", "))||"-"),1)]}),_:1}),t(s,{prop:"create_time",label:"创建时间",width:"190"})]),_:1},8,["data"])]),_:1}),t(C,{label:"资源副本",name:"replicas"},{default:a(()=>[i("div",Me,[t(X,{modelValue:b.value,"onUpdate:modelValue":n[0]||(n[0]=e=>b.value=e),filterable:"",onChange:R},{default:a(()=>[(p(!0),_(B,null,D(f.value,e=>(p(),E(H,{key:e.id,label:`${e.code} - ${e.name}`,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),z.value?(p(),_("span",Fe,"当前节点 "+o(z.value.api_base_url),1)):I("",!0)]),t(w,{data:S.value,height:"100%"},{default:a(()=>[t(s,{prop:"resource_type",label:"资源类型",width:"110"}),t(s,{prop:"resource_id",label:"资源 ID","min-width":"180"}),t(s,{prop:"local_path",label:"本地路径","min-width":"300"}),t(s,{prop:"status",label:"状态",width:"110"}),t(s,{prop:"sync_status",label:"同步状态",width:"120"}),t(s,{prop:"create_time",label:"创建时间",width:"190"})]),_:1},8,["data"])]),_:1})]),_:1},8,["modelValue"])])),[[Z,V.value]])}}}),yt=ve(Ae,[["__scopeId","data-v-daf09639"]]);export{yt as default};