/
snap
/
lxd
/
35210
/
share
/
lxd-ui
/
assets
/
File Upload :
llllll
Current File: //snap/lxd/35210/share/lxd-ui/assets/NetworkDetail-B3o6UQFD.js
import{aY as o,u as te,af as Y,c as K,d as n,M as se,V as C,r as N,l as A,k as ne,aZ as ae,f as H,g as E,Z as oe,Y as V,i as Q,q as b,j as t,R as I,x as re,t as ie,m as $,o as G,L as D,n as O,D as z,_ as ce,z as Z,B as le,e as de,a_ as me}from"./index-dL2n30-Z.js";import{u as ue,b as pe,d as fe,r as ge}from"./networks-DWdMsnuF.js";import{t as he,N as ye,i as be}from"./NetworkForm-BDFSR-5t.js";import{y as _e,o as xe,c as ve}from"./YamlSwitch-BRMLXARm.js";import{C as Ne,G as U,Y as S}from"./NetworkFormMenu-BKrf9oEV.js";import{F as je}from"./FormFooterLayout-Bmq4RXkd.js";import{F as Ce}from"./FormSubmitBtn-D3jUuO6-.js";import{s as we}from"./scroll-Dmr9Jl9h.js";import{a as Re,u as Ie}from"./useNetworks-FA5tQKQK.js";import{R as Le}from"./RenameHeader-BZc6vaTG.js";import{T as Se}from"./TabLinks-BqmE_r1L.js";import{d as $e,a as Fe}from"./network-forwards-CHHjBfGf.js";import{E as Te}from"./ExpandableList-Cjp4v1_P.js";import{S as W}from"./ScrollableTable-CQDmfMtz.js";import"./FormMenuItem-DRePjRCl.js";import"./limits-CLEFMbq-.js";import"./AutoExpandingTextArea-CQuEMXHF.js";import"./instanceOptions-D4bz_1Ev.js";import"./ConfigFieldDescription-B5-bOr1x.js";import"./snapshots-AS6hXv2C.js";import"./ClusterSpecificSelect-w4WndyK2.js";import"./ClusterSpecificInput-OscQ5yiR.js";import"./UsedByItem-Ber64JUd.js";import"./useNetworkAcls-ySbcb7T6.js";import"./network-acls-DIVFiLIx.js";import"./YamlNotification-BqA1Vb41.js";import"./ScrollableContainer-ceiHesUW.js";import"./debounce-DuKxa5-z.js";const k=(e,s,a)=>{var d;const r={};s==null||s.forEach(c=>r[c.memberName]=c.config.parent??"");const u={};s==null||s.forEach(c=>u[c.memberName]=c.config[o("bridge_external_interfaces")]??"");const i=Object.values(u).find(c=>c.length>0);return{readOnly:!0,isCreating:!1,name:e.name,description:e.description,networkType:e.type,bridge_driver:e.config[o("bridge_driver")],bridge_external_interfaces:i?"set":e.config[o("bridge_external_interfaces")],bridge_external_interfaces_per_member:u,bridge_hwaddr:e.config[o("bridge_hwaddr")],bridge_mtu:e.config[o("bridge_mtu")],dns_domain:e.config[o("dns_domain")],dns_mode:e.config[o("dns_mode")],dns_nameservers:e.config[o("dns_nameservers")],dns_search:e.config[o("dns_search")],gvrp:e.config.gvrp,ipv4_address:e.config[o("ipv4_address")],ipv4_dhcp:e.config[o("ipv4_dhcp")],ipv4_dhcp_expiry:e.config[o("ipv4_dhcp_expiry")],ipv4_dhcp_ranges:e.config[o("ipv4_dhcp_ranges")],ipv4_l3only:e.config[o("ipv4_l3only")],ipv4_nat:e.config[o("ipv4_nat")],ipv4_nat_address:e.config[o("ipv4_nat_address")],ipv4_ovn_ranges:e.config[o("ipv4_ovn_ranges")],ipv4_gateway:e.config[o("ipv4_gateway")],ipv4_routes:e.config[o("ipv4_routes")],ipv4_routes_anycast:e.config[o("ipv4_routes_anycast")],ipv6_address:e.config[o("ipv6_address")],ipv6_dhcp:e.config[o("ipv6_dhcp")],ipv6_dhcp_expiry:e.config[o("ipv6_dhcp_expiry")],ipv6_dhcp_ranges:e.config[o("ipv6_dhcp_ranges")],ipv6_dhcp_stateful:e.config[o("ipv6_dhcp_stateful")],ipv6_l3only:e.config[o("ipv6_l3only")],ipv6_nat:e.config[o("ipv6_nat")],ipv6_nat_address:e.config[o("ipv6_nat_address")],ipv6_ovn_ranges:e.config[o("ipv6_ovn_ranges")],ipv6_gateway:e.config[o("ipv6_gateway")],ipv6_routes:e.config[o("ipv6_routes")],ipv6_routes_anycast:e.config[o("ipv6_routes_anycast")],mtu:e.config.mtu,ovn_ingress_mode:e.config[o("ovn_ingress_mode")],network:e.config.network,parent:e.config.parent,security_acls:((d=e.config["security.acls"])==null?void 0:d.split(","))??[],vlan:e.config.vlan,parentPerClusterMember:r,entityType:"network",bareNetwork:e,editRestriction:a}},L=()=>{const{isFineGrained:e}=te();return{canDeleteNetwork:r=>Y(e,"can_delete",r==null?void 0:r.access_entitlements),canEditNetwork:r=>Y(e,"can_edit",r==null?void 0:r.access_entitlements)}},Ue=({network:e,project:s})=>{const a=K(),r=n.useNotify(),u=n.useToastNotification(),{hash:i}=se(),d=i?i.substring(1):C(Ne),[c,f]=N.useState(d),g=A(),p=N.useState(null),[m,_]=N.useState(0),{data:l=[]}=ne(),{canEditNetwork:x}=L(),y=e.managed&&ae.includes(e.type),{data:j=[],error:F}=Re(e.name,s,y);N.useEffect(()=>{F&&r.failure("Loading network from cluster members failed",F)},[F]);const J=H().shape({name:E().test("deduplicate","A network with this name already exists",async h=>h===e.name||V(h,s,p,"networks")).required("Network name is required"),network:E().test("required","Uplink network is required",(h,w)=>w.parent.networkType!==oe||!!h)}),X=x(e)?void 0:"You do not have permission to edit this network",v=Q({initialValues:k(e,j,X),validationSchema:J,enableReinitialize:!0,onSubmit:h=>{const w=h.yaml?h.yaml:M(),B=_e(w),P={...B,etag:e.etag};(async R=>R.parentPerClusterMember&&Object.keys(R.parentPerClusterMember).length>0?ue(P,s,l,R.parentPerClusterMember,R.bridge_external_interfaces_per_member):pe(P,s))(h).then(()=>{v.resetForm({values:k(B,j)}),g.invalidateQueries({queryKey:[b.projects,s,b.networks,e.name]}),g.invalidateQueries({queryKey:[b.projects,s,b.networks,e.name,b.cluster]}),u.success(t.jsxs(t.Fragment,{children:["Network","",t.jsx(I,{type:"network",value:e.name,to:`/ui/project/${encodeURIComponent(s)}/network/${encodeURIComponent(e.name)}`})," ","updated."]}))}).catch(R=>{r.failure("Network update failed",R)}).finally(()=>{v.setSubmitting(!1)})}}),M=()=>{const h=he(v.values);return xe(h)};N.useEffect(()=>{we(d),f(d)},[d]);const T=`/ui/project/${encodeURIComponent(s)}/network/${encodeURIComponent(e.name)}`,q=(h,w)=>{w==="scroll"&&c===C(S)||(w==="click"&&a(h===U?T:`${T}/#${C(h)}`),f(C(h)))},ee=v.values.readOnly;return t.jsxs(t.Fragment,{children:[t.jsx(ye,{formik:v,getYaml:M,project:s,section:c??C(U),setSection:q,version:m},e.name),t.jsxs(je,{children:[t.jsx(ve,{formik:v,section:c,setSection:()=>{q(c===C(S)?U:S,"click")},disableReason:v.values.name?void 0:"Please enter a network name to enable this section"}),ee?null:t.jsxs(t.Fragment,{children:[t.jsx(n.Button,{appearance:"base",onClick:()=>{_(h=>h+1),v.setValues(k(e,j))},children:"Cancel"}),t.jsx(Ce,{formik:v,baseUrl:T,isYaml:c===C(S),disabled:be(v,l)})]})]})]})},ke=({network:e,project:s})=>{var x;const a=n.useNotify(),r=n.useToastNotification(),u=A(),[i,d]=N.useState(!1),c=K(),f=re(),{canDeleteNetwork:g}=L(),p=()=>{d(!0),fe(e.name,s).then(()=>{u.invalidateQueries({predicate:y=>y.queryKey[0]===b.projects&&y.queryKey[1]===s&&y.queryKey[2]===b.networks}),c(`/ui/project/${encodeURIComponent(s)}/networks`),r.success(t.jsxs(t.Fragment,{children:["Network ",t.jsx($,{bold:!0,type:"network",value:e.name})," ","deleted."]}))}).catch(y=>{d(!1),a.failure("Network deletion failed",y)})},m=(((x=e.used_by)==null?void 0:x.length)??0)>0,_=e.managed,l=()=>g(e)?_?m?"Can not delete, network is currently in use":"":"Can not delete, network is not managed":"You do not have permission to delete this network";return t.jsxs(n.ConfirmationButton,{onHoverText:l(),confirmationModalProps:{title:"Confirm delete",confirmButtonAppearance:"negative",confirmButtonLabel:"Delete",children:t.jsxs("p",{children:["Are you sure you want to delete the network"," ",t.jsx($,{type:"network",value:e.name,bold:!0}),"?",t.jsx("br",{}),"This action cannot be undone, and can result in data loss."]}),onConfirm:p},className:ie("u-no-margin--bottom",{"has-icon":!f}),loading:i,disabled:!g(e)||m||!_||i,shiftClickEnabled:!0,showShiftClickHint:!0,children:[!f&&t.jsx(n.Icon,{name:"delete"}),t.jsx("span",{children:"Delete network"})]})},Ee=({name:e,network:s,project:a})=>{var x;const{member:r}=G(),u=K(),i=n.useNotify(),d=n.useToastNotification(),c=N.useState(null),{canEditNetwork:f}=L(),g=H().shape({name:E().test("deduplicate","A network with this name already exists",async y=>(s==null?void 0:s.name)===y||V(y,a,c,"networks")).required("Network name is required")}),p=Q({initialValues:{name:e,isRenaming:!1},validationSchema:g,onSubmit:y=>{if(e===y.name){p.setFieldValue("isRenaming",!1),p.setSubmitting(!1);return}ge(e,y.name,a).then(()=>{const j=`/ui/project/${encodeURIComponent(a)}/network/${encodeURIComponent(y.name)}`;u(j),d.success(t.jsxs(t.Fragment,{children:["Network ",t.jsx("strong",{children:e})," renamed to"," ",t.jsx(I,{type:"network",value:y.name,to:j}),"."]})),p.setFieldValue("isRenaming",!1)}).catch(j=>{i.failure("Renaming failed",j)}).finally(()=>{p.setSubmitting(!1)})}}),m=(((x=s==null?void 0:s.used_by)==null?void 0:x.length)??0)>0,_=s==null?void 0:s.managed,l=()=>{if(!f(s))return"You do not have permission to rename this network";if(!_)return"Can not rename, network is not managed";if(m)return"Can not rename, network is currently in use."};return t.jsx(Le,{name:e,relatedChip:r&&t.jsx(I,{type:"cluster-member",value:r,to:`/ui/project/${encodeURIComponent(a)}/networks?member=${encodeURIComponent(r)}`}),parentItems:[t.jsx(D,{to:`/ui/project/${encodeURIComponent(a)}/networks`,children:"Networks"},1)],renameDisabledReason:l(),controls:s&&t.jsx(ke,{network:s,project:a}),isLoaded:!!s,formik:p})},De=({network:e,forward:s,project:a})=>{const r=n.useNotify(),u=n.useToastNotification(),i=A(),[d,c]=N.useState(!1),{canEditNetwork:f}=L(),g=()=>{c(!0),$e(e,s,a).then(()=>{u.success(t.jsxs(t.Fragment,{children:["Network forward with listen address"," ",t.jsx($,{type:"network-forward",value:s.listen_address,bold:!0})," ","deleted."]})),i.invalidateQueries({predicate:p=>p.queryKey[0]===b.projects&&p.queryKey[1]===a&&p.queryKey[2]===b.networks&&p.queryKey[3]===e.name})}).catch(p=>{c(!1),r.failure("Network forward deletion failed",p)})};return t.jsx(n.ConfirmationButton,{appearance:"base",onHoverText:f(e)?"Delete network forward":"You do not have permission to delete this network forward",confirmationModalProps:{title:"Confirm delete",confirmButtonAppearance:"negative",confirmButtonLabel:"Delete",children:t.jsxs("p",{children:["Are you sure you want to delete the network forward with listen address"," ",t.jsx($,{type:"network-forward",value:s.listen_address,bold:!0}),"?",t.jsx("br",{})]}),onConfirm:g},className:"u-no-margin--bottom has-icon",loading:d,shiftClickEnabled:!0,showShiftClickHint:!0,disabled:!f(e)||d,children:t.jsx(n.Icon,{name:"delete"})})},Ke=({port:e})=>{const s=e.target_port&&e.target_port.length>0?e.target_port:e.listen_port,r=`:${e.listen_port} → ${e.target_address}:${s} (${e.protocol})`;return t.jsx("div",{className:"u-truncate",title:r,children:r})},Ae=({network:e,project:s})=>{const a=O(),r=n.useNotify(),{canEditNetwork:u}=L(),d=z()&&(e==null?void 0:e.type)===ce,{data:c=[],error:f,isLoading:g}=Z({queryKey:[b.projects,s,b.networks,e.name,b.forwards],queryFn:async()=>Fe(e.name,s)});f&&r.failure("Loading network forwards failed",f);const p=c.length>0,m=[{content:"Listen address",sortKey:"listenAddress"},{content:"Description",sortKey:"description"},{content:"Default target address",sortKey:"defaultTarget"},{content:"Ports"},...d?[{content:"Location",sortKey:"location"}]:[],{"aria-label":"Actions",className:"u-align--right actions"}],_=c.map(l=>({key:l.listen_address,columns:[{content:l.listen_address,role:"rowheader","aria-label":"Listen address"},{content:l.description,role:"cell","aria-label":"Description"},{content:l.config.target_address,role:"cell","aria-label":"Default target address"},{content:t.jsx(Te,{items:l.ports.map(x=>t.jsx(Ke,{port:x},x.listen_port))}),role:"cell","aria-label":"Forwarded ports"},...d?[{content:t.jsx(I,{type:"cluster-member",value:l.location??"",to:`/ui/cluster/member/${encodeURIComponent(l.location??"")}`}),role:"cell"}]:[],{content:t.jsxs(t.Fragment,{children:[u(e)&&t.jsx(D,{className:"p-button--base u-no-margin--bottom has-icon",to:d?`/ui/project/${encodeURIComponent(s)}/network/${encodeURIComponent(e.name)}/member/${encodeURIComponent(l.location??"")}/forwards/${encodeURIComponent(l.listen_address)}/edit`:`/ui/project/${encodeURIComponent(s)}/network/${encodeURIComponent(e.name)}/forwards/${encodeURIComponent(l.listen_address)}/edit`,title:"Edit network forward",children:t.jsx(n.Icon,{name:"edit"})}),!u(e)&&t.jsx(n.Button,{appearance:"base",className:"u-no-margin--bottom",dense:!0,hasIcon:!0,type:"button",title:"You do not have permission to edit forwards for this network",disabled:!0,children:t.jsx(n.Icon,{name:"edit"})},"edit"),t.jsx(De,{network:e,forward:l,project:s},l.listen_address+l.location)]}),role:"cell",className:"u-align--right actions","aria-label":"Actions"}],sortData:{listenAddress:l.listen_address,description:l.description,defaultTarget:l.config.target_address??"",location:l.location}}));return g?t.jsx(n.Spinner,{className:"u-loader",text:"Loading...",isMainComponent:!0}):t.jsxs(t.Fragment,{children:[u(e)&&t.jsx(D,{className:"p-button--positive u-no-margin--bottom u-float-right",to:`/ui/project/${encodeURIComponent(s)}/network/${encodeURIComponent(e.name)}/forwards/create`,children:"Create forward"}),!u(e)&&t.jsx(n.Button,{appearance:"positive",className:"u-float-right u-no-margin--bottom",disabled:!0,title:"You do not have permission to create network forwards for this network",children:t.jsx("span",{children:"Create forward"})}),t.jsxs(n.Row,{children:[p&&t.jsx(W,{dependencies:c,tableId:"network-forwards-table",belowIds:["status-bar"],children:t.jsx(n.MainTable,{id:"network-forwards-table",headers:m,expanding:!0,rows:_,paginate:30,sortable:!0,defaultSort:"listenAddress",defaultSortDirection:"ascending",className:"u-table-layout--auto network-forwards-table",emptyStateMsg:"No data to display"})}),!g&&!p&&t.jsxs(n.EmptyState,{className:"empty-state",image:t.jsx(n.Icon,{className:"empty-state-icon",name:"exposed"}),title:"No network forwards found",children:[t.jsx("p",{children:"There are no network forwards in this project."}),t.jsx("p",{children:t.jsxs("a",{href:`${a}/howto/network_forwards/`,target:"_blank",rel:"noopener noreferrer",children:["Learn more about network forwards",t.jsx(n.Icon,{className:"external-link-icon",name:"external-link"})]})})]})]})]})},Me=async(e,s)=>{const a=new URLSearchParams;return a.set("project",s),a.set("recursion","1"),fetch(`/1.0/networks/${encodeURIComponent(e)}/leases?${a.toString()}`).then(le).then(r=>r.metadata)},qe=({network:e,project:s})=>{const a=O(),r=n.useNotify(),u=z(),{data:i=[],error:d,isLoading:c}=Z({queryKey:[b.projects,s,b.networks,e.name,b.leases],queryFn:async()=>Me(e.name,s)});d&&r.failure("Loading network leases failed",d);const f=i.length>0,g=[{content:"Type",sortKey:"type"},{content:"Hostname",sortKey:"hostname"},{content:"IP Address",sortKey:"address"},{content:"Project",sortKey:"project"},...u?[{content:"Cluster member",sortKey:"clusterMember"}]:[],{content:"MAC address",sortKey:"macAddress"}],p=i.map(m=>{var _,l;return{key:m.address,columns:[{content:m.type,role:"cell","aria-label":"Type"},{content:m.hostname,role:"rowheader","aria-label":"Hostname"},{content:m.address,role:"cell","aria-label":"MAC address"},{content:m.project&&t.jsx(I,{type:"project",value:m.project,to:`/ui/project/${encodeURIComponent(m.project)}`}),role:"cell","aria-label":"project"},...u?[{content:m.location&&t.jsx(I,{type:"cluster-member",value:m.location,to:`/ui/cluster/member/${encodeURIComponent(m.location)}`}),role:"cell","aria-label":"Cluster member"}]:[],{content:m.hwaddr,role:"cell","aria-label":"Description"}],sortData:{hostname:m.hostname.toLowerCase(),macAddress:m.hwaddr,address:m.address,type:m.type,project:(_=m.project)==null?void 0:_.toLowerCase(),clusterMember:(l=m.location)==null?void 0:l.toLowerCase()}}});return c?t.jsx(n.Spinner,{className:"u-loader",text:"Loading...",isMainComponent:!0}):t.jsxs(n.Row,{children:[f&&t.jsx(W,{dependencies:i,tableId:"network-lease-table",belowIds:["status-bar"],children:t.jsx(n.MainTable,{id:"network-lease-table",headers:g,expanding:!0,rows:p,responsive:!0,sortable:!0,className:"u-table-layout--auto",emptyStateMsg:"No data to display"})}),!c&&!f&&t.jsxs(n.EmptyState,{className:"empty-state",image:t.jsx(n.Icon,{className:"empty-state-icon",name:"exposed"}),title:"No network leases found",children:[t.jsx("p",{children:"There are no network leases in this project."}),t.jsx("p",{children:t.jsxs("a",{href:`${a}/howto/network_ipam/#view-dhcp-leases-for-fully-controlled-networks`,target:"_blank",rel:"noopener noreferrer",children:["Learn more about network leases",t.jsx(n.Icon,{className:"external-link-icon",name:"external-link"})]})})]})]})},ht=()=>{const e=n.useNotify(),{name:s,project:a,member:r,activeTab:u}=G();if(!s)return t.jsx(t.Fragment,{children:"Missing name"});if(!a)return t.jsx(t.Fragment,{children:"Missing project"});const{data:i,error:d,isLoading:c}=Ie(s,a,r);if(N.useEffect(()=>{d&&e.failure("Loading network failed",d)},[d]),c)return t.jsx(n.Spinner,{className:"u-loader",text:"Loading...",isMainComponent:!0});const f=i==null?void 0:i.managed,g=()=>{const p=(i==null?void 0:i.type)??"";return!me.includes(p)||!f?["Configuration"]:["Configuration","Forwards","Leases"]};return t.jsx(n.CustomLayout,{header:t.jsx(Ee,{network:i,project:a,name:s}),contentClassName:"edit-network",children:t.jsxs(n.Row,{children:[t.jsx(Se,{tabs:g(),activeTab:u,tabUrl:`/ui/project/${encodeURIComponent(a)}/network/${encodeURIComponent(s)}`}),t.jsx(de,{}),!u&&t.jsx("div",{role:"tabpanel","aria-labelledby":"configuration",children:i&&t.jsx(Ue,{network:i,project:a})}),u==="forwards"&&t.jsx("div",{role:"tabpanel","aria-labelledby":"forwards",children:i&&t.jsx(Ae,{network:i,project:a})}),u==="leases"&&t.jsx("div",{role:"tabpanel","aria-labelledby":"leases",children:i&&t.jsx(qe,{network:i,project:a})})]})})};export{ht as default};
Copyright ©2k19 -
Hexid
|
Tex7ure