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