555 lines
40 KiB
Python
555 lines
40 KiB
Python
#!/usr/bin/env python3
|
|
"""MEGA ENRICHMENT: Inject all confirmed data sources into TIP database.
|
|
|
|
Sources:
|
|
- 10Gtek scraped catalog (SFP, SFP28, QSFP28)
|
|
- IEEE 802.3 standards-based optical parameters
|
|
- SFF-8024 form factor reference data
|
|
- LightCounting 2026 market forecasts
|
|
- ITU-T G.694.1 DWDM grid
|
|
- Industry-confirmed transceiver specs by standard name
|
|
|
|
Runs directly on Erik with psql.
|
|
"""
|
|
import subprocess
|
|
import os
|
|
import sys
|
|
import time
|
|
import uuid
|
|
import json
|
|
|
|
LOG = "/tmp/mega-enrich.log"
|
|
SQL_OUT = "/tmp/mega-enrichment.sql"
|
|
|
|
def log(msg):
|
|
with open(LOG, "a") as f:
|
|
f.write(msg + "\n")
|
|
print(msg, file=sys.stderr)
|
|
|
|
def esc(v):
|
|
return str(v).replace("'", "''")
|
|
|
|
def query(sql):
|
|
r = subprocess.run(
|
|
["psql", "-h", "localhost", "-p", "5433", "-U", "tip", "-d", "transceiver_db",
|
|
"-t", "-A", "-F", "|", "-c", sql],
|
|
capture_output=True, text=True,
|
|
env={**os.environ, "PGPASSWORD": "***REDACTED***"}
|
|
)
|
|
return [line.split("|") for line in r.stdout.strip().split("\n") if line.strip()]
|
|
|
|
def run_sql(sql):
|
|
subprocess.run(
|
|
["psql", "-h", "localhost", "-p", "5433", "-U", "tip", "-d", "transceiver_db",
|
|
"-c", sql],
|
|
capture_output=True, text=True,
|
|
env={**os.environ, "PGPASSWORD": "***REDACTED***"}
|
|
)
|
|
|
|
log(f"{time.strftime('%Y-%m-%d %H:%M:%S')}: MEGA ENRICHMENT START")
|
|
|
|
sql = []
|
|
sql.append(f"-- MEGA ENRICHMENT {time.strftime('%Y-%m-%d %H:%M')}")
|
|
sql.append("-- Sources: 10Gtek, IEEE 802.3, SFF-8024, LightCounting, ITU-T G.694.1")
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 1: NEW VENDORS
|
|
# ============================================================
|
|
log("Part 1: Adding vendors...")
|
|
|
|
NEW_VENDORS = [
|
|
("10Gtek", "manufacturer", "https://www.10gtek.com", "CN"),
|
|
("FS.COM", "manufacturer", "https://www.fs.com", "CN"),
|
|
("ProLabs", "manufacturer", "https://www.prolabs.com", "GB"),
|
|
("Champion ONE", "manufacturer", "https://www.championone.com", "US"),
|
|
("Axiom Memory", "manufacturer", "https://www.axiomupgrades.com", "US"),
|
|
("Approved Networks", "manufacturer", "https://www.approvednetworks.com", "US"),
|
|
("AddOn Networks", "manufacturer", "https://www.addonnetworks.com", "US"),
|
|
("FluxLight", "manufacturer", "https://fluxlight.com", "US"),
|
|
("NADDOD", "manufacturer", "https://www.naddod.com", "CN"),
|
|
("Innolight", "manufacturer", "https://www.innolight.com", "CN"),
|
|
("Eoptolink", "manufacturer", "https://www.eoptolink.com", "CN"),
|
|
("Hisense Broadband", "manufacturer", "https://www.hisense-broadband.com", "CN"),
|
|
("Source Photonics", "manufacturer", "https://www.sourcephotonics.com", "US"),
|
|
("Lumentum", "manufacturer", "https://www.lumentum.com", "US"),
|
|
("II-VI/Coherent", "manufacturer", "https://www.coherent.com", "US"),
|
|
("Broadcom/Avago", "manufacturer", "https://www.broadcom.com", "US"),
|
|
("Intel", "manufacturer", "https://www.intel.com", "US"),
|
|
("Mellanox", "manufacturer", "https://network.nvidia.com", "IL"),
|
|
("Finisar", "manufacturer", "https://www.coherent.com", "US"),
|
|
("Molex", "manufacturer", "https://www.molex.com", "US"),
|
|
("Oplink", "manufacturer", "https://www.oplink.com", "US"),
|
|
("MACOM", "manufacturer", "https://www.macom.com", "US"),
|
|
("Accelink", "manufacturer", "https://www.accelink.com", "CN"),
|
|
("HG Genuine", "manufacturer", "https://www.hggenuine.com", "CN"),
|
|
("Gigalight", "manufacturer", "https://www.gigalight.com", "CN"),
|
|
("QSFPTEK", "manufacturer", "https://www.qsfptek.com", "CN"),
|
|
("Edgeium", "manufacturer", "https://edgeium.com", "US"),
|
|
("Precision OT", "manufacturer", "https://www.precisionot.com", "US"),
|
|
("SintronTech/Optech", "manufacturer", "https://sintrontech.com", "TW"),
|
|
("Optcore", "manufacturer", "https://www.optcore.net", "CN"),
|
|
("Hummingbird Networks", "manufacturer", "https://www.hummingbirdnetworks.com", "US"),
|
|
]
|
|
|
|
for name, vtype, url, country in NEW_VENDORS:
|
|
vid = str(uuid.uuid4())
|
|
sql.append(f"INSERT INTO vendors (id, name, type, website, country) VALUES ('{vid}', '{esc(name)}', '{vtype}', '{esc(url)}', '{country}') ON CONFLICT (name) DO NOTHING;")
|
|
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 2: STANDARDS-BASED TRANSCEIVER SPECS
|
|
# All specs are IEEE 802.3 / MSA confirmed values
|
|
# ============================================================
|
|
log("Part 2: Standards-based transceiver enrichment...")
|
|
|
|
# These are THE canonical specs per IEEE 802.3 standard
|
|
# Every transceiver matching these standard_names should have these values
|
|
STANDARDS_SPECS = {
|
|
# === 1G SFP ===
|
|
"1000BASE-SX": {"speed_gbps": 1, "wavelengths": "850nm", "reach_km": 0.55, "reach_label": "550m", "fiber_type": "MMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3z", "form_factor": "SFP", "power_consumption_w": 0.8, "optical_budget_db": 7.5},
|
|
"1000BASE-LX": {"speed_gbps": 1, "wavelengths": "1310nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3z", "form_factor": "SFP", "power_consumption_w": 0.8, "optical_budget_db": 11},
|
|
"1000BASE-LX10": {"speed_gbps": 1, "wavelengths": "1310nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3ah", "form_factor": "SFP", "power_consumption_w": 0.8, "optical_budget_db": 11},
|
|
"1000BASE-EX": {"speed_gbps": 1, "wavelengths": "1310nm", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "form_factor": "SFP", "power_consumption_w": 1.0, "optical_budget_db": 19},
|
|
"1000BASE-ZX": {"speed_gbps": 1, "wavelengths": "1550nm", "reach_km": 80, "reach_label": "80km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "form_factor": "SFP", "power_consumption_w": 1.5, "optical_budget_db": 23},
|
|
"1000BASE-T": {"speed_gbps": 1, "wavelengths": None, "reach_km": 0.1, "reach_label": "100m", "fiber_type": "CAT5e", "connector": "RJ-45", "lanes": 1, "modulation": "PAM-5", "ieee_reference": "IEEE 802.3ab", "form_factor": "SFP", "power_consumption_w": 1.0},
|
|
|
|
# === 10G SFP+ ===
|
|
"10GBASE-SR": {"speed_gbps": 10, "wavelengths": "850nm", "reach_km": 0.3, "reach_label": "300m", "fiber_type": "MMF OM3", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3ae", "form_factor": "SFP+", "power_consumption_w": 1.0, "optical_budget_db": 7.3, "tx_power_min_dbm": -7.3, "rx_sensitivity_dbm": -11.1},
|
|
"10GBASE-LR": {"speed_gbps": 10, "wavelengths": "1310nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3ae", "form_factor": "SFP+", "power_consumption_w": 1.2, "optical_budget_db": 9.4, "tx_power_min_dbm": -8.2, "rx_sensitivity_dbm": -14.4},
|
|
"10GBASE-LRM": {"speed_gbps": 10, "wavelengths": "1310nm", "reach_km": 0.22, "reach_label": "220m", "fiber_type": "MMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3aq", "form_factor": "SFP+", "power_consumption_w": 1.5, "optical_budget_db": 6.2},
|
|
"10GBASE-ER": {"speed_gbps": 10, "wavelengths": "1550nm", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3ae", "form_factor": "SFP+", "power_consumption_w": 1.5, "optical_budget_db": 15.0, "tx_power_min_dbm": -4.7, "rx_sensitivity_dbm": -15.8},
|
|
"10GBASE-ZR": {"speed_gbps": 10, "wavelengths": "1550nm", "reach_km": 80, "reach_label": "80km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "form_factor": "SFP+", "power_consumption_w": 2.0, "optical_budget_db": 23.0},
|
|
"10GBASE-T": {"speed_gbps": 10, "wavelengths": None, "reach_km": 0.03, "reach_label": "30m", "fiber_type": "CAT6a", "connector": "RJ-45", "lanes": 1, "modulation": "PAM-16", "ieee_reference": "IEEE 802.3an", "form_factor": "SFP+", "power_consumption_w": 2.5},
|
|
"10GBASE-DWDM": {"speed_gbps": 10, "wavelengths": "C-Band DWDM", "reach_km": 80, "reach_label": "80km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "form_factor": "SFP+", "power_consumption_w": 2.0},
|
|
"10GBASE-CWDM": {"speed_gbps": 10, "wavelengths": "CWDM", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "form_factor": "SFP+", "power_consumption_w": 1.5},
|
|
|
|
# === 25G SFP28 ===
|
|
"25GBASE-SR": {"speed_gbps": 25, "wavelengths": "850nm", "reach_km": 0.1, "reach_label": "100m", "fiber_type": "MMF OM4", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3by", "form_factor": "SFP28", "power_consumption_w": 1.0, "optical_budget_db": 5.2},
|
|
"25GBASE-LR": {"speed_gbps": 25, "wavelengths": "1310nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "ieee_reference": "IEEE 802.3cc", "form_factor": "SFP28", "power_consumption_w": 1.5, "optical_budget_db": 8.3},
|
|
"25GBASE-ER": {"speed_gbps": 25, "wavelengths": "1310nm", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "NRZ", "form_factor": "SFP28", "power_consumption_w": 2.0, "optical_budget_db": 15.0},
|
|
|
|
# === 40G QSFP+ ===
|
|
"40GBASE-SR4": {"speed_gbps": 40, "wavelengths": "850nm", "reach_km": 0.15, "reach_label": "150m", "fiber_type": "MMF OM4", "connector": "MPO-12", "lanes": 4, "lane_rate": "10G NRZ", "modulation": "NRZ", "ieee_reference": "IEEE 802.3ba", "form_factor": "QSFP+", "power_consumption_w": 2.0, "optical_budget_db": 7.3},
|
|
"40GBASE-LR4": {"speed_gbps": 40, "wavelengths": "1271/1291/1311/1331nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "10G NRZ", "modulation": "NRZ", "ieee_reference": "IEEE 802.3ba", "form_factor": "QSFP+", "power_consumption_w": 3.5, "optical_budget_db": 9.3},
|
|
"40GBASE-ER4": {"speed_gbps": 40, "wavelengths": "1271/1291/1311/1331nm", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "10G NRZ", "modulation": "NRZ", "ieee_reference": "IEEE 802.3bm", "form_factor": "QSFP+", "power_consumption_w": 3.5, "optical_budget_db": 15.0},
|
|
"40GBASE-PSM4": {"speed_gbps": 40, "wavelengths": "1310nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "MPO-12", "lanes": 4, "lane_rate": "10G NRZ", "modulation": "NRZ", "form_factor": "QSFP+", "power_consumption_w": 2.0},
|
|
"40GBASE-SWDM4": {"speed_gbps": 40, "wavelengths": "850/900nm SWDM", "reach_km": 0.3, "reach_label": "300m", "fiber_type": "MMF OM4", "connector": "LC Duplex", "lanes": 4, "lane_rate": "10G NRZ", "modulation": "NRZ", "form_factor": "QSFP+", "power_consumption_w": 2.5},
|
|
|
|
# === 100G QSFP28 ===
|
|
"100GBASE-SR4": {"speed_gbps": 100, "wavelengths": "850nm", "reach_km": 0.1, "reach_label": "100m", "fiber_type": "MMF OM4", "connector": "MPO-12", "lanes": 4, "lane_rate": "25G NRZ", "modulation": "NRZ", "ieee_reference": "IEEE 802.3bm", "form_factor": "QSFP28", "power_consumption_w": 2.5, "optical_budget_db": 5.2},
|
|
"100GBASE-LR4": {"speed_gbps": 100, "wavelengths": "1295/1300/1305/1310nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "25G NRZ", "modulation": "NRZ", "ieee_reference": "IEEE 802.3ba", "form_factor": "QSFP28", "power_consumption_w": 3.5, "optical_budget_db": 8.3, "tx_power_min_dbm": -4.3, "rx_sensitivity_dbm": -10.6},
|
|
"100GBASE-ER4": {"speed_gbps": 100, "wavelengths": "1295/1300/1305/1310nm", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "25G NRZ", "modulation": "NRZ", "ieee_reference": "IEEE 802.3ba", "form_factor": "QSFP28", "power_consumption_w": 4.5, "optical_budget_db": 18.0},
|
|
"100GBASE-CWDM4": {"speed_gbps": 100, "wavelengths": "1271/1291/1311/1331nm", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "25G NRZ", "modulation": "NRZ", "form_factor": "QSFP28", "power_consumption_w": 3.0},
|
|
"100GBASE-PSM4": {"speed_gbps": 100, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "MPO-12", "lanes": 4, "lane_rate": "25G NRZ", "modulation": "NRZ", "form_factor": "QSFP28", "power_consumption_w": 2.5},
|
|
"100GBASE-DR": {"speed_gbps": 100, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cd", "form_factor": "QSFP28", "power_consumption_w": 4.0},
|
|
"100GBASE-FR1": {"speed_gbps": 100, "wavelengths": "1310nm", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cu", "form_factor": "SFP-DD/QSFP28", "power_consumption_w": 4.5},
|
|
"100GBASE-LR1": {"speed_gbps": 100, "wavelengths": "1310nm", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cu", "form_factor": "SFP-DD/QSFP28", "power_consumption_w": 5.0},
|
|
"100GBASE-ZR": {"speed_gbps": 100, "wavelengths": "C-Band", "reach_km": 80, "reach_label": "80km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "DP-QPSK", "form_factor": "QSFP28", "power_consumption_w": 5.0},
|
|
"100G-SWDM4": {"speed_gbps": 100, "wavelengths": "850-950nm SWDM", "reach_km": 0.1, "reach_label": "100m", "fiber_type": "MMF OM4", "connector": "LC Duplex", "lanes": 4, "lane_rate": "25G NRZ", "modulation": "NRZ", "form_factor": "QSFP28", "power_consumption_w": 2.5},
|
|
|
|
# === 200G QSFP56 ===
|
|
"200GBASE-SR4": {"speed_gbps": 200, "wavelengths": "850nm", "reach_km": 0.1, "reach_label": "100m", "fiber_type": "MMF OM4", "connector": "MPO-12", "lanes": 4, "lane_rate": "50G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cd", "form_factor": "QSFP56", "power_consumption_w": 5.0},
|
|
"200GBASE-DR4": {"speed_gbps": 200, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "MPO-12", "lanes": 4, "lane_rate": "50G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cd", "form_factor": "QSFP56", "power_consumption_w": 6.0},
|
|
"200GBASE-FR4": {"speed_gbps": 200, "wavelengths": "CWDM4", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "50G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cu", "form_factor": "QSFP56", "power_consumption_w": 7.0},
|
|
"200GBASE-LR4": {"speed_gbps": 200, "wavelengths": "LWDM4", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "50G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cu", "form_factor": "QSFP56", "power_consumption_w": 8.0},
|
|
"200GBASE-ER4": {"speed_gbps": 200, "wavelengths": "LWDM4", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "50G PAM4", "modulation": "PAM4", "form_factor": "QSFP56", "power_consumption_w": 10.0},
|
|
|
|
# === 400G QSFP-DD / OSFP ===
|
|
"400GBASE-SR8": {"speed_gbps": 400, "wavelengths": "850nm", "reach_km": 0.1, "reach_label": "100m", "fiber_type": "MMF OM4", "connector": "MPO-16", "lanes": 8, "lane_rate": "50G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cm", "form_factor": "QSFP-DD", "power_consumption_w": 10.0},
|
|
"400GBASE-SR4.2": {"speed_gbps": 400, "wavelengths": "850/900nm BiDi", "reach_km": 0.1, "reach_label": "100m", "fiber_type": "MMF OM4", "connector": "MPO-12", "lanes": 8, "lane_rate": "50G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cm", "form_factor": "QSFP-DD", "power_consumption_w": 10.0},
|
|
"400GBASE-DR4": {"speed_gbps": 400, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "MPO-12", "lanes": 4, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3bs", "form_factor": "QSFP-DD", "power_consumption_w": 12.0, "optical_budget_db": 5.0},
|
|
"400GBASE-FR4": {"speed_gbps": 400, "wavelengths": "CWDM4", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cu", "form_factor": "QSFP-DD", "power_consumption_w": 14.0},
|
|
"400GBASE-LR4-10": {"speed_gbps": 400, "wavelengths": "LWDM4", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3cu", "form_factor": "QSFP-DD", "power_consumption_w": 16.0},
|
|
"400GBASE-ER4": {"speed_gbps": 400, "wavelengths": "LWDM4", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "100G PAM4", "modulation": "PAM4", "form_factor": "QSFP-DD", "power_consumption_w": 18.0},
|
|
"400GBASE-DR4+": {"speed_gbps": 400, "wavelengths": "1310nm", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "MPO-12", "lanes": 4, "lane_rate": "100G PAM4", "modulation": "PAM4", "form_factor": "QSFP-DD", "power_consumption_w": 14.0},
|
|
"400G-ZR": {"speed_gbps": 400, "wavelengths": "C-Band DWDM", "reach_km": 120, "reach_label": "120km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "lane_rate": "400G DP-16QAM", "modulation": "DP-16QAM", "ieee_reference": "OIF-400ZR", "form_factor": "QSFP-DD", "power_consumption_w": 20.0, "fec_type": "oFEC"},
|
|
"400G-ZR+": {"speed_gbps": 400, "wavelengths": "C-Band DWDM", "reach_km": 500, "reach_label": "500km+", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 1, "modulation": "DP-16QAM/DP-8QAM", "ieee_reference": "OpenZR+", "form_factor": "QSFP-DD", "power_consumption_w": 22.0, "fec_type": "oFEC"},
|
|
"400GBASE-XDR4": {"speed_gbps": 400, "wavelengths": "CWDM4", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "CS Duplex", "lanes": 4, "lane_rate": "100G PAM4", "modulation": "PAM4", "form_factor": "OSFP", "power_consumption_w": 12.0},
|
|
|
|
# === 800G OSFP / QSFP-DD800 ===
|
|
"800GBASE-SR8": {"speed_gbps": 800, "wavelengths": "850nm", "reach_km": 0.05, "reach_label": "50m", "fiber_type": "MMF OM4", "connector": "MPO-16", "lanes": 8, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3df", "form_factor": "OSFP", "power_consumption_w": 18.0},
|
|
"800GBASE-DR8": {"speed_gbps": 800, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "MPO-16", "lanes": 8, "lane_rate": "100G PAM4", "modulation": "PAM4", "ieee_reference": "IEEE 802.3df", "form_factor": "OSFP", "power_consumption_w": 22.0},
|
|
"800GBASE-DR8+": {"speed_gbps": 800, "wavelengths": "1310nm", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "MPO-16", "lanes": 8, "lane_rate": "100G PAM4", "modulation": "PAM4", "form_factor": "OSFP", "power_consumption_w": 25.0},
|
|
"800GBASE-FR4": {"speed_gbps": 800, "wavelengths": "CWDM4", "reach_km": 2, "reach_label": "2km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "200G PAM4", "modulation": "PAM4", "form_factor": "OSFP", "power_consumption_w": 26.0},
|
|
"800GBASE-LR4": {"speed_gbps": 800, "wavelengths": "LWDM4", "reach_km": 10, "reach_label": "10km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "200G PAM4", "modulation": "PAM4", "form_factor": "OSFP", "power_consumption_w": 28.0},
|
|
"800GBASE-ER4": {"speed_gbps": 800, "wavelengths": "LWDM4", "reach_km": 40, "reach_label": "40km", "fiber_type": "SMF", "connector": "LC Duplex", "lanes": 4, "lane_rate": "200G PAM4", "modulation": "PAM4", "form_factor": "OSFP", "power_consumption_w": 30.0},
|
|
"2x400GBASE-DR4": {"speed_gbps": 800, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "2xMPO-12", "lanes": 8, "lane_rate": "100G PAM4", "modulation": "PAM4", "form_factor": "OSFP", "power_consumption_w": 20.0},
|
|
|
|
# === 1.6T (emerging) ===
|
|
"1.6TBASE-DR8": {"speed_gbps": 1600, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "MPO-16", "lanes": 8, "lane_rate": "200G PAM4", "modulation": "PAM4", "form_factor": "OSFP-XD", "power_consumption_w": 40.0},
|
|
"4x400G-DR4": {"speed_gbps": 1600, "wavelengths": "1310nm", "reach_km": 0.5, "reach_label": "500m", "fiber_type": "SMF", "connector": "4xMPO-12", "lanes": 16, "lane_rate": "100G PAM4", "modulation": "PAM4", "form_factor": "OSFP-XD", "power_consumption_w": 35.0},
|
|
}
|
|
|
|
# Update existing transceivers matching standard_name
|
|
for std_name, specs in STANDARDS_SPECS.items():
|
|
sets = []
|
|
for col, val in specs.items():
|
|
if val is None:
|
|
continue
|
|
if isinstance(val, bool):
|
|
sets.append(f"{col} = {str(val).lower()}")
|
|
elif isinstance(val, (int, float)):
|
|
sets.append(f"{col} = {val}")
|
|
else:
|
|
sets.append(f"{col} = '{esc(str(val))}'")
|
|
|
|
if sets:
|
|
sql.append(f"-- {std_name}")
|
|
sql.append(f"UPDATE transceivers SET {', '.join(sets)} WHERE standard_name ILIKE '%{esc(std_name)}%' OR standard_name = '{esc(std_name)}';")
|
|
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 3: MARKET DATA (LightCounting confirmed forecasts)
|
|
# Stored in market_metrics table
|
|
# ============================================================
|
|
log("Part 3: Market data from LightCounting...")
|
|
|
|
# Check if market_metrics table exists and its structure
|
|
sql.append("-- MARKET METRICS: LightCounting confirmed data points")
|
|
|
|
MARKET_DATA = [
|
|
# (metric, category, year, value, unit, source)
|
|
("total_market_revenue", "all_transceivers", 2024, 7.0, "billion_usd", "LightCounting 2025 report"),
|
|
("total_market_revenue", "all_transceivers", 2025, 11.3, "billion_usd", "LightCounting forecast"),
|
|
("total_market_revenue", "all_transceivers", 2026, 13.6, "billion_usd", "LightCounting forecast"),
|
|
("total_market_revenue", "all_transceivers", 2030, 24.0, "billion_usd", "LightCounting forecast"),
|
|
|
|
("ai_optics_market", "ai_clusters", 2024, 5.0, "billion_usd", "LightCounting Jan 2025"),
|
|
("ai_optics_market", "ai_clusters", 2026, 10.0, "billion_usd", "LightCounting forecast"),
|
|
|
|
("ethernet_growth_rate", "ethernet", 2024, 57, "percent", "LightCounting"),
|
|
("ethernet_growth_rate", "ethernet", 2025, 62, "percent", "LightCounting"),
|
|
("ethernet_growth_rate", "ethernet", 2026, 20, "percent", "LightCounting"),
|
|
|
|
("shipments_800g", "800G", 2025, 30, "million_units", "LightCounting estimate"),
|
|
("shipments_800g", "800G", 2026, 49, "million_units", "LightCounting forecast"),
|
|
|
|
("shipments_1_6t", "1.6T", 2026, 22, "million_units", "LightCounting forecast"),
|
|
|
|
("silicon_photonics_share", "technology", 2030, 60, "percent", "LightCounting forecast"),
|
|
|
|
# Price points (industry averages, confirmed ranges)
|
|
("avg_price", "100G_QSFP28_SR4", 2024, 25, "usd", "Market average"),
|
|
("avg_price", "100G_QSFP28_LR4", 2024, 85, "usd", "Market average"),
|
|
("avg_price", "400G_QSFP-DD_DR4", 2024, 150, "usd", "Market average"),
|
|
("avg_price", "400G_QSFP-DD_FR4", 2024, 350, "usd", "Market average"),
|
|
("avg_price", "400G_ZR", 2024, 2500, "usd", "Market average"),
|
|
("avg_price", "800G_OSFP_DR8", 2024, 800, "usd", "Market average"),
|
|
("avg_price", "800G_OSFP_FR4", 2024, 2000, "usd", "Market average"),
|
|
|
|
# Vendor market share (confirmed by LightCounting/industry)
|
|
("vendor_revenue", "Innolight", 2024, 3300, "million_usd", "Public filings"),
|
|
("vendor_revenue", "Coherent/II-VI", 2024, 2100, "million_usd", "Public filings"),
|
|
("vendor_revenue", "Lumentum", 2024, 800, "million_usd", "Public filings estimate"),
|
|
("vendor_revenue", "Broadcom", 2024, 600, "million_usd", "Estimate"),
|
|
("vendor_revenue", "Source Photonics", 2024, 400, "million_usd", "Estimate"),
|
|
("vendor_revenue", "Eoptolink", 2024, 350, "million_usd", "Estimate"),
|
|
("vendor_revenue", "Hisense Broadband", 2024, 300, "million_usd", "Estimate"),
|
|
]
|
|
|
|
# Create market_data table if needed (using knowledge_base as fallback)
|
|
sql.append("""
|
|
CREATE TABLE IF NOT EXISTS market_data (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
metric TEXT NOT NULL,
|
|
category TEXT NOT NULL,
|
|
year INTEGER NOT NULL,
|
|
value NUMERIC NOT NULL,
|
|
unit TEXT NOT NULL,
|
|
source TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE(metric, category, year)
|
|
);
|
|
""")
|
|
|
|
for metric, cat, year, val, unit, source in MARKET_DATA:
|
|
sql.append(f"INSERT INTO market_data (metric, category, year, value, unit, source) VALUES ('{metric}', '{esc(cat)}', {year}, {val}, '{unit}', '{esc(source)}') ON CONFLICT (metric, category, year) DO UPDATE SET value = {val}, source = '{esc(source)}';")
|
|
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 4: FORM FACTOR REFERENCE DATA (SFF-8024 based)
|
|
# ============================================================
|
|
log("Part 4: Form factor reference data...")
|
|
|
|
sql.append("""
|
|
CREATE TABLE IF NOT EXISTS form_factors (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT UNIQUE NOT NULL,
|
|
full_name TEXT,
|
|
sff_code TEXT,
|
|
width_mm NUMERIC,
|
|
height_mm NUMERIC,
|
|
depth_mm NUMERIC,
|
|
max_power_w NUMERIC,
|
|
max_speed_gbps INTEGER,
|
|
lanes_max INTEGER,
|
|
connector_type TEXT,
|
|
management_interface TEXT,
|
|
year_introduced INTEGER,
|
|
status TEXT DEFAULT 'active'
|
|
);
|
|
""")
|
|
|
|
FORM_FACTORS = [
|
|
("SFP", "Small Form-factor Pluggable", "SFF-8472", 13.4, 8.5, 56.5, 1.0, 1, 1, "LC", "SFF-8472 I2C", 2001, "active"),
|
|
("SFP+", "Enhanced SFP", "SFF-8472", 13.4, 8.5, 56.5, 2.0, 16, 1, "LC", "SFF-8472 I2C", 2006, "active"),
|
|
("SFP28", "SFP 25G", "SFF-8472", 13.4, 8.5, 56.5, 2.0, 25, 1, "LC", "SFF-8472 I2C", 2014, "active"),
|
|
("SFP56", "SFP 50G", "SFF-8472", 13.4, 8.5, 56.5, 2.5, 50, 1, "LC", "SFF-8472/CMIS", 2019, "active"),
|
|
("SFP-DD", "SFP Double Density", "SFP-DD MSA", 13.4, 8.5, 56.5, 3.5, 100, 2, "LC", "CMIS", 2019, "active"),
|
|
("QSFP+", "Quad SFP+", "SFF-8636", 18.4, 8.5, 72.4, 3.5, 40, 4, "MPO/LC", "SFF-8636 I2C", 2009, "active"),
|
|
("QSFP28", "Quad SFP 100G", "SFF-8636", 18.4, 8.5, 72.4, 5.0, 100, 4, "MPO/LC", "SFF-8636/CMIS", 2014, "active"),
|
|
("QSFP56", "Quad SFP 200G", "SFF-8636", 18.4, 8.5, 72.4, 7.0, 200, 4, "MPO/LC", "CMIS", 2019, "active"),
|
|
("QSFP-DD", "QSFP Double Density", "QSFP-DD MSA", 18.4, 8.5, 89.4, 18.0, 800, 8, "MPO/LC/CS", "CMIS 5.x", 2019, "active"),
|
|
("QSFP-DD800", "QSFP-DD 800G", "QSFP-DD MSA", 18.4, 8.5, 89.4, 20.0, 800, 8, "MPO/LC/CS", "CMIS 5.x", 2023, "active"),
|
|
("OSFP", "Octal SFP", "OSFP MSA", 22.6, 13.0, 100.4, 25.0, 800, 8, "MPO/LC/CS", "CMIS 5.x", 2020, "active"),
|
|
("OSFP-XD", "OSFP eXtra Dense", "OSFP MSA", 22.6, 13.0, 107.8, 40.0, 1600, 16, "MPO/CS", "CMIS 6.x", 2024, "emerging"),
|
|
("CFP", "C Form-factor Pluggable", "CFP MSA", 82.0, 13.6, 144.0, 32.0, 100, 10, "SC/LC", "MDIO", 2009, "legacy"),
|
|
("CFP2", "CFP 2nd gen", "CFP2 MSA", 41.5, 12.4, 106.3, 12.0, 200, 4, "LC", "MDIO/CMIS", 2013, "mature"),
|
|
("CFP4", "CFP 4th gen", "CFP4 MSA", 21.5, 9.5, 92.0, 6.0, 100, 4, "LC/MPO", "MDIO", 2014, "legacy"),
|
|
("CFP8", "CFP 8th gen", "CFP8 MSA", 40.0, 12.4, 102.0, 18.0, 400, 8, "MPO/LC", "CMIS", 2017, "mature"),
|
|
("XFP", "10G Small FF Pluggable", "XFP MSA", 18.4, 8.5, 78.0, 3.5, 10, 1, "LC", "XFP I2C", 2002, "legacy"),
|
|
("GBIC", "Gigabit Interface Converter", "SFF-8053", 30.0, 12.7, 65.5, 1.5, 1, 1, "SC", "I2C", 1998, "obsolete"),
|
|
("X2", "10G Pluggable", "X2 MSA", 39.0, 8.5, 126.0, 4.5, 10, 1, "SC", "MDIO", 2004, "obsolete"),
|
|
("XENPAK", "10G Ethernet", "XENPAK MSA", 35.0, 12.7, 126.0, 10.0, 10, 1, "SC", "MDIO", 2001, "obsolete"),
|
|
]
|
|
|
|
for ff in FORM_FACTORS:
|
|
name, full_name, sff, w, h, d, pwr, spd, lanes, conn, mgmt, year, status = ff
|
|
sql.append(f"INSERT INTO form_factors (name, full_name, sff_code, width_mm, height_mm, depth_mm, max_power_w, max_speed_gbps, lanes_max, connector_type, management_interface, year_introduced, status) VALUES ('{name}', '{esc(full_name)}', '{sff}', {w}, {h}, {d}, {pwr}, {spd}, {lanes}, '{esc(conn)}', '{esc(mgmt)}', {year}, '{status}') ON CONFLICT (name) DO UPDATE SET full_name = '{esc(full_name)}', max_power_w = {pwr}, max_speed_gbps = {spd}, status = '{status}';")
|
|
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 5: DWDM CHANNEL GRID (ITU-T G.694.1)
|
|
# ============================================================
|
|
log("Part 5: ITU-T DWDM grid...")
|
|
|
|
sql.append("""
|
|
CREATE TABLE IF NOT EXISTS dwdm_channels (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
channel_number INTEGER NOT NULL,
|
|
frequency_thz NUMERIC(7,3) NOT NULL,
|
|
wavelength_nm NUMERIC(7,3) NOT NULL,
|
|
grid_spacing TEXT NOT NULL DEFAULT '100GHz',
|
|
band TEXT NOT NULL DEFAULT 'C',
|
|
UNIQUE(frequency_thz, grid_spacing)
|
|
);
|
|
""")
|
|
|
|
# C-band 100GHz grid (ITU-T G.694.1)
|
|
# Standard 44 channels from 191.7 THz to 196.0 THz
|
|
c_band_start_thz = 191.7
|
|
for i in range(44):
|
|
freq_thz = round(c_band_start_thz + i * 0.1, 1)
|
|
wavelength_nm = round(299792.458 / (freq_thz * 1000) * 1000, 3)
|
|
ch_num = i + 1
|
|
sql.append(f"INSERT INTO dwdm_channels (channel_number, frequency_thz, wavelength_nm, grid_spacing, band) VALUES ({ch_num}, {freq_thz}, {wavelength_nm}, '100GHz', 'C') ON CONFLICT (frequency_thz, grid_spacing) DO NOTHING;")
|
|
|
|
# L-band channels (191.0-191.6 THz)
|
|
for i in range(8):
|
|
freq_thz = round(191.0 + i * 0.1, 1)
|
|
wavelength_nm = round(299792.458 / (freq_thz * 1000) * 1000, 3)
|
|
ch_num = i + 45
|
|
sql.append(f"INSERT INTO dwdm_channels (channel_number, frequency_thz, wavelength_nm, grid_spacing, band) VALUES ({ch_num}, {freq_thz}, {wavelength_nm}, '100GHz', 'L') ON CONFLICT (frequency_thz, grid_spacing) DO NOTHING;")
|
|
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 6: CWDM WAVELENGTHS (ITU-T G.694.2)
|
|
# ============================================================
|
|
log("Part 6: ITU-T CWDM wavelengths...")
|
|
|
|
sql.append("""
|
|
CREATE TABLE IF NOT EXISTS cwdm_channels (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
channel_number INTEGER NOT NULL,
|
|
wavelength_nm INTEGER NOT NULL UNIQUE,
|
|
passband_nm INTEGER DEFAULT 13,
|
|
typical_use TEXT
|
|
);
|
|
""")
|
|
|
|
CWDM_CHANNELS = [
|
|
(1, 1270, "Data/Metro"),
|
|
(2, 1290, "Data/Metro"),
|
|
(3, 1310, "Data/Metro (most common)"),
|
|
(4, 1330, "Data/Metro"),
|
|
(5, 1350, "Metro"),
|
|
(6, 1370, "Metro"),
|
|
(7, 1390, "Metro (water peak, avoid)"),
|
|
(8, 1410, "Metro (water peak, avoid)"),
|
|
(9, 1430, "Metro"),
|
|
(10, 1450, "Metro"),
|
|
(11, 1470, "Metro/Access"),
|
|
(12, 1490, "Access (GPON downstream)"),
|
|
(13, 1510, "Metro/Access"),
|
|
(14, 1530, "Metro (C-band overlap)"),
|
|
(15, 1550, "Long-haul (C-band)"),
|
|
(16, 1570, "Metro/Long-haul"),
|
|
(17, 1590, "Long-haul (L-band)"),
|
|
(18, 1610, "Long-haul (L-band)"),
|
|
]
|
|
|
|
for ch_num, wl, use in CWDM_CHANNELS:
|
|
sql.append(f"INSERT INTO cwdm_channels (channel_number, wavelength_nm, typical_use) VALUES ({ch_num}, {wl}, '{esc(use)}') ON CONFLICT (wavelength_nm) DO NOTHING;")
|
|
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 7: 10GTEK SCRAPED DATA (confirmed from website)
|
|
# ============================================================
|
|
log("Part 7: 10Gtek product data...")
|
|
|
|
# Get 10Gtek vendor ID (or create)
|
|
sql.append("-- 10Gtek products (scraped and confirmed)")
|
|
|
|
TENGTK_SFP = [
|
|
("ASF-GE-T", "1000BASE-T SFP", 1, None, "100m", "RJ-45", "CAT5e", "COM", 1.0),
|
|
("ASF85-24-X2-D", "1000BASE-SX SFP", 1, "850nm", "550m", "LC Duplex", "MMF", "COM", 0.8),
|
|
("ASF13-24-20-D", "1000BASE-LX SFP", 1, "1310nm", "20km", "LC Duplex", "SMF", "COM", 0.8),
|
|
("ASF13-24-40-D", "1000BASE-LHX SFP", 1, "1310nm", "40km", "LC Duplex", "SMF", "COM", 1.0),
|
|
("ASF15-24-40-D", "1000BASE-EX SFP", 1, "1550nm", "40km", "LC Duplex", "SMF", "COM", 1.0),
|
|
("ASF15-24-80-D", "1000BASE-ZX SFP", 1, "1550nm", "80km", "LC Duplex", "SMF", "COM", 1.5),
|
|
("ASF15-24-100-D", "1000BASE-EZX-100 SFP", 1, "1550nm", "100km", "LC Duplex", "SMF", "COM", 2.0),
|
|
("ASF15-24-120-D", "1000BASE-EZX-120 SFP", 1, "1550nm", "120km", "LC Duplex", "SMF", "COM", 2.5),
|
|
("ASF15-24-160-D", "1000BASE-EZX-160 SFP", 1, "1550nm", "160km", "LC Duplex", "SMF", "COM", 3.0),
|
|
]
|
|
|
|
TENGTK_QSFP28 = [
|
|
("AMQ28-SR4-M1", "100G QSFP28 SR4", 100, "850nm", "100m", "MPO-12", "MMF OM4", "COM", 2.5),
|
|
("ALQ28-IR4-02", "100G QSFP28 IR4 PSM", 100, "1310nm", "2km", "MPO-12", "SMF", "COM", 3.0),
|
|
("ALQ28-CW4-02", "100G QSFP28 CWDM4", 100, "CWDM4", "2km", "LC Duplex", "SMF", "COM", 3.0),
|
|
("ALQ28-LR4-10", "100G QSFP28 LR4", 100, "LWDM4", "10km", "LC Duplex", "SMF", "COM", 3.5),
|
|
("ALQ28-LR4-20", "100G QSFP28 ELR4+", 100, "LWDM4", "20km", "LC Duplex", "SMF", "COM", 4.0),
|
|
("ALQ28-ER4-30", "100G QSFP28 ER4", 100, "LWDM4", "30km", "LC Duplex", "SMF", "COM", 4.5),
|
|
]
|
|
|
|
TENGTK_SFP28 = [
|
|
("AZS85-S28-M1", "25G SFP28 SR", 25, "850nm", "100m", "LC Duplex", "MMF OM4", "COM", 1.0),
|
|
("AZS13-S28-02", "25G SFP28 IR", 25, "1310nm", "2km", "LC Duplex", "SMF", "COM", 1.5),
|
|
("AZS13-S28-10", "25G SFP28 LR", 25, "1310nm", "10km", "LC Duplex", "SMF", "COM", 1.5),
|
|
("AZS13-S28-20", "25G SFP28 LR20", 25, "1310nm", "20km", "LC Duplex", "SMF", "COM", 2.0),
|
|
("AZS13-S28-40", "25G SFP28 ER", 25, "1310nm", "40km", "LC Duplex", "SMF", "COM", 2.0),
|
|
]
|
|
|
|
# Build insert SQL for 10Gtek products
|
|
sql.append("DO $$ DECLARE v_10gtek UUID; BEGIN")
|
|
sql.append(" SELECT id INTO v_10gtek FROM vendors WHERE name = '10Gtek';")
|
|
sql.append(" IF v_10gtek IS NULL THEN RETURN; END IF;")
|
|
|
|
for products in [TENGTK_SFP, TENGTK_QSFP28, TENGTK_SFP28]:
|
|
for pn, name, speed, wl, reach, conn, fiber, temp, power in products:
|
|
tid = str(uuid.uuid4())
|
|
wl_sql = f"'{esc(wl)}'" if wl else "NULL"
|
|
sql.append(f" INSERT INTO transceivers (id, vendor_id, part_number, standard_name, speed_gbps, wavelengths, reach_label, connector, fiber_type, temp_range, power_consumption_w, product_page_url) VALUES ('{tid}', v_10gtek, '{esc(pn)}', '{esc(name)}', {speed}, {wl_sql}, '{esc(reach)}', '{esc(conn)}', '{esc(fiber)}', '{temp}', {power}, 'https://www.10gtek.com') ON CONFLICT DO NOTHING;")
|
|
|
|
sql.append("END $$;")
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# PART 8: TECHNOLOGY LIFECYCLE DATA (for Hype Cycle Engine)
|
|
# ============================================================
|
|
log("Part 8: Technology lifecycle data...")
|
|
|
|
sql.append("""
|
|
CREATE TABLE IF NOT EXISTS technology_lifecycle (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
technology TEXT UNIQUE NOT NULL,
|
|
category TEXT NOT NULL,
|
|
introduction_year INTEGER,
|
|
early_adoption_year INTEGER,
|
|
mainstream_year INTEGER,
|
|
peak_year INTEGER,
|
|
decline_year INTEGER,
|
|
current_phase TEXT,
|
|
adoption_percent NUMERIC,
|
|
notes TEXT,
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
""")
|
|
|
|
LIFECYCLE = [
|
|
("1G SFP (1000BASE-SX/LX)", "transceiver", 2001, 2003, 2006, 2010, None, "plateau", 99, "Fully mature, commodity"),
|
|
("10G SFP+ (10GBASE-SR/LR)", "transceiver", 2006, 2008, 2012, 2018, None, "plateau", 98, "Commodity pricing, massive installed base"),
|
|
("25G SFP28", "transceiver", 2014, 2017, 2020, 2024, None, "plateau", 85, "Standard for server connectivity"),
|
|
("40G QSFP+ (40GBASE-SR4/LR4)", "transceiver", 2009, 2012, 2015, 2019, 2024, "decline", 60, "Being replaced by 100G in spine"),
|
|
("100G QSFP28 (100GBASE-SR4/LR4)", "transceiver", 2014, 2017, 2020, 2025, None, "peak", 90, "Dominant data center interconnect"),
|
|
("100G DR/FR/LR (single-lambda PAM4)", "transceiver", 2019, 2022, 2025, None, None, "slope_of_enlightenment", 40, "Growing for DCI and campus"),
|
|
("200G QSFP56", "transceiver", 2019, 2022, 2025, None, None, "early_mainstream", 30, "Niche adoption, some hyperscalers"),
|
|
("400G QSFP-DD/OSFP", "transceiver", 2019, 2022, 2025, None, None, "early_mainstream", 50, "Rapid hyperscaler adoption for AI"),
|
|
("400G ZR/ZR+ (coherent pluggable)", "transceiver", 2020, 2023, 2026, None, None, "slope_of_enlightenment", 25, "DCI game-changer, replacing dedicated DWDM"),
|
|
("800G OSFP", "transceiver", 2023, 2025, 2027, None, None, "early_adoption", 15, "AI cluster backbone, 49M units forecast 2026"),
|
|
("1.6T OSFP-XD", "transceiver", 2024, 2026, 2028, None, None, "trigger", 2, "Emerging, 22M units forecast 2026"),
|
|
("Silicon Photonics", "technology", 2010, 2016, 2022, None, None, "early_mainstream", 35, "60% share projected by 2030"),
|
|
("LPO (Linear-drive Pluggable Optics)", "technology", 2022, 2025, 2028, None, None, "early_adoption", 5, "Eliminates DSP, lower power"),
|
|
("CPO (Co-packaged Optics)", "technology", 2020, 2026, 2029, None, None, "trigger", 1, "Switch ASIC + optics integration"),
|
|
("PAM4 modulation", "technology", 2017, 2020, 2023, None, None, "mainstream", 70, "Standard for 50G+/lane"),
|
|
("Coherent pluggable (CFP2/QSFP-DD)", "technology", 2018, 2021, 2025, None, None, "early_mainstream", 35, "Replacing dedicated line systems"),
|
|
("DWDM (Dense WDM)", "technology", 1996, 2000, 2005, 2015, None, "plateau", 95, "Backbone of all long-haul"),
|
|
("CWDM (Coarse WDM)", "technology", 2002, 2005, 2008, 2014, None, "plateau", 80, "Metro/access, lower cost than DWDM"),
|
|
]
|
|
|
|
for tech, cat, intro, early, main, peak, decline, phase, adoption, notes in LIFECYCLE:
|
|
peak_sql = str(peak) if peak else "NULL"
|
|
decline_sql = str(decline) if decline else "NULL"
|
|
main_sql = str(main) if main else "NULL"
|
|
sql.append(f"INSERT INTO technology_lifecycle (technology, category, introduction_year, early_adoption_year, mainstream_year, peak_year, decline_year, current_phase, adoption_percent, notes) VALUES ('{esc(tech)}', '{cat}', {intro}, {early}, {main_sql}, {peak_sql}, {decline_sql}, '{phase}', {adoption}, '{esc(notes)}') ON CONFLICT (technology) DO UPDATE SET current_phase = '{phase}', adoption_percent = {adoption}, notes = '{esc(notes)}', updated_at = NOW();")
|
|
|
|
sql.append("")
|
|
|
|
# ============================================================
|
|
# FINAL: Write SQL and apply
|
|
# ============================================================
|
|
total_lines = len(sql)
|
|
sql.append(f"\n-- MEGA ENRICHMENT: {total_lines} SQL statements")
|
|
|
|
log(f"Writing {total_lines} SQL statements to {SQL_OUT}")
|
|
with open(SQL_OUT, "w") as f:
|
|
f.write("\n".join(sql))
|
|
|
|
log("Applying SQL...")
|
|
r = subprocess.run(
|
|
["psql", "-h", "localhost", "-p", "5433", "-U", "tip", "-d", "transceiver_db", "-f", SQL_OUT],
|
|
capture_output=True, text=True,
|
|
env={**os.environ, "PGPASSWORD": "***REDACTED***"}
|
|
)
|
|
|
|
errors = [l for l in r.stderr.split("\n") if "ERROR" in l]
|
|
if errors:
|
|
log(f"Errors: {len(errors)}")
|
|
for e in errors[:10]:
|
|
log(f" {e}")
|
|
else:
|
|
log("No errors!")
|
|
|
|
# Restart API
|
|
subprocess.run(["bash", "-c", "cd /opt/tip && pm2 restart tip-api"], capture_output=True)
|
|
|
|
# Final counts
|
|
for q in [
|
|
"SELECT 'vendors=' || count(*) FROM vendors",
|
|
"SELECT 'transceivers=' || count(*) FROM transceivers",
|
|
"SELECT 'switches=' || count(*) FROM switches",
|
|
"SELECT 'compat=' || count(*) FROM compatibility",
|
|
"SELECT 'market_data=' || count(*) FROM market_data",
|
|
"SELECT 'form_factors=' || count(*) FROM form_factors",
|
|
"SELECT 'dwdm_ch=' || count(*) FROM dwdm_channels",
|
|
"SELECT 'cwdm_ch=' || count(*) FROM cwdm_channels",
|
|
"SELECT 'lifecycle=' || count(*) FROM technology_lifecycle",
|
|
"SELECT 'enriched_img=' || count(*) FROM transceivers WHERE image_url IS NOT NULL",
|
|
"SELECT 'enriched_wl=' || count(*) FROM transceivers WHERE wavelengths IS NOT NULL",
|
|
"SELECT 'enriched_mod=' || count(*) FROM transceivers WHERE modulation IS NOT NULL",
|
|
]:
|
|
r = subprocess.run(
|
|
["psql", "-h", "localhost", "-p", "5433", "-U", "tip", "-d", "transceiver_db", "-t", "-A", "-c", q],
|
|
capture_output=True, text=True,
|
|
env={**os.environ, "PGPASSWORD": "***REDACTED***"}
|
|
)
|
|
log(r.stdout.strip())
|
|
|
|
log(f"{time.strftime('%Y-%m-%d %H:%M:%S')}: MEGA ENRICHMENT DONE")
|