From 2dc21ee0aad56ab8f19d86b2a4cd10ddd75aecff Mon Sep 17 00:00:00 2001 From: Rene Fichtmueller Date: Thu, 11 Jun 2026 06:57:42 +0000 Subject: [PATCH] fix(switch-compat): parse embedded port speed for chassis switches Chassis switches use ports_config keys like 'max_per_slot_100G_QSFP28' (speed in the middle), not just '100G_QSFP28'. The '^[0-9.]+G' anchor failed -> port_speed NULL -> 0 suggestions (e.g. Cisco 8818 router). Now extracts the speed token wherever it sits before the cage. Cisco 8818: 0 -> 55, all Cisco-codeable, max 400G. --- packages/api/src/db/queries.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/api/src/db/queries.ts b/packages/api/src/db/queries.ts index e3d0308..5e148e6 100644 --- a/packages/api/src/db/queries.ts +++ b/packages/api/src/db/queries.ts @@ -352,10 +352,13 @@ export async function getFlexoptixSuggestions(switchId: string) { -- bounded by the port speed so corrupt/oversized records cannot leak in. SELECT DISTINCT -- numeric speed prefix: 100G->100, 25G->25, 2.5G->2.5, 100M->0.1, 800G->800 + -- speed token may be at the start ('100G_QSFP28') or embedded + -- ('max_per_slot_100G_QSFP28' on chassis switches). Match before the cage. CASE - WHEN k ~ '^[0-9.]+M' THEN (substring(k from '^([0-9.]+)M')::numeric / 1000) - WHEN k ~ '^[0-9.]+G' THEN substring(k from '^([0-9.]+)G')::numeric - WHEN k ~ '^[0-9.]+T' THEN (substring(k from '^([0-9.]+)T')::numeric * 1000) + WHEN k ~ '[0-9.]+M[_A-Za-z]' THEN (substring(k from '([0-9.]+)M[_A-Za-z]')::numeric / 1000) + WHEN k ~ '[0-9.]+T[_A-Za-z]' THEN (substring(k from '([0-9.]+)T[_A-Za-z]')::numeric * 1000) + WHEN k ~ '[0-9.]+G[_A-Za-z]' THEN substring(k from '([0-9.]+)G[_A-Za-z]')::numeric + WHEN k ~ '[0-9.]+G$' THEN substring(k from '([0-9.]+)G$')::numeric ELSE NULL END AS port_speed, -- the port's specific cage type (determines which modules mechanically seat)