{
  "sites": {
    "2900MC": {
      "name": "Vantage QC2",
      "city": "Saint-Laurent",
      "address": "2900 Av. Marie Curie, Saint-Laurent, QC H4S 2C2",
      "type": "datacenter",
      "lat": 45.5017, "lng": -73.6673,
      "devices": [
        { "hostname": "R1.2900", "type": "router", "make": "Edgecore", "model": "AS5916-XKS", "ip": "23.159.240.63", "os": "OcNOS", "role": "core-bgp" }
      ]
    },
    "800SQV": {
      "name": "eStruxture MTL1",
      "city": "Montréal",
      "address": "800 Rue du Square-Victoria, Montréal, QC H4Z 1B7",
      "type": "datacenter",
      "lat": 45.5000, "lng": -73.5613,
      "devices": [
        { "hostname": "R1.800", "type": "router", "make": "Edgecore", "model": "AS5916-XKS", "ip": "23.159.240.62", "os": "OcNOS", "role": "core-bgp" },
        { "hostname": "SW1.800", "type": "switch-l3", "make": "Raisecom", "model": "ISCOM 3048X-4Q", "ip": "10.100.0.4", "role": "aggregation" }
      ]
    },
    "1250RL": {
      "name": "Cologix MTL3",
      "city": "Montréal",
      "address": "250 Boul. René-Lévesque O, Montréal, QC H3B 4W8",
      "type": "datacenter",
      "lat": 45.5025, "lng": -73.5685,
      "devices": [
        { "hostname": "R1.1250", "type": "router", "make": "Edgecore", "model": "AS5916-XKS", "ip": "23.159.240.61", "os": "OcNOS", "role": "core-bgp" }
      ]
    },
    "RemEdge": {
      "name": "St-Rémi",
      "city": "Saint-Rémi",
      "address": "104 rue de la Gare, Saint-Rémi, QC J0L 2L0",
      "type": "pop",
      "lat": 45.2643, "lng": -73.6156,
      "devices": [
        { "hostname": "R1.Remi", "type": "router", "make": "Edgecore", "model": "AS5916-XKS", "ip": "23.159.240.0", "os": "OcNOS", "role": "edge-bgp" },
        { "hostname": "oltRem01", "type": "olt", "make": "TP-Link", "ip": "172.17.192.4", "role": "gpon" },
        { "hostname": "oltRem02", "type": "olt", "make": "TP-Link", "ip": "172.17.192.5", "role": "gpon" },
        { "hostname": "oltRem03", "type": "olt", "make": "TP-Link XGSPON", "ip": "172.17.192.6", "role": "gpon" },
        { "hostname": "oltRem04", "type": "olt", "make": "TP-Link", "ip": "172.17.192.7", "role": "gpon" }
      ]
    },
    "Boisee": {
      "name": "Boisé / Ste-Clotilde",
      "city": "Sainte-Clotilde",
      "address": "1 rue des colibris, Sainte-Clotilde, QC J0L 1W0",
      "type": "pop",
      "lat": 45.1486, "lng": -73.6790,
      "devices": [
        { "hostname": "UFIBoisee", "type": "router", "make": "Ufispace", "model": "S9501-18SMT", "ip": "23.159.240.20", "os": "OcNOS", "role": "edge-bgp" },
        { "hostname": "SW1.BureauServ", "type": "switch-l3", "make": "Raisecom", "model": "ISCOM 3048X-4Q", "ip": "172.17.0.9", "role": "aggregation" },
        { "hostname": "oltClotBoise", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.0.4", "role": "gpon" },
        { "hostname": "oltBoiseeTpLink01", "type": "olt", "make": "TP-Link", "ip": "172.17.0.6", "role": "gpon" },
        { "hostname": "oltBoiseeTpLink02", "type": "olt", "make": "TP-Link", "ip": "172.17.0.7", "role": "gpon" }
      ]
    },
    "MichPigeon": {
      "name": "Saint-Michel",
      "city": "Saint-Michel",
      "address": "Pigeon / Principale",
      "type": "pop",
      "lat": 45.2327, "lng": -73.5594,
      "devices": [
        { "hostname": "UFI.StMichel", "type": "router", "make": "Ufispace", "model": "S9500-30XS", "ip": "23.159.240.40", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "SW1.Mich", "type": "switch-l3", "make": "Raisecom", "model": "ISCOM 3048X-4Q", "ip": "10.0.0.50", "role": "aggregation" }
      ]
    },
    "CloJune": {
      "name": "June / Grand Rang",
      "city": "Sainte-Clotilde",
      "address": "Grand Rang / Hope Clo",
      "type": "pop",
      "lat": 45.1318, "lng": -73.7153,
      "devices": [
        { "hostname": "UFI.June", "type": "router", "make": "Ufispace", "model": "S9500-30XS", "ip": "23.159.240.41", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "SW1.June", "type": "switch-l3", "make": "Raisecom", "model": "ISCOM 3048X-4Q", "ip": "10.0.1.70", "role": "aggregation" }
      ]
    },
    "OrmsMuni": {
      "name": "Ormstown",
      "city": "Ormstown",
      "address": "5 Rue Gale, Ormstown, QC J0S 1K0",
      "type": "pop",
      "lat": 45.1290, "lng": -73.9092,
      "devices": [
        { "hostname": "UFI.Ormstown", "type": "router", "make": "Ufispace", "model": "S9500-30XS", "ip": "23.159.240.48", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "SW1.Orms", "type": "switch-l3", "make": "Raisecom", "model": "ISCOM 3048X-4Q", "ip": "10.0.0.121", "role": "aggregation" },
        { "hostname": "oltOrmsMuni", "type": "olt", "make": "TP-Link", "ip": "172.17.128.4", "role": "gpon" },
        { "hostname": "oltOrmsMuni02", "type": "olt", "make": "TP-Link", "ip": "172.17.128.5", "role": "gpon" }
      ]
    },
    "BarbCoop": {
      "name": "Sainte-Barbe",
      "city": "Sainte-Barbe",
      "address": "63 Montée du Lac, Sainte-Barbe, QC J0S 1P0",
      "type": "pop",
      "lat": 45.1669, "lng": -74.1933,
      "devices": [
        { "hostname": "R1.Barb", "type": "router", "make": "Ufispace", "model": "S9500-30XS-P", "ip": "23.159.240.60", "os": "OcNOS", "role": "edge-bgp" },
        { "hostname": "oltBarbe01", "type": "olt", "make": "TP-Link", "ip": "172.17.176.4", "role": "gpon" },
        { "hostname": "oltBarbe02", "type": "olt", "make": "TP-Link", "ip": "172.17.176.5", "role": "gpon" },
        { "hostname": "oltBarbe03", "type": "olt", "make": "TP-Link", "ip": "172.17.176.6", "role": "gpon" },
        { "hostname": "oltBarbe04", "type": "olt", "make": "TP-Link", "ip": "172.17.176.7", "role": "gpon" }
      ]
    },
    "AnicetBiblio": {
      "name": "Saint-Anicet",
      "city": "Saint-Anicet",
      "address": "1555 Route 132, Saint-Anicet, QC J0S 1M0",
      "type": "pop",
      "lat": 45.1269, "lng": -74.3430,
      "devices": [
        { "hostname": "R1.AniBiblio", "type": "router", "make": "Ufispace", "model": "S9500-22XST", "ip": "23.159.240.59", "os": "OcNOS", "role": "edge-bgp" },
        { "hostname": "SW1.Anic", "type": "switch-l3", "make": "Raisecom", "model": "ISCOM 3048X-4Q", "ip": "172.17.16.1", "role": "aggregation" },
        { "hostname": "oltAnicetBiblio", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.16.2", "role": "gpon" }
      ]
    },
    "DundeeMuni": {
      "name": "Dundee / Ste-Agnès",
      "city": "Dundee",
      "address": "3307 Montée Smallman, Dundee, QC J0S 1L0",
      "type": "pop",
      "lat": 45.0634, "lng": -74.4308,
      "devices": [
        { "hostname": "UFI.Dundee", "type": "router", "make": "Ufispace", "model": "S9501-18SMT", "ip": "23.159.240.53", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "oltAgnes", "type": "olt", "make": "TP-Link", "ip": "172.17.144.2", "role": "gpon" }
      ]
    },
    "HemWitsend": {
      "name": "Hemmingford",
      "city": "Hemmingford",
      "address": "490 Rue Frontière, Hemmingford, QC J0L 1H0",
      "type": "pop",
      "lat": 45.0614, "lng": -73.5964,
      "devices": [
        { "hostname": "UFI.Hemm", "type": "router", "make": "Ufispace", "model": "S9501-18SMT", "ip": "23.159.240.50", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "SW1.Hemm", "type": "switch-l3", "make": "Raisecom", "model": "ISCOM 3048X-4Q", "ip": "172.17.47.253", "role": "aggregation" },
        { "hostname": "oltHemmWitsend", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.32.2", "role": "gpon" }
      ]
    },
    "SherVegco": {
      "name": "Sherrington",
      "city": "Saint-Patrice-de-Sherrington",
      "address": "279 Rue Saint-Patrice, Saint-Patrice-de-Sherrington, QC J0L 1N0",
      "type": "pop",
      "lat": 45.1753, "lng": -73.5189,
      "devices": [
        { "hostname": "UFI.Sherrington", "type": "router", "make": "Ufispace", "model": "S9501-18SMT", "ip": "23.159.240.44", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "oltSherVegco", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.80.2", "role": "gpon" }
      ]
    },
    "BernCaserne": {
      "name": "Saint-Bernard-de-Lacolle",
      "city": "Saint-Bernard-de-Lacolle",
      "address": "139 Rang Saint-André, Saint-Bernard-de-Lacolle, QC J0J 1V0",
      "type": "pop",
      "lat": 45.0872, "lng": -73.4208,
      "devices": [
        { "hostname": "UFI.BernCaserne", "type": "router", "make": "Ufispace", "model": "S9501-18SMT", "ip": "23.159.240.43", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "oltBernCasern", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.96.2", "role": "gpon" }
      ]
    },
    "StLouis": {
      "name": "Saint-Louis-de-Gonzague",
      "city": "Saint-Louis-de-Gonzague",
      "address": "2855 Chemin d'Athelstan, Hinchinbrooke, QC J0S 1A0",
      "type": "pop",
      "lat": 45.1543, "lng": -73.9870,
      "devices": [
        { "hostname": "oltStLouisMuni", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.112.2", "role": "gpon" }
      ]
    },
    "HaveMuni": {
      "name": "Havelock",
      "city": "Havelock",
      "address": "481 Route 203, Havelock, QC J0S 2C0",
      "type": "pop",
      "lat": 45.0967, "lng": -73.7808,
      "devices": [
        { "hostname": "UFI.Havelock", "type": "router", "make": "Ufispace", "model": "S9500-30XS", "ip": "23.159.240.42", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "oltHaveMuni", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.64.2", "role": "gpon" }
      ]
    },
    "AthelCaserne": {
      "name": "Athelstan",
      "city": "Hinchinbrooke",
      "address": "2848 Chemin d'Athelstan, Hinchinbrooke, QC J0S 1A0",
      "type": "pop",
      "lat": 45.0640, "lng": -74.0525,
      "devices": [
        { "hostname": "R1.Athel", "type": "router", "make": "Ufispace", "model": "S9500-30XS-P", "ip": "23.159.240.52", "os": "OcNOS", "role": "edge-bgp" },
        { "hostname": "oltAtheCaserne", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.48.4", "role": "gpon" }
      ]
    },
    "AntoPins": {
      "name": "Lac des Pins / Franklin",
      "city": "Franklin",
      "address": "3615 Route 201, Franklin, QC J0S 1N0",
      "type": "pop",
      "lat": 45.0912, "lng": -73.9155,
      "devices": [
        { "hostname": "R1.AntoPins", "type": "router", "make": "Ufispace", "model": "S9500-30XS-P", "ip": "23.159.240.55", "os": "OcNOS", "role": "edge-bgp" },
        { "hostname": "oltAntoLacdesPins", "type": "olt", "make": "Raisecom", "model": "ISCOM 6800", "ip": "172.17.48.2", "role": "gpon" }
      ]
    },
    "ChrysTherese": {
      "name": "Saint-Chrysostome",
      "city": "Saint-Chrysostome",
      "address": "Saint-Chrysostome",
      "type": "pop",
      "lat": 45.1003, "lng": -73.8130,
      "devices": [
        { "hostname": "R1.ChrysTherese", "type": "router", "make": "Ufispace", "model": "S9500-22XST", "ip": "23.159.240.51", "os": "OcNOS", "role": "edge-bgp" },
        { "hostname": "olt1.Chrys", "type": "olt", "make": "TP-Link XGSPON", "ip": "172.17.224.4", "role": "gpon" }
      ]
    },
    "HuntDalousie": {
      "name": "Huntingdon",
      "city": "Huntingdon",
      "address": "78 Rue Dalhousie, Huntingdon, QC J0S 1H0",
      "type": "pop",
      "lat": 45.0800, "lng": -74.1680,
      "devices": [
        { "hostname": "UFI.Huntingdon", "type": "router", "make": "Ufispace", "model": "S9500-30XS", "ip": "23.159.240.45", "os": "OcNOS", "role": "edge-bgp", "status": "planned" },
        { "hostname": "oltHunt01", "type": "olt", "make": "TP-Link", "ip": "172.17.160.2", "role": "gpon" },
        { "hostname": "oltHunt02", "type": "olt", "make": "TP-Link", "ip": "172.17.160.5", "role": "gpon" },
        { "hostname": "oltHunt03", "type": "olt", "make": "TP-Link", "ip": "172.17.160.6", "role": "gpon" }
      ]
    }
  },

  "links": [
    { "id": "L01", "from": "2900MC", "to": "800SQV", "type": "dwdm", "distance_km": 26, "speed_gbps": 100, "fibers": 2, "note": "MUX/DEMUX" },
    { "id": "L02", "from": "800SQV", "to": "1250RL", "type": "fiber", "distance_km": 2, "speed_gbps": 100 },
    { "id": "L03", "from": "800SQV", "to": "RemEdge", "type": "fiber", "distance_km": 53, "speed_gbps": 100, "note": "via stop Isidore, excl prolongation CSSDGS" },
    { "id": "L04", "from": "BarbCoop", "to": "2900MC", "type": "dwdm", "distance_km": 82, "speed_gbps": 100, "note": "MUX/DEMUX + OADM(1)" },
    { "id": "L05", "from": "1250RL", "to": "MichPigeon", "type": "fiber", "distance_km": 52, "speed_gbps": 100 },
    { "id": "L06", "from": "MichPigeon", "to": "RemEdge", "type": "fiber", "distance_km": 6, "speed_gbps": 100 },
    { "id": "L07", "from": "MichPigeon", "to": "SherVegco", "type": "fiber", "distance_km": null, "speed_gbps": 20, "note": "2x10G" },
    { "id": "L08", "from": "SherVegco", "to": "BernCaserne", "type": "fiber", "distance_km": null, "speed_gbps": 20, "note": "2x10G — dorsale problématique" },
    { "id": "L09", "from": "SherVegco", "to": "HemWitsend", "type": "fiber", "distance_km": 28, "speed_gbps": 20, "note": "2x10G" },
    { "id": "L10", "from": "BernCaserne", "to": "HemWitsend", "type": "fiber", "distance_km": 15, "speed_gbps": 20, "note": "2x10G" },
    { "id": "L11", "from": "RemEdge", "to": "CloJune", "type": "fiber", "distance_km": 12, "speed_gbps": 100 },
    { "id": "L12", "from": "CloJune", "to": "OrmsMuni", "type": "fiber", "distance_km": 40, "speed_gbps": 100 },
    { "id": "L13", "from": "OrmsMuni", "to": "BarbCoop", "type": "fiber", "distance_km": 26, "speed_gbps": 100 },
    { "id": "L14", "from": "BarbCoop", "to": "AnicetBiblio", "type": "fiber", "distance_km": 17, "speed_gbps": 25, "fibers": 2 },
    { "id": "L15", "from": "AnicetBiblio", "to": "DundeeMuni", "type": "fiber", "distance_km": 37, "speed_gbps": 10, "fibers": 2 },
    { "id": "L16", "from": "HemWitsend", "to": "Boisee", "type": "fiber", "distance_km": 19 },
    { "id": "L17", "from": "HaveMuni", "to": "ChrysTherese", "type": "fiber" },
    { "id": "L18", "from": "ChrysTherese", "to": "CloJune", "type": "fiber" },
    { "id": "L19", "from": "HaveMuni", "to": "AntoPins", "type": "fiber" },
    { "id": "L20", "from": "AntoPins", "to": "OrmsMuni", "type": "fiber" },
    { "id": "L21", "from": "AntoPins", "to": "AthelCaserne", "type": "fiber" },
    { "id": "L22", "from": "AthelCaserne", "to": "DundeeMuni", "type": "fiber" },
    { "id": "L23", "from": "HuntDalousie", "to": "AthelCaserne", "type": "fiber" },
    { "id": "L24", "from": "HuntDalousie", "to": "BarbCoop", "type": "fiber", "note": "OADM" },
    { "id": "L25", "from": "HuntDalousie", "to": "OrmsMuni", "type": "fiber", "note": "OADM" },
    { "id": "L26", "from": "DundeeMuni", "to": "AnicetBiblio", "type": "fiber", "distance_km": 37, "speed_gbps": 10, "fibers": 2, "note": "return path" },
    { "id": "L27", "from": "RemEdge", "to": "Boisee", "type": "fiber" },
    { "id": "L28", "from": "StLouis", "to": "BarbCoop", "type": "fiber" },
    { "id": "L29", "from": "HemWitsend", "to": "HaveMuni", "type": "fiber" }
  ],

  "rings": [
    {
      "name": "Anneau MTL ↔ Ouest",
      "description": "Ring principal 100G: MTL → St-Rémi → June → Ormstown → Barbe → MTL",
      "path": ["800SQV", "RemEdge", "CloJune", "OrmsMuni", "BarbCoop", "2900MC", "800SQV"],
      "speed_gbps": 100
    },
    {
      "name": "Anneau MTL ↔ Sud",
      "description": "Ring secondaire via Cologix et Saint-Michel",
      "path": ["800SQV", "1250RL", "MichPigeon", "RemEdge", "800SQV"],
      "speed_gbps": 100
    },
    {
      "name": "Triangle Sud",
      "description": "Sherrington — St-Bernard — Hemmingford (2x10G)",
      "path": ["SherVegco", "BernCaserne", "HemWitsend", "SherVegco"],
      "speed_gbps": 20
    }
  ],

  "cabinets": {
    "CAB_Anicet": "1555 Route 132, Saint-Anicet, QC J0S 1M0",
    "CAB_Anto": "3615 Route 201, Franklin, QC J0S 1N0",
    "CAB_Athe": "2848 Chemin d'Athelstan, Hinchinbrooke, QC J0S 1A0",
    "CAB_Barbe": "63 Montée du Lac, Sainte-Barbe, QC J0S 1P0",
    "CAB_Bern": "139 Rang Saint-André, Saint-Bernard-de-Lacolle, QC J0J 1V0",
    "CAB_Boisé": "1 rue des colibris, Sainte-Clotilde, QC J0L 1W0",
    "CAB_Dundee": "3307 Montée Smallman, Dundee, QC J0S 1L0",
    "CAB_Have": "481 Route 203, Havelock, QC J0S 2C0",
    "CAB_Hemm": "490 Rue Frontière, Hemmingford, QC J0L 1H0",
    "CAB_Hunt": "78 Rue Dalhousie, Huntingdon, QC J0S 1H0",
    "CAB_Orms": "5 Rue Gale, Ormstown, QC J0S 1K0",
    "CAB_Rem": "104 rue de la Gare, Saint-Rémi, QC J0L 2L0",
    "CAB_Sher": "279 Rue Saint-Patrice, Saint-Patrice-de-Sherrington, QC J0L 1N0",
    "CAB_St-Louis": "2855 Chemin d'Athelstan, Hinchinbrooke, QC J0S 1A0"
  }
}
