This is an automated email from the ASF dual-hosted git repository. wu-sheng pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git
commit 8a00c6ec1065c6f1c7a1271aa63adb25c428dd57 Author: Wu Sheng <[email protected]> AuthorDate: Wed May 20 17:00:20 2026 +0800 bff: menu falls back to bundled templates when OAP is unreachable /api/menu returned an empty layer list when the OAP query failed, so the sidebar lost all layer navigation whenever OAP was down. Build the layer list from the bundled layer templates (allLayerTemplates) in the catch path — same deriveLayer as the live path, with serviceCount -1 (unknown) and active=false. The operator keeps full navigation offline; each page still surfaces its own OAP-down state. RBAC menu gating applies equally to the fallback (it's the same LayerDef shape + verbs). --- apps/bff/src/http/query/menu.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/bff/src/http/query/menu.ts b/apps/bff/src/http/query/menu.ts index 2eae4d0..a122fc5 100644 --- a/apps/bff/src/http/query/menu.ts +++ b/apps/bff/src/http/query/menu.ts @@ -314,8 +314,22 @@ export function registerMenuRoute(app: FastifyInstance, deps: MenuRouteDeps): vo }; return reply.send(body); } catch (err) { + // OAP unreachable — fall back to the bundled layer templates so the + // sidebar still renders navigation (each page surfaces its own + // OAP-down state). Service counts are unknown (-1) and layers are + // marked inactive; everything else (alias / color / slots / caps) + // comes from the template, exactly like the live path. + const HIDDEN_LAYERS = new Set(['BANYANDB']); + const seen = new Set<string>(); + const layers: LayerDef[] = []; + for (const tpl of allLayerTemplates()) { + const key = canonical(tpl.key.toUpperCase()); + if (seen.has(key) || HIDDEN_LAYERS.has(key)) continue; + seen.add(key); + layers.push(deriveLayer(key, false, null, -1, null)); + } const body: MenuResponse = { - layers: [], + layers, generatedAt: Date.now(), oap: { reachable: false,
