1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

F OpenNebula/one#5422: Add socket to vm detail

This commit is contained in:
Sergio Betanzos 2021-06-23 10:51:38 +02:00
parent 20420b0af6
commit aa4b1cf951
No known key found for this signature in database
GPG Key ID: E3E704F097737136
3 changed files with 47 additions and 45 deletions

View File

@ -91,7 +91,16 @@ const EnhancedTable = ({
data,
defaultColumn,
getRowId,
// When table has update, disable all of the auto resetting
autoResetPage: false,
autoResetRowState: false,
autoResetSelectedRow: false,
autoResetExpanded: false,
autoResetGroupBy: false,
autoResetSelectedRows: false,
autoResetSortBy: false,
autoResetFilters: false,
// -------------------------------------
initialState: {
pageSize
}

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from 'react'
import React, { useEffect } from 'react'
import { LinearProgress, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core'
import Tabs from 'client/components/Tabs'
@ -14,33 +14,17 @@ import { prettyBytes } from 'client/utils'
const NavArrowDown = <span style={{ writingMode: 'vertical-rl' }}>{'>'}</span>
const VmDetail = ({ id }) => {
const [socket, setSocket] = useState({})
const { getHooksSocket } = useSocket()
const socket = getHooksSocket({ resource: 'vm', id })
const { getVm } = useVmApi()
const { getHooksSocketTemporal } = useSocket()
const { data, fetchRequest, loading, error } = useFetch(getVm)
const isLoading = (!data && !error) || loading
const { data, fetchRequest, loading, error } = useFetch(getVm, socket)
useEffect(() => {
fetchRequest(id)
}, [id])
useEffect(() => {
if (!isLoading && data) {
const client = getHooksSocketTemporal({ resource: 'vm', id })
setSocket(client)
client.connect(console.log)
}
return () => {
socket?.disconnect()
}
}, [isLoading, data])
if (isLoading) {
if ((!data && !error) || loading) {
return <LinearProgress color='secondary' style={{ width: '100%' }} />
}

View File

@ -1,50 +1,59 @@
import { useContext, useCallback } from 'react'
import { useCallback } from 'react'
import socketIO from 'socket.io-client'
import { useDispatch } from 'react-redux'
import { APP_URL, SOCKETS } from 'client/constants'
import { SocketContext } from 'client/providers/socketProvider'
import { WEBSOCKET_URL, SOCKETS } from 'client/constants'
import { useAuth } from 'client/features/Auth'
import { useGeneral } from 'client/features/General'
import { eventUpdateResourceState, getResourceFromEventState } from 'client/features/One/socket/actions'
const createWebsocket = (path, query) => socketIO({ path: `${APP_URL}/${path}`, query })
const createWebsocket = (path, query) => socketIO({
path: `${WEBSOCKET_URL}/${path}`,
query,
autoConnect: false,
timeout: 10_000,
reconnectionAttempts: 5
})
export default function useSocket () {
const dispatch = useDispatch()
const { jwt } = useAuth()
const { zone } = useGeneral()
const { socket, isConnected } = useContext(SocketContext)
const getHooksSocketTemporal = useCallback(({ resource, id }) => {
const socket = createWebsocket(
SOCKETS.hooks,
{ token: jwt, zone, resource, id }
)
const getHooksSocket = useCallback(query => {
const socket = createWebsocket(SOCKETS.hooks, { token: jwt, zone, ...query })
return {
connect: callback => {
socket.on(SOCKETS.hooks, callback)
socket.on(SOCKETS.hooks, data => {
// update the list on redux state
dispatch(eventUpdateResourceState(data))
// return data from event
callback(getResourceFromEventState(data).value)
})
socket.connect()
},
disconnect: () => {
socket.disconnect()
socket.connected && socket.disconnect()
}
}
}, [jwt, zone])
const getHooksSocket = useCallback(func => ({
on: () => isConnected && socket.on(SOCKETS.hooks, func),
off: () => isConnected && socket.off(SOCKETS.hooks, func)
}), [socket, isConnected])
const getProvisionSocket = useCallback(func => {
const socket = createWebsocket(SOCKETS.provision, { token: jwt, zone })
const getProvisionSocket = useCallback(func => ({
on: () => isConnected && socket.on(SOCKETS.provision, func),
off: () => isConnected && socket.off(SOCKETS.provision, func)
}), [socket, isConnected])
socket.on(SOCKETS.provision, func)
return {
on: () => socket.connect(),
off: () => socket.disconnect()
}
}, [])
return {
isConnected,
getHooksSocket,
getProvisionSocket,
getHooksSocketTemporal
getProvisionSocket
}
}