fix(ui): проверять целостность снимка карты сети
This commit is contained in:
1 parent
66fde3fc62
commit
1215cbe8ae
6 files changed
+121
-85
No files matched your search
@@ -0,0 +1,20 @@
|
||||
import {z} from "zod"
|
||||
import {optimizerServersSchema,optimizerProbesSchema} from "./route-optimizer-response"
|
||||
import {filtersGreResponseSchema} from "./filters-response"
|
||||
import {greResponseSchema} from "./gre-response"
|
||||
export const networkMapServersSchema=z.array(optimizerServersSchema.element.extend({
|
||||
status:z.enum(["online","offline","degraded"]).nullable(),
|
||||
asn:z.string().optional(),comment:z.string().optional(),lanSubnet:z.string().optional(),os:z.string().nullable().optional(),
|
||||
sessions:z.number().int().nonnegative().nullable().optional(),uptime:z.string().nullable().optional(),
|
||||
cpuLoad:z.number().finite().min(0).max(100).nullable().optional(),freeMemory:z.number().int().nonnegative().nullable().optional(),totalMemory:z.number().int().nonnegative().nullable().optional(),
|
||||
polledAt:z.string().datetime({offset:true}).nullable().optional(),
|
||||
})).refine(rows=>new Set(rows.map(row=>row.id)).size===rows.length && rows.every(row=>row.freeMemory==null||row.totalMemory==null||row.freeMemory<=row.totalMemory))
|
||||
export type NetworkMapServerRow=z.infer<typeof networkMapServersSchema>[number]
|
||||
const mapGreSchema=z.object({tunnels:z.array(filtersGreResponseSchema.shape.tunnels.element).refine(rows=>new Set(rows.map(row=>JSON.stringify([row.serverId,row.id]))).size===rows.length),failures:greResponseSchema.shape.failures}).refine(data=>new Set(data.failures.map(row=>row.serverId)).size===data.failures.length&&!data.tunnels.some(tunnel=>data.failures.some(failure=>failure.serverId===tunnel.serverId)))
|
||||
export function validateNetworkMapSnapshot(servers:unknown,gre:unknown,probes:unknown){
|
||||
const inventory=networkMapServersSchema.parse(servers),tunnels=mapGreSchema.parse(gre),measurements=optimizerProbesSchema.parse(probes)
|
||||
const ids=new Set(inventory.map(row=>String(row.id)))
|
||||
if(tunnels.tunnels.some(tunnel=>!ids.has(tunnel.serverId))||tunnels.failures.some(failure=>!ids.has(failure.serverId))||measurements.probes.some(probe=>!ids.has(probe.srcServerId)||!ids.has(probe.dstServerId)))throw new Error("Данные карты относятся к неизвестному устройству")
|
||||
if(tunnels.failures.length)throw new Error("Неполный каталог GRE: "+tunnels.failures.map(failure=>failure.serverName||failure.serverId).join(", "))
|
||||
return {servers:inventory,tunnels:tunnels.tunnels,probes:measurements.probes}
|
||||
}
|
||||
Reference in new issue
Block a user