25 lines
1.6 KiB
TypeScript
25 lines
1.6 KiB
TypeScript
import { z } from "zod"
|
|
import { vxlanServersSchema } from "@/lib/vxlan-response"
|
|
|
|
const counter = z.number().int().nonnegative()
|
|
const autonomousSystem = z.number().int().min(1).max(4294967295).nullable()
|
|
export const bgpSessionSchema = z.object({
|
|
id: z.string().trim().min(1), serverId: z.number().int().positive(),
|
|
serverName: z.string(), serverSite: z.string(), serverCountry: z.string(),
|
|
name: z.string(), peerIp: z.string(), remoteAs: autonomousSystem, localAs: autonomousSystem,
|
|
localId: z.string(), remoteId: z.string(), state: z.string().trim().min(1), type: z.enum(["eBGP", "iBGP", "Unknown"]),
|
|
uptime: z.string().nullable(), holdTime: counter.nullable(), keepalive: counter.nullable(),
|
|
prefixesRx: counter.nullable(), prefixesTx: counter.nullable(), inputMessages: counter.nullable(), outputMessages: counter.nullable(),
|
|
afi: z.string().nullable().optional(),
|
|
capabilities: z.array(z.string()), lastError: z.string().nullable(),
|
|
})
|
|
export const bgpCatalogSchema = z.object({
|
|
sessions: z.array(bgpSessionSchema),
|
|
failures: z.array(z.object({ serverId: z.number().int().positive(), serverName: z.string(), error: z.string() })),
|
|
}).refine(data => new Set(data.sessions.map(s => JSON.stringify([s.serverId, s.id]))).size === data.sessions.length
|
|
&& new Set(data.failures.map(f => f.serverId)).size === data.failures.length
|
|
&& !data.sessions.some(s => data.failures.some(f => f.serverId === s.serverId)))
|
|
export const bgpServersSchema = vxlanServersSchema
|
|
export type BackendBgpSession = z.infer<typeof bgpSessionSchema>
|
|
export type BgpFailure = z.infer<typeof bgpCatalogSchema>["failures"][number]
|