netbox-osp v0.2.0 — inter-rack fibre infrastructure
The "inter-rack" release. Five PRs adding MPO/MTP trunks with breakouts, one-click harness deploy, a cassette device-type catalogue, and an end-to-end visual core tracer.
What's new
FibreTrunkmodel captures a multi-fibre rack-to-rack physical trunk (MPO/MTP 12/24/72-fibre, Ribbon 144-fibre, loose-tube)TrunkBreakoutthrough-table bridges to NetBox's nativedcim.Cable, so "24F MTP → 12F to rack A + 12F to rack B" is one cohesive entity instead of two disconnected cables- Fibre-range non-overlap + parent-fibre-count overflow enforced in
clean()(field-keyed errors) fibres_used/fibres_remaining/fibres_utilization_pctcomputed properties- REST + GraphQL surface; admin list / detail / edit / delete / bulk-edit / bulk-import; CSV import keyed by
trunk_cid+cable_label - "Import from cables" wizard at
/plugins/osp/trunks/<id>/import-cables/— atomic bind of unbounddcim.Cables to fibre ranges
MTP harness one-click deploy (#12)
- One form at
/plugins/osp/trunks/deploy-harness/atomically creates:FibreTrunk+ N cassettedcim.Devices + Ndcim.Cables + NTrunkBreakoutrows - Two-step preview/confirm flow with
django.core.signing.dumpsstate token (base64-encoded, HTML-safe) - Replaces ~30 individual NetBox object writes with one form
Cassette catalogue (#13)
- Five
DeviceTypeJSON templates:mpo-12f-lc-cassette,mpo-24f-lc-cassette,mpo-12f-mpo-cassette,lgx-lc-12f-panel,ru1-lc-24f-panel python manage.py load_osp_cassettesseeds them idempotently- Same JSON shape as
netbox-community/devicetype-library(works with the upstream loader too)
Visual core tracer (#14)
- Click "Trace this core" on any
Strand/dcim.FrontPort/dcim.Interfacedetail page → end-to-end dagre-d3 graph - Every hop (interface, patch cord, cassette pass-through, trunk fibre, splice, OSP strand) with inline per-hop loss
- Summary band above the graph shows total dB used against the strand's parent FibreLink budget, banded ok / warn / fail
- JSON endpoint at
GET /api/plugins/osp/cores/<strand_id>/trace/for external tooling - dagre-d3 vendored (offline-first, matches the rest of the plugin)
Compatibility
NetBox 4.6.x · Python 3.12 / 3.13 · Postgres 17 · Redis 7. PostGIS still not required.
Install / upgrade
pip install -U netbox-osp
python manage.py migrate
python manage.py collectstatic --no-input
# Optional: seed the cassette catalogue
python manage.py load_osp_cassettesLinks
- Repo: https://github.com/iamjohnnymac/netbox-osp
- PyPI: https://pypi.org/project/netbox-osp/0.2.0/
- Docs: https://iamjohnnymac.github.io/netbox-osp/
- Full changelog: CHANGELOG.md