fix(api): закрепить неизвестное состояние BFD в строгом каталоге
This commit is contained in:
1 parent
b1080b0a05
commit
47dcd89b3c
4 files changed
+36
-5
No files matched your search
@@ -1,7 +1,7 @@
|
||||
import assert from "node:assert/strict"
|
||||
import Fastify from "fastify"
|
||||
import { validatorCompiler, serializerCompiler } from "@fastify/type-provider-zod"
|
||||
import { createOspfRoutes } from "./ospf.js"
|
||||
import { createOspfRoutes, parseBfdSessions } from "./ospf.js"
|
||||
import { emptyOspfCatalog, pollOspfCatalog, readOspfCatalogRaw, type OspfCatalogCollections } from "../services/ospf-catalog-poll.js"
|
||||
import { servers } from "../db/schema.js"
|
||||
const devices = [{ id: 1, name: "Первый" }, { id: 2, name: "Второй" }]
|
||||
@@ -29,3 +29,11 @@ assert.equal(response.statusCode, 200)
|
||||
assert.deepEqual(response.json(), mixed)
|
||||
await app.close()
|
||||
console.log("OSPF catalog: partial/empty/failed/foreign/duplicate and strict BFD/routes, HTTP passed")
|
||||
|
||||
const bfdServer = { id: 1, name: "Первый", host: "192.0.2.1", site: "", country: "RU" } as typeof servers.$inferSelect
|
||||
const rawBfd = (state?: string) => [{ ".id": "*1", "local-address": "192.0.2.1%ether1", "remote-address": "192.0.2.2", ...(state === undefined ? {} : { state }) }]
|
||||
for (const state of [undefined, "", " "]) assert.equal(parseBfdSessions(bfdServer, rawBfd(state), true)[0].state, "Unknown")
|
||||
assert.equal(parseBfdSessions(bfdServer, rawBfd("down"), true)[0].state, "Down")
|
||||
assert.equal(parseBfdSessions(bfdServer, rawBfd("up"), true)[0].state, "Up")
|
||||
assert.equal(parseBfdSessions(bfdServer, rawBfd(), false)[0].state, "Down")
|
||||
console.log("OSPF strict BFD missing/blank/known states and legacy compatibility passed")
|
||||
@@ -89,7 +89,7 @@ async function fetchServerOspf(server: ServerRow) {
|
||||
|
||||
// ── BFD parser ────────────────────────────────────────────────────────────────
|
||||
|
||||
function parseBfdSessions(server: ServerRow, raw: RosBfdSession[]): BfdSessionRead[] {
|
||||
export function parseBfdSessions(server: ServerRow, raw: RosBfdSession[], strictState = false): BfdSessionRead[] {
|
||||
return raw.map((s, idx) => {
|
||||
const local = parseAddrIface(s["local-address"])
|
||||
const remote = parseAddrIface(s["remote-address"])
|
||||
@@ -105,7 +105,7 @@ function parseBfdSessions(server: ServerRow, raw: RosBfdSession[]): BfdSessionRe
|
||||
localAddr: local.ip,
|
||||
remoteAddr: remote.ip,
|
||||
interface: iface,
|
||||
state: normalizeBfdState(s["state"]),
|
||||
state: strictState && !s["state"]?.trim() ? "Unknown" : normalizeBfdState(s["state"]),
|
||||
uptime: s["uptime"] ?? null,
|
||||
multihop: s["multihop"] === "true",
|
||||
multiplier: parseInt(s["multiplier"] ?? "3") || 3,
|
||||
@@ -554,7 +554,7 @@ const catalogDefaults: OspfCatalogDependencies = {
|
||||
readCatalog: async server => {
|
||||
const { neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes } = await readOspfCatalogRaw(MikrotikClient.fromServer(server))
|
||||
const areaMap = buildAreaMap(areas)
|
||||
return { neighbors: parseNeighbors(server, neighbors, areaMap), interfaces: parseInterfaces(server, ifaceTemplates, areas, instances, areaMap), instances: parseInstances(server, instances), bfdSessions: parseBfdSessions(server, bfdSessions).map((session, index) => ({ ...session, state: bfdSessions[index].state?.trim() ? session.state : "Unknown" })), routes: parseOspfRoutes(server, ipRoutes) }
|
||||
return { neighbors: parseNeighbors(server, neighbors, areaMap), interfaces: parseInterfaces(server, ifaceTemplates, areas, instances, areaMap), instances: parseInstances(server, instances), bfdSessions: parseBfdSessions(server, bfdSessions, true), routes: parseOspfRoutes(server, ipRoutes) }
|
||||
},
|
||||
}
|
||||
export function createOspfRoutes(dependencies: OspfCatalogDependencies = catalogDefaults): FastifyPluginAsyncZod {
|
||||
|
||||
Reference in new issue
Block a user