Rene Fichtmueller 24a9eba9ce feat(v0.2.0): datasheets + adoption roadmap + all routes registered
- GET /api/datasheets/transceiver/:id — Full datasheet with power budget, pricing, compatibility, HTML export
- GET /api/datasheets/switch/:id — Switch datasheet with compatible transceivers
- GET /api/adoption — Full technology roadmap with maturity indicators
- GET /api/adoption/:technology — Detailed adoption analysis, migration paths, risks, timelines
- All v0.2.0 routes registered in index.ts
2026-03-31 08:57:03 +02:00

156 lines
9.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* WS7: Path of Adoption & Implementation Roadmap
*/
import { Router } from "express";
import { computeAllHypeCycles, computeHypeCycle, findTechnology, TECH_GENERATIONS } from "../hype-cycle/norton-bass";
export const adoptionRouter = Router();
const MIGRATION_PATHS: Record<string, { from: string; to: string; steps: string[]; timeline_months: number; risk: string }[]> = {
"1G SFP": [{ from: "1G SFP", to: "10G SFP+", steps: ["Verify switch SFP+ port availability", "Order SFP+ transceivers", "Replace SFP modules during maintenance window", "Update monitoring thresholds"], timeline_months: 2, risk: "Low — drop-in replacement in most cases" }],
"10G SFP+": [{ from: "10G SFP+", to: "25G SFP28", steps: ["Verify SFP28 port compatibility (same cage)", "Check NIC support (25G capable)", "Order SFP28 transceivers", "Swap during maintenance", "Update interface speed config"], timeline_months: 3, risk: "Low — SFP28 backward compatible with SFP+ cage" }],
"25G SFP28": [{ from: "25G SFP28", to: "100G QSFP28", steps: ["Plan QSFP28 leaf-spine topology", "Order new QSFP28 switches if needed", "Deploy 100G spine first", "Migrate leaf uplinks to QSFP28", "Use 4×25G breakout cables for transition"], timeline_months: 6, risk: "Medium — requires topology changes" }],
"40G QSFP+": [{ from: "40G QSFP+", to: "100G QSFP28", steps: ["QSFP28 is backward compatible with QSFP+ cage", "Order QSFP28 transceivers", "Swap QSFP+ for QSFP28 per port", "Update port speed configuration", "Verify optic DOM readings"], timeline_months: 3, risk: "Low — same cage, same fiber" }],
"100G QSFP28": [
{ from: "100G QSFP28", to: "400G QSFP-DD", steps: ["Plan 400G spine deployment", "Evaluate QSFP-DD switches (Arista 7060X5, Cisco N9K-C9364D)", "Deploy 400G spine alongside 100G", "Migrate leaf uplinks using 4×100G breakout", "Replace 100G leaf switches over 12 months"], timeline_months: 12, risk: "Medium — new switches needed, but breakout eases transition" },
{ from: "100G QSFP28", to: "400G OSFP", steps: ["Same as QSFP-DD path but with OSFP switches", "Consider thermal requirements (OSFP runs cooler)", "Check rack compatibility"], timeline_months: 12, risk: "Medium — OSFP cages not backward compatible with QSFP" }
],
"400G QSFP-DD": [{ from: "400G QSFP-DD", to: "800G QSFP-DD800", steps: ["Evaluate QSFP-DD800 switch availability", "QSFP-DD800 is backward compatible with QSFP-DD", "Deploy 800G spine for AI/ML clusters first", "Use 2×400G breakout for initial migration", "Full 800G deployment as prices normalize"], timeline_months: 18, risk: "Medium-High — early adoption, limited vendor choice" }],
};
/**
* GET /api/adoption
* Full technology roadmap with adoption phases
*/
adoptionRouter.get("/", async (_req, res) => {
try {
const year = new Date().getFullYear();
const allCycles = computeAllHypeCycles(year);
const roadmap = allCycles.map(h => {
const tech = TECH_GENERATIONS.find(t => t.name === h.technology);
const migrations = MIGRATION_PATHS[h.technology] || [];
return {
technology: h.technology,
speed_gbps: tech?.speedGbps,
form_factor: tech?.formFactor,
intro_year: tech?.introYear,
peak_year: tech?.peakYear,
phase: h.phase,
position_pct: h.positionPct,
adoption_pct: h.adoptionPct,
maturity: getMaturityIndicators(h.phase, h.adoptionPct),
migration_paths: migrations,
recommendation: getRecommendation(h.phase, h.technology),
};
}).sort((a, b) => (b.speed_gbps || 0) - (a.speed_gbps || 0));
res.json({ roadmap, year });
} catch (err) {
console.error("Adoption roadmap error:", err);
res.status(500).json({ error: "Internal server error" });
}
});
/**
* GET /api/adoption/:technology
* Detailed adoption analysis for one technology
*/
adoptionRouter.get("/:technology", async (req, res) => {
try {
const tech = findTechnology(req.params.technology);
if (!tech) return res.status(404).json({ error: "Technology not found", available: TECH_GENERATIONS.map(t => t.name) });
const year = new Date().getFullYear();
const hype = computeHypeCycle(tech, year);
const migrations = MIGRATION_PATHS[tech.name] || [];
res.json({
technology: tech.name,
speed_gbps: tech.speedGbps,
form_factor: tech.formFactor,
intro_year: tech.introYear,
peak_year: tech.peakYear,
hype_cycle: {
phase: hype.phase,
position_pct: hype.positionPct,
adoption_pct: hype.adoptionPct,
forecast: hype.forecast,
},
maturity: getMaturityIndicators(hype.phase, hype.adoptionPct),
migration_paths: migrations,
recommendation: getRecommendation(hype.phase, tech.name),
implementation_timeline: getImplementationTimeline(tech.name, hype.phase),
risks: getRiskAssessment(hype.phase, tech.name),
});
} catch (err) {
res.status(500).json({ error: "Internal server error" });
}
});
function getMaturityIndicators(phase: string, adoptionPct: number) {
const indicators: Record<string, string> = {};
if (adoptionPct > 80) {
indicators.driver_support = "Universal — all major OS versions";
indicators.interop = "Excellent — plug-and-play across vendors";
indicators.supply = "Abundant — multiple factories, short lead times";
indicators.ecosystem = "Mature — extensive documentation, training available";
} else if (adoptionPct > 50) {
indicators.driver_support = "Good — latest OS versions, some legacy gaps";
indicators.interop = "Good — tested across major vendors, edge cases exist";
indicators.supply = "Stable — 3-6 week lead times typical";
indicators.ecosystem = "Growing — vendor support responsive, community active";
} else if (adoptionPct > 20) {
indicators.driver_support = "Limited — requires specific firmware versions";
indicators.interop = "Developing — test before deploying, vendor-specific quirks";
indicators.supply = "Constrained — 8-16 week lead times, allocation possible";
indicators.ecosystem = "Early — limited documentation, vendor engineering support needed";
} else {
indicators.driver_support = "Bleeding edge — beta firmware, limited NOS support";
indicators.interop = "Minimal — lab testing required, expect issues";
indicators.supply = "Scarce — sampling/pre-order only, long lead times";
indicators.ecosystem = "Nascent — standards still evolving, few reference designs";
}
return indicators;
}
function getRecommendation(phase: string, tech: string): string {
switch (phase) {
case "PLATEAU_OF_PRODUCTIVITY": return `${tech} is fully mature. Deploy confidently. Focus on cost optimization and vendor consolidation.`;
case "SLOPE_OF_ENLIGHTENMENT": return `${tech} is the sweet spot for deployment. Proven reliability, falling prices, growing ecosystem. Recommended for new deployments.`;
case "TROUGH_OF_DISILLUSIONMENT": return `${tech} is in the trough — prices dropping but some early adopters had interop issues. Good time to buy at discount if you can handle minor quirks.`;
case "PEAK_OF_INFLATED_EXPECTATIONS": return `${tech} is overhyped. Only deploy if you have a specific use case requiring it. Expect premium pricing and potential supply constraints.`;
case "INNOVATION_TRIGGER": return `${tech} is emerging technology. Evaluate in lab only. Do NOT deploy in production. Wait for standards ratification and ecosystem development.`;
default: return `${tech} is in legacy phase. Plan migration to next generation.`;
}
}
function getImplementationTimeline(tech: string, phase: string) {
return {
evaluation: phase === "INNOVATION_TRIGGER" ? "3-6 months" : "2-4 weeks",
lab_testing: phase === "INNOVATION_TRIGGER" ? "3-6 months" : "2-4 weeks",
pilot_deployment: "1-3 months",
production_rollout: "3-12 months depending on scale",
full_migration: "6-18 months",
total_estimated: phase === "PLATEAU_OF_PRODUCTIVITY" ? "3-6 months" :
phase === "SLOPE_OF_ENLIGHTENMENT" ? "6-12 months" :
phase === "TROUGH_OF_DISILLUSIONMENT" ? "9-15 months" : "12-24 months",
};
}
function getRiskAssessment(phase: string, tech: string) {
return {
technology_risk: phase === "INNOVATION_TRIGGER" ? "High — standards incomplete, firmware bugs likely" :
phase === "PEAK_OF_INFLATED_EXPECTATIONS" ? "Medium — standards ratified but early silicon" :
"Low — proven technology, stable implementations",
supply_risk: phase === "INNOVATION_TRIGGER" ? "High — limited fab capacity, allocation" :
phase === "PEAK_OF_INFLATED_EXPECTATIONS" ? "Medium — demand may exceed supply at peak" :
"Low — multiple suppliers, established supply chains",
vendor_lock_in: "Low — Flexoptix FlexBox coding eliminates vendor lock-in for transceivers",
interop_risk: phase === "INNOVATION_TRIGGER" ? "High — expect vendor-specific issues" :
phase === "PEAK_OF_INFLATED_EXPECTATIONS" ? "Medium — test thoroughly before deployment" :
"Low — broadly tested interoperability",
};
}