import { Box, Flex, H1, Skeleton, styled, Text } from '@traefiklabs/faency'
import { useMemo } from 'react'
import { FiGlobe, FiInfo, FiShield } from 'react-icons/fi'
import { useParams } from 'react-router-dom'
import ProviderIcon from 'components/icons/providers'
import {
DetailSection,
DetailSectionSkeleton,
ItemBlock,
ItemTitle,
LayoutTwoCols,
ProviderName,
} from 'components/resources/DetailSections'
import { ResourceStatus } from 'components/resources/ResourceStatus'
import { UsedByRoutersSection, UsedByRoutersSkeleton } from 'components/resources/UsedByRoutersSection'
import Tooltip from 'components/Tooltip'
import { ResourceDetailDataType, ServiceDetailType, useResourceDetail } from 'hooks/use-resource-detail'
import Page from 'layout/Page'
import { NotFound } from 'pages/NotFound'
type TcpDetailProps = {
data: ServiceDetailType
}
const SpacedColumns = styled(Flex, {
display: 'grid',
gridTemplateColumns: 'repeat(auto-fill, minmax(360px, 1fr))',
gridGap: '16px',
})
const ServicesGrid = styled(Box, {
display: 'grid',
gridTemplateColumns: '2fr 1fr 1fr',
alignItems: 'center',
padding: '$3 $5',
borderBottom: '1px solid $tableRowBorder',
})
const ServersGrid = styled(Box, {
display: 'grid',
alignItems: 'center',
padding: '$3 $5',
borderBottom: '1px solid $tableRowBorder',
})
const GridTitle = styled(Text, {
fontSize: '14px',
fontWeight: 700,
color: 'hsl(0, 0%, 56%)',
})
type TcpServer = {
address: string
}
type ServerStatus = {
[server: string]: string
}
type TcpHealthCheck = {
port?: number
send?: string
expect?: string
interval?: string
unhealthyInterval?: string
timeout?: string
}
function getTcpServerStatusList(data: ServiceDetailType): ServerStatus {
const serversList: ServerStatus = {}
data.loadBalancer?.servers?.forEach((server: any) => {
// TCP servers should have address, but handle both url and address for compatibility
const serverKey = (server as TcpServer).address || (server as any).url
if (serverKey) {
serversList[serverKey] = 'DOWN'
}
})
if (data.serverStatus) {
Object.entries(data.serverStatus).forEach(([server, status]) => {
serversList[server] = status
})
}
return serversList
}
export const TcpServicePanels = ({ data }: TcpDetailProps) => {
const serversList = getTcpServerStatusList(data)
const getProviderFromName = (serviceName: string): string => {
const [, provider] = serviceName.split('@')
return provider || data.provider
}
const providerName = useMemo(() => {
return data.provider
}, [data.provider])
return (
} title="Service Details">
{data.type && (
{data.type}
)}
{data.provider && (
{providerName}
)}
{data.status && (
)}
{data.loadBalancer && (
<>
{data.loadBalancer.terminationDelay && (
{`${data.loadBalancer.terminationDelay} ms`}
)}
>
)}
{data.loadBalancer?.healthCheck && (
} title="Health Check">
{(() => {
const tcpHealthCheck = data.loadBalancer.healthCheck as unknown as TcpHealthCheck
return (
<>
{tcpHealthCheck.interval && (
{tcpHealthCheck.interval}
)}
{tcpHealthCheck.timeout && (
{tcpHealthCheck.timeout}
)}
{tcpHealthCheck.port && (
{tcpHealthCheck.port}
)}
{tcpHealthCheck.unhealthyInterval && (
{tcpHealthCheck.unhealthyInterval}
)}
{tcpHealthCheck.send && (
{tcpHealthCheck.send}
)}
{tcpHealthCheck.expect && (
{tcpHealthCheck.expect}
)}
>
)
})()}
)}
{!!data?.weighted?.services?.length && (
} title="Services" noPadding>
<>
Name
Weight
Provider
{data.weighted.services.map((service) => (
{service.name}
{service.weight}
))}
>
)}
{Object.keys(serversList).length > 0 && (
} title="Servers" noPadding>
<>
Status
Address
{Object.entries(serversList).map(([server, status]) => (
{server}
))}
>
)}
)
}
type TcpServiceRenderProps = {
data?: ResourceDetailDataType
error?: Error
name: string
}
export const TcpServiceRender = ({ data, error, name }: TcpServiceRenderProps) => {
if (error) {
return (
Sorry, we could not fetch detail information for this Service right now. Please, try again later.
)
}
if (!data) {
return (
)
}
if (!data.name) {
return
}
return (
{data.name}
)
}
export const TcpService = () => {
const { name } = useParams<{ name: string }>()
const { data, error } = useResourceDetail(name!, 'services', 'tcp')
return
}
export default TcpService