mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-16 22:50:10 +03:00
F OpenNebula/one#5422: Add vn templates table
This commit is contained in:
parent
5262b0fa6b
commit
dafb42ed79
@ -14,7 +14,9 @@ import {
|
||||
SimpleCart as MarketplaceIcon,
|
||||
CloudDownload as MarketplaceAppIcon,
|
||||
|
||||
ServerConnection as NetworksIcon,
|
||||
NetworkAlt as NetworkIcon,
|
||||
Combine as NetworkTemplateIcon,
|
||||
|
||||
CloudSync as InfrastructureIcon,
|
||||
Server as ClusterIcon,
|
||||
@ -45,7 +47,7 @@ const Marketplaces = loadable(() => import('client/containers/Marketplaces'), {
|
||||
const MarketplaceApps = loadable(() => import('client/containers/MarketplaceApps'), { ssr: false })
|
||||
|
||||
const VirtualNetworks = loadable(() => import('client/containers/VirtualNetworks'), { ssr: false })
|
||||
// const NetworkTemplates = loadable(() => import('client/containers/NetworkTemplates'), { ssr: false })
|
||||
const VNetworkTemplates = loadable(() => import('client/containers/VNetworkTemplates'), { ssr: false })
|
||||
// const NetworkTopologies = loadable(() => import('client/containers/NetworkTopologies'), { ssr: false })
|
||||
// const SecurityGroups = loadable(() => import('client/containers/SecurityGroups'), { ssr: false })
|
||||
|
||||
@ -191,7 +193,7 @@ export const ENDPOINTS = [
|
||||
{
|
||||
label: 'Networks',
|
||||
sidebar: true,
|
||||
icon: NetworkIcon,
|
||||
icon: NetworksIcon,
|
||||
routes: [
|
||||
{
|
||||
label: 'Virtual Networks',
|
||||
@ -199,6 +201,13 @@ export const ENDPOINTS = [
|
||||
sidebar: true,
|
||||
icon: NetworkIcon,
|
||||
Component: VirtualNetworks
|
||||
},
|
||||
{
|
||||
label: 'Network Templates',
|
||||
path: PATH.NETWORK.VN_TEMPLATES.LIST,
|
||||
sidebar: true,
|
||||
icon: NetworkTemplateIcon,
|
||||
Component: VNetworkTemplates
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -0,0 +1,15 @@
|
||||
export default [
|
||||
{ Header: 'ID', accessor: 'ID', sortType: 'number' },
|
||||
{ Header: 'Name', accessor: 'NAME' },
|
||||
{ Header: 'Owner', accessor: 'UNAME' },
|
||||
{ Header: 'Group', accessor: 'GNAME' },
|
||||
{ Header: 'Locked', accessor: 'LOCK' },
|
||||
{ Header: 'Registration Time', accessor: 'REGTIME' },
|
||||
{
|
||||
Header: 'Provision ID',
|
||||
id: 'PROVISION_ID',
|
||||
accessor: row => row?.TEMPLATE?.PROVISION?.ID,
|
||||
disableSortBy: true
|
||||
}
|
||||
|
||||
]
|
@ -0,0 +1,36 @@
|
||||
import React, { useEffect } from 'react'
|
||||
|
||||
import { useFetch } from 'client/hooks'
|
||||
import { useVNetworkTemplate, useVNetworkTemplateApi } from 'client/features/One'
|
||||
|
||||
import { SkeletonTable, EnhancedTable } from 'client/components/Tables'
|
||||
import VNetworkTemplateColumns from 'client/components/Tables/VNetworkTemplates/columns'
|
||||
import VNetworkTemplateRow from 'client/components/Tables/VNetworkTemplates/row'
|
||||
|
||||
const VNetworkTemplatesTable = () => {
|
||||
const columns = React.useMemo(() => VNetworkTemplateColumns, [])
|
||||
|
||||
const vNetworkTemplates = useVNetworkTemplate()
|
||||
const { getVNetworkTemplates } = useVNetworkTemplateApi()
|
||||
|
||||
const { status, fetchRequest, loading, reloading, STATUS } = useFetch(getVNetworkTemplates)
|
||||
const { INIT, PENDING } = STATUS
|
||||
|
||||
useEffect(() => { fetchRequest() }, [])
|
||||
|
||||
if (vNetworkTemplates?.length === 0 && [INIT, PENDING].includes(status)) {
|
||||
return <SkeletonTable />
|
||||
}
|
||||
|
||||
return (
|
||||
<EnhancedTable
|
||||
columns={columns}
|
||||
data={vNetworkTemplates}
|
||||
isLoading={loading || reloading}
|
||||
getRowId={row => String(row.ID)}
|
||||
RowComponent={VNetworkTemplateRow}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
export default VNetworkTemplatesTable
|
@ -0,0 +1,58 @@
|
||||
import * as React from 'react'
|
||||
import PropTypes from 'prop-types'
|
||||
|
||||
import { User, Group, Lock, Cloud } from 'iconoir-react'
|
||||
import { Typography } from '@material-ui/core'
|
||||
|
||||
import { rowStyles } from 'client/components/Tables/styles'
|
||||
|
||||
import * as Helper from 'client/models/Helper'
|
||||
|
||||
const Row = ({ original, value, ...props }) => {
|
||||
const classes = rowStyles()
|
||||
const { ID, NAME, UNAME, GNAME, LOCK, REGTIME, PROVISION_ID } = value
|
||||
|
||||
const time = Helper.timeFromMilliseconds(+REGTIME)
|
||||
const timeAgo = `registered ${time.toRelative()}`
|
||||
|
||||
return (
|
||||
<div {...props}>
|
||||
<div className={classes.main}>
|
||||
<div className={classes.title}>
|
||||
<Typography className={classes.titleText} component='span'>
|
||||
{NAME}
|
||||
</Typography>
|
||||
<span className={classes.labels}>
|
||||
{LOCK && <Lock size={20} />}
|
||||
</span>
|
||||
</div>
|
||||
<div className={classes.caption}>
|
||||
<span title={time.toFormat('ff')}>
|
||||
{`#${ID} ${timeAgo}`}
|
||||
</span>
|
||||
<span title={`Owner: ${UNAME}`}>
|
||||
<User size={16} />
|
||||
<span>{` ${UNAME}`}</span>
|
||||
</span>
|
||||
<span title={`Group: ${GNAME}`}>
|
||||
<Group size={16} />
|
||||
<span>{` ${GNAME}`}</span>
|
||||
</span>
|
||||
{PROVISION_ID && <span title={`Provision ID: #${PROVISION_ID}`}>
|
||||
<Cloud size={16} />
|
||||
<span>{` ${PROVISION_ID}`}</span>
|
||||
</span>}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
Row.propTypes = {
|
||||
original: PropTypes.object,
|
||||
value: PropTypes.object,
|
||||
isSelected: PropTypes.bool,
|
||||
handleClick: PropTypes.func
|
||||
}
|
||||
|
||||
export default Row
|
@ -12,6 +12,7 @@ import VirtualizedTable from 'client/components/Tables/Virtualized'
|
||||
import VmsTable from 'client/components/Tables/Vms'
|
||||
import VmTemplatesTable from 'client/components/Tables/VmTemplates'
|
||||
import VNetworksTable from 'client/components/Tables/VNetworks'
|
||||
import VNetworkTemplatesTable from 'client/components/Tables/VNetworkTemplates'
|
||||
|
||||
export {
|
||||
SkeletonTable,
|
||||
@ -28,5 +29,6 @@ export {
|
||||
UsersTable,
|
||||
VmsTable,
|
||||
VmTemplatesTable,
|
||||
VNetworksTable
|
||||
VNetworksTable,
|
||||
VNetworkTemplatesTable
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ const Networks = () => ({
|
||||
const [showDialog, setShowDialog] = useState(false)
|
||||
|
||||
const { getVNetworks } = useVNetworkApi()
|
||||
const { getVNetworksTemplates } = useVNetworkTemplateApi()
|
||||
const { getVNetworkTemplates } = useVNetworkTemplateApi()
|
||||
|
||||
const {
|
||||
editingData,
|
||||
@ -42,7 +42,7 @@ const Networks = () => ({
|
||||
|
||||
useEffect(() => {
|
||||
getVNetworks()
|
||||
getVNetworksTemplates()
|
||||
getVNetworkTemplates()
|
||||
}, [])
|
||||
|
||||
return (
|
||||
|
@ -17,11 +17,11 @@ const Networks = () => ({
|
||||
optionsValidate: { abortEarly: false },
|
||||
content: useCallback(({ data }) => {
|
||||
const { getVNetworks } = useVNetworkApi()
|
||||
const { getVNetworksTemplates } = useVNetworkTemplateApi()
|
||||
const { getVNetworkTemplates } = useVNetworkTemplateApi()
|
||||
|
||||
useEffect(() => {
|
||||
getVNetworks()
|
||||
getVNetworksTemplates()
|
||||
getVNetworkTemplates()
|
||||
}, [])
|
||||
|
||||
return data?.map(({ id, name, description }, index) => (
|
||||
|
@ -0,0 +1,22 @@
|
||||
import * as React from 'react'
|
||||
|
||||
import { Container, Box } from '@material-ui/core'
|
||||
|
||||
import * as Tables from 'client/components/Tables'
|
||||
|
||||
function VirtualMachines () {
|
||||
return (
|
||||
<Box
|
||||
height={1}
|
||||
py={2}
|
||||
overflow='auto'
|
||||
display='flex'
|
||||
flexDirection='column'
|
||||
component={Container}
|
||||
>
|
||||
<Tables.VNetworkTemplatesTable />
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
|
||||
export default VirtualMachines
|
@ -7,8 +7,8 @@ export const getVNetworkTemplate = createAction(
|
||||
vNetworkTemplateService.getVNetworkTemplate
|
||||
)
|
||||
|
||||
export const getVNetworksTemplates = createAction(
|
||||
export const getVNetworkTemplates = createAction(
|
||||
'vnet-template/pool',
|
||||
vNetworkTemplateService.getVNetworksTemplates,
|
||||
vNetworkTemplateService.getVNetworkTemplates,
|
||||
response => ({ [RESOURCES.vntemplate]: response })
|
||||
)
|
||||
|
@ -19,6 +19,6 @@ export const useVNetworkTemplateApi = () => {
|
||||
|
||||
return {
|
||||
getVNetworkTemplate: id => unwrapDispatch(actions.getVNetworkTemplate({ id })),
|
||||
getVNetworksTemplates: () => unwrapDispatch(actions.getVNetworksTemplates())
|
||||
getVNetworkTemplates: () => unwrapDispatch(actions.getVNetworkTemplates())
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ export const vNetworkTemplateService = ({
|
||||
return res?.data?.VNTEMPLATE ?? {}
|
||||
})
|
||||
},
|
||||
getVNetworksTemplates: data => {
|
||||
getVNetworkTemplates: data => {
|
||||
const name = Actions.VNTEMPLATE_POOL_INFO
|
||||
const command = { name, ...Commands[name] }
|
||||
return poolRequest(data, command, 'VNTEMPLATE')
|
||||
|
Loading…
x
Reference in New Issue
Block a user