feat(k8s): Deployment 存储挂载改 Kuboard 一卷一卡布局
每张数据卷同屏展示卷定义与容器挂载(容器/只读读写/路径/subPath)。
This commit is contained in:
1 parent
a8305de0f5
commit
025e74ff4d
98 files changed
+386
-345
No files matched your search
@@ -0,0 +1,14 @@
|
||||
import{r as u,y as le,E as G,j as e,R as J,o as K}from"./vendor-codemirror-C7mXSpXt.js";import{a8 as re,B as j,D as de,a as me,m as H,c as ue,d as xe}from"./index-LZWfu62c.js";import{u as ae}from"./use-toast-CkA38LVP.js";import{k as D}from"./index-Z0O8nAcG.js";import{w as q,aF as X,ay as L,L as _,$ as Z,X as O,r as he,ad as pe,aK as fe,an as be,ao as we,H as ke,m as ge,f as je,ah as ve,R as Ne,aL as Pe,aM as ye,v as Se}from"./vendor-icons-Aso0-eeY.js";import{S as Q,a as ee,b as te,c as se,d as ne}from"./select-4xU_9B3_.js";import{x as Ee,a as Fe}from"./vendor-xterm-20M9KZE1.js";import{B as Be}from"./badge-B0F5ZNtn.js";function oe(r){if(!r)return"";const s=r.replace(/\r\n/g,`
|
||||
`).split(`
|
||||
`),o=[];let n=0;const g=new Set(["uid","resourceVersion","creationTimestamp","generation","selfLink","clusterName","generateName"]),A=new Set(["managedFields","ownerReferences"]),R={dnsPolicy:["ClusterFirst"],restartPolicy:["Always"],schedulerName:["default-scheduler"],terminationGracePeriodSeconds:["30"],serviceAccountName:["default"],enableServiceLinks:["true"],progressDeadlineSeconds:["600"],revisionHistoryLimit:["10"]},E={imagePullPolicy:["Always","IfNotPresent"],terminationMessagePath:["/dev/termination-log"],terminationMessagePolicy:["File"]},M=new Set(["kubectl.kubernetes.io/last-applied-configuration","deployment.kubernetes.io/revision","kubectl.kubernetes.io/restartedAt","control-plane.alpha.kubernetes.io/leader","autoscaling.alpha.kubernetes.io/conditions"]),h=["kube-api-access-","default-token-","kube-"];let b=!1,S=!1,F=!1,Y=!1,w=!1,B=!1,v=!1,T=!1,N=0;function f(x){return x.length-x.trimStart().length}function P(x){const a=x.trimStart().match(/^([a-zA-Z_][a-zA-Z0-9_./-]*)\s*:/);return a?a[1]:null}function V(x){const a=x.trim().split(":").slice(1).join(":").trim();return a!==""&&!/^[>|]/.test(a)}function C(x){for(n++;n<s.length;){const a=s[n],i=a.trimStart();if(i===""||i.startsWith("#")){n++;continue}if(f(a)<=x)break;n++}}function k(x){const a=P(x);return a?h.some(i=>a.startsWith(i)):!1}for(;n<s.length;){const x=s[n],a=x.trimStart(),i=f(x),c=P(x);if(a===""||a.startsWith("#")){o.push(x),n++;continue}if(i===0&&c==="status"){C(0);continue}if(i===0&&c==="metadata"){b=!0,o.push(x),n++;continue}if(i===0&&c!=="metadata"&&(b=!1,S=!1),i===0&&c==="spec"){F=!0,o.push(x),n++;continue}if(i===0&&c!=="spec"&&(F=!1,Y=!1,w=!1,B=!1,T=!1),b){if(i===2&&c==="annotations"){S=!0,o.push(x),n++;continue}if(i<=2&&c!=="annotations"&&(S=!1),i>=2&&i<=4&&a.startsWith("pod-template-hash")&&a.includes(":")){n++;continue}if(i===2&&c&&g.has(c)){V(x)?n++:C(2);continue}if(i===2&&c&&A.has(c)){for(n++;n<s.length;){const l=s[n],t=l.trimStart();if(t===""||t.startsWith("#")){n++;continue}const d=f(l);if(d>2||d===2&&t.startsWith("-")){n++;continue}break}continue}if(S&&i>2&&c&&M.has(c)){if(V(x))n++;else{const l=a.split(":").slice(1).join(":").trim();/^[>|]/.test(l)?C(i):n++}continue}}if(F){if(i===2&&c==="template"){o.push(x),n++;continue}if(i===2&&c&&R[c]){const p=a.split(":").slice(1).join(":").trim();if(R[c].includes(p)){n++;continue}}if(i===2&&c==="nodeName"){n++;continue}if(i===2&&c==="spec"){Y=!0,N=i,o.push(x),n++;continue}}if(Y&&i>N){if(c==="containers"){w=!0,B=!1,o.push(x),n++;continue}if(c==="initContainers"){B=!0,w=!1,o.push(x),n++;continue}if(c==="volumes"){T=!0,o.push(x),n++;continue}if(c&&R[c]){const p=a.split(":").slice(1).join(":").trim();if(R[c].includes(p)){n++;continue}}if(c==="nodeName"){n++;continue}if(c==="serviceAccount"&&a.endsWith(":")){V(x)?n++:C(i);continue}}if((w||B)&&i>=6){if(c&&E[c]){const p=a.split(":").slice(1).join(":").trim();if(E[c].includes(p)){n++;continue}}if(c==="volumeMounts"&&(v=!0),v&&a.startsWith("- name:")){let p=[x],l=n+1,t=!1;for(;l<s.length;){const d=s[l].trimStart();if(d===""||d.startsWith("#")){p.push(s[l]),l++;continue}if(f(s[l])<=i)break;Te(d)&&(t=!0),p.push(s[l]),l++}if(t){n=l;continue}v=!1}}if(T&&i>=4&&a.startsWith("- name:")&&k(a)){const p=i;for(n++;n<s.length;){const l=s[n],t=l.trimStart();if(t===""||t.startsWith("#")){n++;continue}if(f(l)<=p)break;n++}continue}if(a===""&&o.length>0&&o[o.length-1].trim()===""){n++;continue}o.push(x),n++}return o.join(`
|
||||
`).replace(/\n{3,}/g,`
|
||||
|
||||
`).trimEnd()+`
|
||||
`}function Te(r){return r.includes("mountPath:")&&(r.includes("/var/run/secrets/kubernetes.io")||r.includes("/var/run/secrets/sa"))}const I={green:"#10b981",orange:"#f59e0b",red:"#ef4444",blue:"#326CE5"};function Ie(r){if(!r)return"#64748b";const s=r.toLowerCase();return["running","available","ready","active","completed","succeeded"].includes(s)?I.green:["pending","updating","progressing","containercreating"].includes(s)?I.orange:["failed","error","crashloopbackoff","imagepullbackoff","errimageneverpull"].includes(s)?I.red:I.blue}function Oe(r){if(!r)return"-";const s=new Date(r);if(isNaN(s.getTime()))return r;const o=n=>String(n).padStart(2,"0");return`${s.getFullYear()}-${o(s.getMonth()+1)}-${o(s.getDate())} ${o(s.getHours())}:${o(s.getMinutes())}:${o(s.getSeconds())}`}function We(r,s){if(!r||!s)return null;const o=new Date(r).getTime(),n=new Date(s).getTime();return isNaN(o)||isNaN(n)||n<o?null:Math.max(0,Math.round((n-o)/1e3))}function Ue(r){if(r==null)return"-";if(r<60)return`${r}s`;if(r<3600)return`${Math.floor(r/60)}m${r%60}s`;const s=Math.floor(r/3600),o=Math.floor(r%3600/60);return`${s}h${o}m`}const Ce=new Set(["kubectl.kubernetes.io/last-applied-configuration","deployment.kubernetes.io/revision","kubectl.kubernetes.io/restartedAt"]);function W(r){const s=JSON.parse(JSON.stringify(r));if(delete s.status,s.metadata){if(delete s.metadata.managedFields,delete s.metadata.resourceVersion,delete s.metadata.uid,delete s.metadata.creationTimestamp,delete s.metadata.generation,delete s.metadata.selfLink,s.metadata.annotations){for(const o of Object.keys(s.metadata.annotations))Ce.has(o)&&delete s.metadata.annotations[o];Object.keys(s.metadata.annotations).length===0&&delete s.metadata.annotations}s.metadata.labels&&(delete s.metadata.labels["pod-template-hash"],Object.keys(s.metadata.labels).length===0&&delete s.metadata.labels)}return s}async function ce(r){if(!r?.trim())return null;try{return JSON.parse(r)}catch{}try{const o=(await re(()=>import("./js-yaml-37NdyH6G.js"),[])).load(r);return o&&typeof o=="object"?o:null}catch{return null}}async function U(r){return(await re(()=>import("./js-yaml-37NdyH6G.js"),[])).dump(r,{lineWidth:120,noRefs:!0})}async function ie(r){const s=await ce(r);if(!s)return{manifest:null,yaml:r};const o=W(s);return{manifest:o,yaml:await U(o)}}async function Ye(r){const s=await U(W(r));return oe(s)}const Ge=Object.freeze(Object.defineProperty({__proto__:null,dumpManifest:U,parseEditableManifest:ie,parseManifest:ce,prepareManifestForSave:Ye,stripRuntimeFields:W},Symbol.toStringTag,{value:"Module"}));function Je({clusterCode:r,namespace:s,resource:o,name:n,onClose:g,onSaved:A,cleanBeforeEdit:R=!1,autoEdit:E=!1,inline:M=!1,initialYaml:h}){const{toast:b}=ae(),[S,F]=u.useState(h||""),[Y,w]=u.useState(""),[B,v]=u.useState(!h),[T,N]=u.useState(!1),[f,P]=u.useState(E),[V,C]=u.useState(!1),k=R||E,z=async m=>{if(!k)return m;const{yaml:$}=await ie(m);return $},x=async()=>{if(h){F(h),w(await z(h)),v(!1);return}v(!0);try{const m=await D.getResourceYaml(r,s,o,n);F(m),w(await z(m))}catch(m){b({title:"获取YAML失败",description:m.message,variant:"destructive"});const $=`# Error: ${m.message}`;F($),w($)}finally{v(!1)}},a=async()=>{w(await z(S)),P(!0),k&&b({title:"已清理只读字段",description:"已剥离 status / managedFields / uid 等"})},[i,c]=u.useState(!1),p=async()=>{N(!0);try{await D.updateResourceYaml(r,s,o,n,Y),b({title:"YAML已应用",description:`${o}/${n} 更新成功`}),P(!1),F(Y),A?.()}catch(m){b({title:"保存失败",description:m.message,variant:"destructive"})}finally{N(!1)}},l=async()=>{const m=f?Y:S;await navigator.clipboard.writeText(m),C(!0),setTimeout(()=>C(!1),2e3)};u.useEffect(()=>{x()},[]);const t=f?Y:k&&!i?oe(S):S,d=u.useMemo(()=>[le(),G.lineWrapping,...f?[]:[G.editable.of(!1)]],[f]);return M?e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:119:7",className:"space-y-3",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:120:9",className:"flex items-center justify-between",children:[e.jsxs("p",{"code-path":"src/components/kubernetes/YamlViewer.tsx:121:11",className:"text-xs text-slate-500",children:[e.jsxs("code",{"code-path":"src/components/kubernetes/YamlViewer.tsx:122:13",className:"text-slate-400",children:[o,"/",n]})," · ",s," · ",r]}),e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:124:11",className:"flex items-center gap-2",children:[e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:125:13",variant:"outline",size:"sm",className:"h-7 border-slate-700 text-slate-300 text-xs",onClick:l,children:[V?e.jsx(q,{"code-path":"src/components/kubernetes/YamlViewer.tsx:126:25",className:"h-3 w-3 mr-1 text-emerald-400"}):e.jsx(X,{"code-path":"src/components/kubernetes/YamlViewer.tsx:126:79",className:"h-3 w-3 mr-1"}),V?"已复制":"复制"]}),k&&!f&&e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:130:15",variant:"outline",size:"sm",className:`h-7 text-xs ${i?"border-slate-700 tLine truncated
|
||||
\x1B[33m⚠ bash 不可用,请切换 /bin/sh 后重连。\x1B[0m`),Y.current=!0;return}a.write(t.includes("\x1B")?t:`\r
|
||||
\x1B[31m${t}\x1B[0m\r
|
||||
`)}}catch{typeof p.data=="string"&&a.write(p.data)}},c.onclose=p=>{B(l=>l==="error"?l:"closed"),Y.current||a.write(`\r
|
||||
\x1B[33m[连接已关闭]\x1B[0m\r
|
||||
`)},c.onerror=p=>{console.error("[PodExec:connect] WS error event fired, readyState=",c.readyState,"type=",p.type),B("error"),a.write(`\r
|
||||
\x1B[31m[连接发生错误]\x1B[0m\r
|
||||
`)}},[o,n,g,N,P]);u.useEffect(()=>{if(!r)return;if(!o){console.error("[PodExec:initEffect] ABORT: clusterId is falsy:",o);return}if(!g){console.error("[PodExec:initEffect] ABORT: podName is falsy:",g);return}let a=!1,i=0;const c=performance.now(),p=()=>{if(a)return;const l=M.current;if(!l){i++,i<20?requestAnimationFrame(p):console.error("[PodExec:tryInit] FAILED: containerRef still null after 20 retries (",Math.round(performance.now()-c),"ms)");return}const t=new Ee.Terminal({cursorBlink:!0,fontSize:14,fontFamily:'Menlo, Monaco, "Courier New", monospace',allowProposedApi:!0,scrollback:5e3,theme:{background:"#0f172a",foreground:"#e2e8f0",cursor:"#38bdf8",selectionBackground:"#1e40af",black:"#1e293b",red:"#ef4444",green:"#10b981",yellow:"#f59e0b",blue:"#3b82f6",magenta:"#a855f7",cyan:"#06b6d4",white:"#e2e8f0",brightBlack:"#475569",brightRed:"#f87171",brightGreen:"#34d399",brightYellow:"#fbbf24",brightBlue:"#60a5fa",brightMagenta:"#c084fc",brightCyan:"#22d3ee",brightWhite:"#f8fafc"}}),d=new Fe.FitAddon;t.loadAddon(d),h.current=t,S.current=d,t.onData(m=>{b.current&&b.current.readyState===WebSocket.OPEN?b.current.send(JSON.stringify({status:0,data:m})):console.warn("[PodExec:term] TX dropped — WS not open, readyState=",b.current?.readyState)}),t.open(l),requestAnimationFrame(()=>{try{d.fit()}catch{}}),F.current=!0,C()};return requestAnimationFrame(p),()=>{a=!0}},[r,o,g]),u.useEffect(()=>{if(!r){try{b.current?.close()}catch{}try{h.current?.dispose()}catch{}h.current=null,b.current=null,S.current=null,F.current=!1,B("idle")}},[r]),u.useEffect(()=>{r&&h.current&&F.current&&C()},[N,P]),u.useEffect(()=>{if(!r)return;const a=M.current;if(!a)return;let i;const c=new ResizeObserver(()=>{clearTimeout(i),i=setTimeout(()=>{if(S.current&&h.current)try{S.current.fit(),h.current.focus();const{cols:p,rows:l}=h.current;b.current?.readyState===WebSocket.OPEN&&b.current.send(JSON.stringify({status:1,cols:p,rows:l}))}catch{}},60)});return c.observe(a),()=>{clearTimeout(i),c.disconnect()}},[r,v]);const k=w==="connected"?"bg-emerald-400":w==="error"?"bg-red-400":w==="closed"?"bg-slate-500":"bg-amber-400",z=w==="connected"?"已连接":w==="connecting"?"连接中":w==="error"?"连接错误":w==="closed"?"已断开":"空闲",x=u.useCallback(()=>{try{h.current?.focus()}catch{}},[]);return e.jsx(de,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:279:5",open:r,onOpenChange:s,children:e.jsxs(me,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:280:7",showCloseButton:!1,className:H("bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] p-0 gap-0","!duration-0 !transition-none",v?"!max-w-none !w-screen !h-screen !rounded-none !translate-x-0 !translate-y-0 !left-0 !top-0":""),style:v?{maxWidth:"100vw",width:"100vw",height:"100vh"}:{maxWidth:"960px",width:"92vw"},children:[e.jsxs(ue,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:289:9",className:"sr-only",children:["exec — ",g]}),e.jsx(xe,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:290:9",className:"sr-only",children:"进入 Pod 容器执行命令"}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:293:9",className:"flex items-center justify-between gap-2 px-4 py-2 border-b border-[var(--dg-border)] flex-wrap",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:294:11",className:"flex items-center gap-2 text-sm min-w-0",children:[e.jsx("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:295:13",className:H("w-2 h-2 rounded-full shrink-0",k),title:z}),e.jsx(he,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:296:13",className:"h-4 w-4 text-blue-400 shrink-0"}),e.jsxs("span",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:297:13",className:"text-[var(--dg-text-primary)] font-medium truncate",children:["exec — ",g]}),w==="connecting"&&e.jsx(_,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:298:44",className:"h-3 w-3 animate-spin text-[var(--dg-text-muted)]"}),e.jsx("span",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:299:13",className:"text-xs text-[var(--dg-text-muted)]",children:z})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:301:11",className:"flex items-center gap-2",children:[A.length>0&&e.jsxs(Q,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:303:15",value:N,onValueChange:f,children:[e.jsxs(ee,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:304:17",className:"h-8 w-[150px] text-xs bg-[var(--dg-bg-hover)] border-[var(--dg-border)]",children:[e.jsx(pe,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:305:19",className:"h-3 w-3 mr-1 text-[var(--dg-text-muted)]"}),e.jsx(te,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:306:19",placeholder:"容器"})]}),e.jsx(se,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:308:17",children:A.map(a=>e.jsx(ne,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:308:55",value:a,children:a},a))
Line truncated
|
||||
Reference in new issue
Block a user