diff --git a/.metadata.yml b/.metadata.yml index ff1feeac..7975c0cf 100644 --- a/.metadata.yml +++ b/.metadata.yml @@ -76,14 +76,6 @@ experimental/modules_routing_engine: information like the version. You can insert the Routing Engine into a Dcim Physical Device and leverage the Routing Engine type model. name: Modules Routing Engine -experimental/optical_transport: - dependencies: - - base - - extensions/device_module - - extensions/cable - description: | - Comprehensive optical transport network schemas for DWDM/WDM systems (ADVA FSP 3000 and similar platforms). Covers four layers: wavelength (ITU-T G.694.1 grid, optical bands, DWDM channels), topology (logical optical nodes, passive multiplexers, fiber links), equipment (transponder/amplifier/ROADM modules, ROADM degrees, WSS cross-connects), and service (end-to-end optical services, optical paths, path segments). Not designed to be loaded together with extensions/optical_multiplexer. - name: Optical Transport experimental/qos: dependencies: - base @@ -240,17 +232,66 @@ extensions/module_port: NOTE: port names keep NetBox's `{module}` bay-position token verbatim, because a template is not bound to a bay. Substituting it and creating the real device interfaces is a generator step once the module is installed. name: Module Port -extensions/optical_multiplexer: +extensions/otn: dependencies: - base + - extensions/location_site - extensions/transceiver description: | - This schema extension models optical add-drop multiplexers (OADM) and the wavelength division multiplexing (WDM) channels they carry, for both CWDM and DWDM. It adds an Optical Multiplexer device with front and rear interfaces, a WDM Channel node holding channel number, wavelength and frequency, and a WDM Transceiver flavour of the transceiver model tuned to a channel. - - Some vendors configure tunable optics by wavelength or frequency rather than channel number; the WDM Channel node gives you a single entry in Infrahub for all three. - - Not designed to be loaded together with experimental/optical_transport, which covers the same domain in more depth. - name: Optical Multiplexer + Optical transport network schemas covering the physical plant, the wavelength catalog, optical devices and their ports, pluggable optics, carriers and end-to-end services. + name: OTN + not_covered: + - Validation of what a schema cannot express, such as which port kind may hold + a pluggable, whether a mux client port binds a channel on the same plan its + multiplexer declares, or whether a hop's ingress and egress ports belong to + that hop's own element. This extension ships no checks; the schema comments + mark each such rule. + - Device types, platforms and rack elevations for optical gear, as native OTN + fields. Model the physical asset as a DcimPhysicalDevice and link it with OtnGenericDevice.dcim_device; + that edge reaches device_type, platform, position and rack_face, and a location + that may be a LocationRack. Nothing keeps OtnGenericDevice.site in agreement + with the site above that rack. + - Optical performance monitoring. The schema carries ratings and settings, such + as a port's transmit power or a mode's required OSNR, but nothing that is measured, + such as live power, OSNR, pre-FEC BER or an error counter. Those change continuously + and belong in the network management system or a time series store. + - Optical path budgets, including the record of design. OtnOpticalPath records + which elements the light crosses, in what order and across which ports, but + carries no loss, OSNR margin or latency for that route, so a turn-up figure + has nowhere to live. OtnService.max_latency_ns is a commitment on the service, + not a measurement of a path. Compute budgets in a planning tool such as GNPy. + - Frequency plans other than one fixed dense grid. OtnFrequencyGrid models a single + ITU-T G.694.1 fixed 50 GHz plan across the C band, from 191.35 to 196.10 THz. + L band, C plus L systems, flexgrid and other channel spacings are out of scope. + - Protection mechanisms. OtnOpticalPath.path_role marks a path as working or protect + and OtnDiversityGroup keeps two services apart, but nothing states the scheme, + so 1+1, 1:1, optical line protection, OMS protection and ODU SNCP are indistinguishable. + Switching thresholds and hold-off timers are out of scope with it. OtnSplitter + models the coupler such a scheme is built from. + - The OTU and OPU layers of ITU-T G.709. The model goes from the optical channel, + OtnOpticalCarrier, straight to the ODU, OtnContainer. Forward error correction + lives on OtnOpticalMode, so what an OTU would add is its section monitoring + and framing overhead, which are not modelled. + use_cases: + - Recording the ITU-T G.694.1 dense grid and G.694.2 coarse plan as separate kinds, + so a carrier pointed at the wrong plan is refused when written. + - Tracking pluggable optics as inventory, with the part number in this extension's + catalog, the serial on the library's transceiver kinds from extensions/transceiver, + and which optical port each unit is fitted in. + - Modelling the outside plant, including fiber types, conduits, spans and the + optical multiplex sections built over them. A section terminates on any OMS + endpoint, so a fixed point-to-point system built from passive multiplexers is + modellable without a ROADM. + - Cabling optical gear with extensions/cable. Every OTN port kind inherits DcimEndpoint, + so a DcimCable terminates on one for intra-site jumpers, through a DcimPatchPanel + where a panel sits in the run. + - Provisioning a wavelength end to end, as a service with an optical path and + its hops through the elements the light crosses. Each hop records what the element + does to the carrier and across which port pair, so a ROADM cross-connect reads + either from the path or from the ROADM's own ports. + - Modelling optical protection, with a working and a protect path on one service, + a diversity group that keeps two services off shared plant, and OtnSplitter + for the coupler that feeds both legs. extensions/patch_panel: dependencies: - base diff --git a/base/dcim.yml b/base/dcim.yml index 58927bf4..0a87b8b6 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -67,7 +67,7 @@ generics: # Duplicated from DcimGenericDevice because generics cannot inherit generics. # DcimModuleBay.computed_name (extensions/device_module) renders # {{ device__name__value }} against peer DcimPhysicalDevice, so name must resolve here. - # allow_override lets DcimPatchPanel and DcimOpticalMultiplexer restate it. + # allow_override lets DcimPatchPanel restate it. - name: name kind: Text unique: true diff --git a/docs/docs/home.mdx b/docs/docs/home.mdx index e91ca9da..068b6d2d 100644 --- a/docs/docs/home.mdx +++ b/docs/docs/home.mdx @@ -99,7 +99,6 @@ This list provides an overview of the schemas available in this repository. Each | **[Location Extended](./reference/location_extended.mdx)** | This schema extension is the most detailed when it comes to location, you'll find all the layers you can think of. It defines its own hierarchical Location.Rack, incompatible with the flat one extensions/rack defines, so load one or the other, not both. | | **[Modules Linecards](./reference/modules_linecards.mdx)** | This schema extension allows you to capture Linecard related information like the version. You can insert the Linecard into a Dcim Physical Device and leverage the Linecard type model. The Linecard can accept PIC to help configure PORT information like breakout-capabilities and configurations. | | **[Modules Routing Engine](./reference/modules_routing_engine.mdx)** | This schema extension allows you to capture Routing Engine related information like the version. You can insert the Routing Engine into a Dcim Physical Device and leverage the Routing Engine type model. | -| **[Optical Transport](./reference/optical_transport.mdx)** | Comprehensive optical transport network schemas for DWDM/WDM systems (ADVA FSP 3000 and similar platforms). Covers four layers: wavelength (ITU-T G.694.1 grid, optical bands, DWDM channels), topology (logical optical nodes, passive multiplexers, fiber links), equipment (transponder/amplifier/ROADM modules, ROADM degrees, WSS cross-connects), and service (end-to-end optical services, optical paths, path segments). Not designed to be loaded together with extensions/optical_multiplexer. | | **[QoS](./reference/qos.mdx)** | This schema extension contains models for Quality of Service (QoS) | | **[Security](./reference/security.mdx)** | This schema extension contains models for implementing detailed security. | | **[Topology](./reference/topology.mdx)** | A schema for defining and managing network topology, strategies, and services. | @@ -125,7 +124,7 @@ This list provides an overview of the schemas available in this repository. Each | **[Location Site](./reference/location_site.mdx)** | This schema extension introduces a Site node with facility, physical address, timezone and status, for deployments that want a flat list of sites without a hierarchy. It is the same Site node as in extensions/location_minimal, which adds Region, Country and Metro tiers above it. | | **[MLAG](./reference/mlag.mdx)** | This schema extension contains the foundations to capture Multi-Chassis Link Aggregation Groups (MLAG). It comes on top of the LAG extension. In this implementation, a MLAG interface is essentially a LAG interface but linked to a MLAG domain (instead of a device). The MLAG domain regroups devices together (usually 2) and is built over LAG interfaces used as peer-link between the devices. MLAG interfaces defined at the MLAG domain level are then spread across all devices in the domain. This is a deliberately minimal implementation of MLAG, meant to blend with models you already have. For example, in a data center fabric you might already have a LeafGroup or similar concept: have it inherit from GenericMlagDomain and add the relationships and attributes you need. Not covered yet: the layer 3 overlay for MLAG interfaces (loopback, peer address ...) and surfacing MLAG interfaces on each device in the domain. | | **[Module Port](./reference/module_port.mdx)** | This schema extension adds module ports: the ports a module provides, as declared by its module type - what NetBox module-type definitions list under `interfaces`, `console-ports` and `power-ports`. These are deliberately not DcimInterface objects. DcimInterface.device is a mandatory Parent, and Infrahub requires the relationships used in a uniqueness constraint to be mandatory, so an interface cannot hang off a module instead of a device. A DcimModulePort is a declaration parented by the module, carrying the port name, its category (interface, console, power, front, rear), the NetBox type slug, and power draw. NOTE: port names keep NetBox's `{module}` bay-position token verbatim, because a template is not bound to a bay. Substituting it and creating the real device interfaces is a generator step once the module is installed. | -| **[Optical Multiplexer](./reference/optical_multiplexer.mdx)** | This schema extension models optical add-drop multiplexers (OADM) and the wavelength division multiplexing (WDM) channels they carry, for both CWDM and DWDM. It adds an Optical Multiplexer device with front and rear interfaces, a WDM Channel node holding channel number, wavelength and frequency, and a WDM Transceiver flavour of the transceiver model tuned to a channel. Some vendors configure tunable optics by wavelength or frequency rather than channel number; the WDM Channel node gives you a single entry in Infrahub for all three. Not designed to be loaded together with experimental/optical_transport, which covers the same domain in more depth. | +| **[OTN](./reference/otn.mdx)** | Optical transport network schemas covering the physical plant, the wavelength catalog, optical devices and their ports, pluggable optics, carriers and end-to-end services. | | **[Patch Panel](./reference/patch_panel.mdx)** | This schema extension allows you to capture patch panel related information like rear and front interfaces and the mapping between them. You can insert the patch panel into a rack and leverage the device type model. Cassettes and other inserts are tracked as regular device modules in module bays, through extensions/device_module. The front and rear interfaces accept all sorts of connectors, so you can plug cables, circuits and cross-connects into them. | | **[Physical Disk](./reference/physical_disk.mdx)** | Simple schema allowing you to capture physical disk information for inventory and lifecycle management. This extension works with any kind of device: apply the DcimDeviceWithPhysicalDisks generic to a model to enable disk tracking. You might also link disks to a location, for instance to capture spares. | | **[PSU Module](./reference/device_module_psu.mdx)** | This schema extension adds a PSU (Power Supply Unit) flavour on top of the generic Module and Module Type from extensions/device_module, so you can track power supplies installed in a device's module bays with PSU-specific attributes such as wattage and hot-swap capability. | diff --git a/docs/docs/reference/optical_multiplexer.mdx b/docs/docs/reference/optical_multiplexer.mdx deleted file mode 100644 index 88f555b8..00000000 --- a/docs/docs/reference/optical_multiplexer.mdx +++ /dev/null @@ -1,461 +0,0 @@ ---- -title: Optical Multiplexer ---- - -This schema extension models optical add-drop multiplexers (OADM) and the wavelength division multiplexing (WDM) channels they carry, for both CWDM and DWDM. It adds an Optical Multiplexer device with front and rear interfaces, a WDM Channel node holding channel number, wavelength and frequency, and a WDM Transceiver flavour of the transceiver model tuned to a channel. - -Some vendors configure tunable optics by wavelength or frequency rather than channel number; the WDM Channel node gives you a single entry in Infrahub for all three. - -Not designed to be loaded together with experimental/optical_transport, which covers the same domain in more depth. - -## Details - -- **Dependencies:** - - [base](dcim) - - [extensions/transceiver](transceiver) - -## Nodes - -### OpticalMultiplexer - -- **Label:** Optical Multiplexer -- **Description:** An OADM (Optical Add Drop Multiplexer) supporting various WDM (Wavelength Division Multiplexing) technologies. -- **Namespace:** Dcim -- **Icon:** mdi:transit-connection-variant -- **Human Friendly ID:** name__value -- **Inherit From:** DcimPhysicalDevice - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | False | | | -| wdm_type | Type of WDM technology (e.g. CWDM, DWDM) | Dropdown | False | dwdm | cwdm, dwdm | -| description | | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| front_interfaces | DcimOadmFrontInterface | True | many | Component | -| rear_interface | DcimOadmRearInterface | True | one | Component | - -### OadmFrontInterface - -- **Label:** Optical Multiplexer Front Interfaces -- **Description:** Client-side interface of an optical add-drop multiplexer, carrying a single channel. -- **Namespace:** Dcim -- **Uniqueness Constraints:** - - optical_multiplexer, name__value -- **Human Friendly ID:** optical_multiplexer__name__value, name__value -- **Inherit From:** DcimEndpoint, DcimGenericOadmInterface - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| optical_multiplexer | DcimOpticalMultiplexer | False | one | Parent | -| channels | DcimWdmChannel | True | many | Attribute | - -### OadmRearInterface - -- **Label:** Optical Multiplexer Rear Interfaces -- **Description:** Line-side interface of an optical add-drop multiplexer, carrying the multiplexed signal. -- **Namespace:** Dcim -- **Uniqueness Constraints:** - - optical_multiplexer, name__value -- **Human Friendly ID:** optical_multiplexer__name__value, name__value -- **Inherit From:** DcimEndpoint, DcimGenericOadmInterface - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| optical_multiplexer | DcimOpticalMultiplexer | False | one | Parent | - -### WdmChannel - -- **Label:** WDM Channel -- **Description:** A WDM channel with its wavelength and frequency. -- **Namespace:** Dcim -- **Icon:** game-icons:laser-warning -- **Uniqueness Constraints:** - - frequency__value, wavelength__value, channel__value, wdm_type__value - - channel__value, wdm_type__value -- **Human Friendly ID:** wdm_type__value, channel__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| channel | WDM channel number. | Number | False | | | -| wdm_type | Type of WDM technology (e.g. CWDM, DWDM) | Dropdown | False | dwdm | cwdm, dwdm | -| wavelength | Wavelength of the channel in nm. | Text | False | | | -| frequency | Frequency of the channel in GHz. | Text | False | | | - -### WdmTransceiver - -- **Label:** WDM Transceiver -- **Description:** Transceiver tuned to a Wavelength Division Multiplexing channel. -- **Namespace:** Dcim -- **Icon:** mdi:laser-pointer -- **Inherit From:** DcimGenericTransceiver - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| wdm_type | Type of WDM technology (e.g. CWDM, DWDM) | Dropdown | False | dwdm | cwdm, dwdm | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| wdm_channel | DcimWdmChannel | False | one | Attribute | - -## Generics - -### GenericOadmInterface - -- **Label:** Optical Multiplexer Interfaces -- **Description:** Generic interface of an optical add-drop multiplexer, front or rear. -- **Namespace:** Dcim -- **Icon:** mdi:ethernet - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | False | | | -| description | | Text | True | | | -| connector_type | | Dropdown | False | | fc, lc, lc_pc, lc_upc, lc_apc, lsh, lsh_pc, lsh_upc, lsh_apc, lx_5, lx_5_pc, lx_5_upc, lx_5_apc, mpo, mtrj, sc, sc_pc, sc_upc, sc_apc, st, cs, sn, sma_905, sma_906, urm_p2, urm_p4, urm_p8, splice | - -## Code - -```yaml -version: '1.0' -generics: -- name: GenericOadmInterface - namespace: Dcim - description: Generic interface of an optical add-drop multiplexer, front or rear. - label: Optical Multiplexer Interfaces - icon: mdi:ethernet - include_in_menu: true - menu_placement: DcimOpticalMultiplexer - attributes: - - name: name - kind: Text - optional: false - order_weight: 1000 - - name: description - kind: Text - optional: true - order_weight: 1100 - - name: connector_type - kind: Dropdown - choices: - - name: fc - label: FC - description: Standardized fiber optic connector used primarily in datacom and - telecom applications. - - name: lc - label: LC - description: Compact fiber optic connector with a push-pull mechanism. - - name: lc_pc - label: LC/PC - description: Polished LC connector providing physical contact (PC). - - name: lc_upc - label: LC/UPC - description: Ultra-Physical Contact (UPC) variant of the LC connector with enhanced - polish. - - name: lc_apc - label: LC/APC - description: Angled Physical Contact (APC) version of the LC connector with - a slanted fiber end-face. - - name: lsh - label: LSH - description: European fiber optic connector offering high durability. - - name: lsh_pc - label: LSH/PC - description: Physical Contact version of LSH with standard polish. - - name: lsh_upc - label: LSH/UPC - description: Ultra-Physical Contact variant of LSH, minimizing return loss with - a superior polish. - - name: lsh_apc - label: LSH/APC - description: Angled Physical Contact version of LSH, designed to reduce back - reflections. - - name: lx_5 - label: LX.5 - description: Miniaturized fiber optic connector similar to LC but with an additional - shutter mechanism. - - name: lx_5_pc - label: LX.5/PC - description: Physical Contact version of LX.5. - - name: lx_5_upc - label: LX.5/UPC - description: Ultra-Physical Contact variant of LX.5. - - name: lx_5_apc - label: LX.5/APC - description: Angled Physical Contact version of LX.5. - - name: mpo - label: MPO - description: Multi-fiber Push-On connector typically used in data centers for - high-speed applications. - - name: mtrj - label: MTRJ - description: Male-to-female fiber optic connector with two fibers. - - name: sc - label: SC - description: Square fiber optic connector with push-pull lock. - - name: sc_pc - label: SC/PC - description: Physical Contact SC connector with a polished end-face. - - name: sc_upc - label: SC/UPC - description: Ultra-Physical Contact variant of SC. - - name: sc_apc - label: SC/APC - description: Angled Physical Contact version of SC. - - name: st - label: ST - description: Bayonet-style fiber optic connector primarily used in industrial - and military applications. - - name: cs - label: CS - description: Compact connector with a high-density duplex configuration. - - name: sn - label: SN - description: Small-form connector with dual fibers. - - name: sma_905 - label: SMA 905 - description: Stainless steel fiber optic connector. - - name: sma_906 - label: SMA 906 - description: Variant of SMA 905 with similar durability, frequently used in - high-vibration settings. - - name: urm_p2 - label: URM-P2 - description: Specialized fiber optic connector for industrial and harsh environments. - - name: urm_p4 - label: URM-P4 - description: Similar to URM-P2 but designed for higher performance. - - name: urm_p8 - label: URM-P8 - description: Enhanced version of URM connectors with higher protection. - - name: splice - label: Splice - description: Permanent fiber connection method where two fiber ends are fused. - optional: false - order_weight: 1200 -nodes: -- name: OpticalMultiplexer - namespace: Dcim - description: An OADM (Optical Add Drop Multiplexer) supporting various WDM (Wavelength - Division Multiplexing) technologies. - label: Optical Multiplexer - icon: mdi:transit-connection-variant - include_in_menu: true - inherit_from: - - DcimPhysicalDevice - human_friendly_id: - - name__value - order_by: - - name__value - display_label: name__value - attributes: - - name: name - kind: Text - unique: true - optional: false - order_weight: 1000 - - name: wdm_type - kind: Dropdown - default_value: dwdm - choices: - - name: cwdm - label: CWDM (Coarse Wavelength Division Multiplexing) - description: Supports multiple wavelengths for communication up to 70km. - color: '#0099cc' - - name: dwdm - label: DWDM (Dense Wavelength Division Multiplexing) - description: Supports dense wavelengths and amplification for long-distance - communication. - color: '#9933cc' - optional: false - description: Type of WDM technology (e.g. CWDM, DWDM) - order_weight: 1300 - - name: description - kind: Text - optional: true - order_weight: 1100 - relationships: - - name: front_interfaces - peer: DcimOadmFrontInterface - kind: Component - cardinality: many - optional: true - identifier: optical_multiplexer__front_interfaces - order_weight: 1350 - - name: rear_interface - peer: DcimOadmRearInterface - kind: Component - cardinality: one - optional: true - identifier: optical_multiplexer__rear_interface - order_weight: 1450 -- name: OadmFrontInterface - namespace: Dcim - description: Client-side interface of an optical add-drop multiplexer, carrying - a single channel. - label: Optical Multiplexer Front Interfaces - include_in_menu: true - menu_placement: DcimGenericOadmInterface - inherit_from: - - DcimEndpoint - - DcimGenericOadmInterface - human_friendly_id: - - optical_multiplexer__name__value - - name__value - order_by: - - optical_multiplexer__name__value - - name__value - display_label: '{{ optical_multiplexer__name__value }} > {{ name__value }}' - uniqueness_constraints: - - - optical_multiplexer - - name__value - relationships: - - name: optical_multiplexer - peer: DcimOpticalMultiplexer - kind: Parent - cardinality: one - optional: false - identifier: optical_multiplexer__front_interfaces - order_weight: 900 - - name: channels - peer: DcimWdmChannel - kind: Attribute - cardinality: many - optional: true - identifier: oadm_interface__channels - order_weight: 1300 -- name: OadmRearInterface - namespace: Dcim - description: Line-side interface of an optical add-drop multiplexer, carrying the - multiplexed signal. - label: Optical Multiplexer Rear Interfaces - include_in_menu: true - menu_placement: DcimGenericOadmInterface - inherit_from: - - DcimEndpoint - - DcimGenericOadmInterface - human_friendly_id: - - optical_multiplexer__name__value - - name__value - order_by: - - optical_multiplexer__name__value - - name__value - display_label: '{{ optical_multiplexer__name__value }} > {{ name__value }}' - uniqueness_constraints: - - - optical_multiplexer - - name__value - relationships: - - name: optical_multiplexer - peer: DcimOpticalMultiplexer - kind: Parent - cardinality: one - optional: false - identifier: optical_multiplexer__rear_interface - order_weight: 900 -- name: WdmChannel - namespace: Dcim - description: A WDM channel with its wavelength and frequency. - label: WDM Channel - icon: game-icons:laser-warning - include_in_menu: true - human_friendly_id: - - wdm_type__value - - channel__value - order_by: - - wdm_type__value - - channel__value - display_label: '{{ wdm_type__value }} Channel {{ channel__value }}' - uniqueness_constraints: - - - frequency__value - - wavelength__value - - channel__value - - wdm_type__value - - - channel__value - - wdm_type__value - attributes: - - name: channel - kind: Number - optional: false - description: WDM channel number. - order_weight: 1000 - - name: wdm_type - kind: Dropdown - default_value: dwdm - choices: - - name: cwdm - label: CWDM (Coarse Wavelength Division Multiplexing) - description: Supports multiple wavelengths for communication up to 70km. - color: '#0099cc' - - name: dwdm - label: DWDM (Dense Wavelength Division Multiplexing) - description: Supports dense wavelengths and amplification for long-distance - communication. - color: '#9933cc' - optional: false - description: Type of WDM technology (e.g. CWDM, DWDM) - order_weight: 1100 - - name: wavelength - kind: Text - label: Wavelength (nm) - optional: false - description: Wavelength of the channel in nm. - order_weight: 1200 - - name: frequency - kind: Text - label: Frequency (GHz) - optional: false - description: Frequency of the channel in GHz. - order_weight: 1300 -- name: WdmTransceiver - namespace: Dcim - description: Transceiver tuned to a Wavelength Division Multiplexing channel. - label: WDM Transceiver - icon: mdi:laser-pointer - include_in_menu: true - menu_placement: DcimGenericTransceiver - inherit_from: - - DcimGenericTransceiver - attributes: - - name: wdm_type - kind: Dropdown - default_value: dwdm - choices: - - name: cwdm - label: CWDM (Coarse Wavelength Division Multiplexing) - description: Supports multiple wavelengths for communication up to 70km. - color: '#0099cc' - - name: dwdm - label: DWDM (Dense Wavelength Division Multiplexing) - description: Supports dense wavelengths and amplification for long-distance - communication. - color: '#9933cc' - optional: false - description: Type of WDM technology (e.g. CWDM, DWDM) - order_weight: 1150 - relationships: - - name: wdm_channel - peer: DcimWdmChannel - label: WDM Channel - kind: Attribute - cardinality: one - optional: false - identifier: wdm_transceiver__channel - order_weight: 1250 - -``` \ No newline at end of file diff --git a/docs/docs/reference/optical_transport.mdx b/docs/docs/reference/optical_transport.mdx deleted file mode 100644 index 57964bb9..00000000 --- a/docs/docs/reference/optical_transport.mdx +++ /dev/null @@ -1,1953 +0,0 @@ ---- -title: Optical Transport ---- - -Comprehensive optical transport network schemas for DWDM/WDM systems (ADVA FSP 3000 and similar platforms). Covers four layers: wavelength (ITU-T G.694.1 grid, optical bands, DWDM channels), topology (logical optical nodes, passive multiplexers, fiber links), equipment (transponder/amplifier/ROADM modules, ROADM degrees, WSS cross-connects), and service (end-to-end optical services, optical paths, path segments). Not designed to be loaded together with extensions/optical_multiplexer. - -## Details - -- **Dependencies:** - - [base](dcim) - - [extensions/device_module](device_module) - - [extensions/cable](cable) - -## Nodes - -### ITUGrid - -- **Label:** ITU-T DWDM Grid -- **Description:** ITU-T G.694.1 frequency grid standards for DWDM -- **Namespace:** Dcim -- **Icon:** mdi:grid -- **Uniqueness Constraints:** - - name__value -- **Human Friendly ID:** name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Grid name (e.g., 50GHz, 100GHz) | Text | False | | | -| channel_spacing_ghz | Channel spacing in GHz (50, 100, etc.) | Number | False | | | -| reference_frequency_thz | Reference frequency in THz (e.g., '193.1' for 1550nm) | Text | False | | | -| description | Grid description and use cases | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| bands | DcimOpticalBand | True | many | Component | - -### OpticalBand - -- **Label:** Optical Band -- **Description:** Optical frequency band (C-Band, L-Band, S-Band) -- **Namespace:** Dcim -- **Icon:** mdi:sine-wave -- **Uniqueness Constraints:** - - grid, band_name__value -- **Human Friendly ID:** grid__name__value, band_name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| band_name | Optical band designation | Dropdown | False | | c_band, l_band, s_band, o_band | -| start_frequency_thz | Band start frequency in THz (e.g., '191.0') | Text | False | | | -| end_frequency_thz | Band end frequency in THz (e.g., '196.1') | Text | False | | | -| start_wavelength_nm | Band start wavelength in nm (e.g., '1530.0') | Text | True | | | -| end_wavelength_nm | Band end wavelength in nm (e.g., '1565.0') | Text | True | | | -| computed_name | Auto-generated band identifier (e.g., 50GHz-C_BAND) | Text | False | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| grid | DcimITUGrid | False | one | Parent | -| channels | DcimDWDMChannel | True | many | Component | - -### DWDMChannel - -- **Label:** DWDM Channel -- **Description:** Individual DWDM wavelength/channel (CH20, CH21, etc.) -- **Namespace:** Dcim -- **Icon:** mdi:wave -- **Uniqueness Constraints:** - - band, channel_number__value - - channel_name__value - - channel_number__value, frequency_thz__value, wavelength_nm__value -- **Human Friendly ID:** channel_name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| channel_name | ITU DWDM Channel identifier (computed as CH + channel number, e.g., CH20, CH21, CH40) | Text | False | | | -| adva_channel_name | ADVA-specific channel name (e.g., D02, DC1, D32) | Text | True | | | -| channel_number | ITU channel number (e.g., 20, 21, 60) | Number | False | | | -| frequency_thz | Center frequency in THz (e.g., '192.1') | Text | False | | | -| wavelength_nm | Center wavelength in nm (e.g., '1560.61') | Text | False | | | -| description | Channel notes and usage | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| band | DcimOpticalBand | False | one | Parent | -| mux_assignments | DcimMuxChannelAssignment | True | many | Component | -| mappings | DcimChannelMapping | True | many | Generic | - -### MuxChannelAssignment - -- **Label:** Mux Channel Assignment -- **Description:** Maps DWDM channel to multiplexer port (equipment configuration) -- **Namespace:** Dcim -- **Icon:** mdi:cable-data -- **Uniqueness Constraints:** - - optical_device, port_number__value - - optical_device, channel -- **Human Friendly ID:** optical_device__computed_name__value, port_number__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| port_number | Physical port number on multiplexer (e.g., 1-96) | Number | False | | | -| tx_power_dbm | Configured transmit power in dBm (e.g., '0.0') | Text | True | | | -| status | Channel assignment status | Dropdown | False | configured | configured, active, disabled, failed | -| computed_name | Auto-generated assignment identifier | Text | False | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| channel | DcimDWDMChannel | False | one | Attribute | -| optical_device | DcimOpticalDevice | False | one | Parent | - -### FiberMapping - -- **Label:** Fiber Mapping -- **Description:** Long-haul fiber link between degrees on DIFFERENT ROADMs/sites (kilometers distance) -- **Namespace:** Dcim -- **Icon:** mdi:fiber-optic -- **Uniqueness Constraints:** - - fiber_link, channel -- **Human Friendly ID:** fiber_link__link_id__value, channel__channel_name__value -- **Inherit From:** DcimChannelMapping - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| allocation_status | Allocation status | Dropdown | False | reserved | reserved, allocated, in_use, maintenance, failed | -| tx_power_dbm | Measured transmit power in dBm (e.g., '0.5') | Text | True | | | -| rx_power_dbm | Measured receive power in dBm (e.g., '-2.3') | Text | True | | | -| osnr_db | Optical Signal-to-Noise Ratio in dB (e.g., '25.5') | Text | True | | | -| allocated_date | Date channel was allocated | DateTime | True | | | -| computed_name | Auto-generated mapping identifier | Text | False | | | -| description | Additional fiber mapping details | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| fiber_link | DcimFiberLink | False | one | Attribute | - -### OpticalNode - -- **Label:** Optical Node -- **Description:** Logical network endpoint in optical topology (graph node, not physical device) -- **Namespace:** Dcim -- **Icon:** mdi:lan -- **Uniqueness Constraints:** - - name__value -- **Human Friendly ID:** name__value -- **Inherit From:** DcimOpticalDevice - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed name for display | Text | False | | | -| name | Logical node name (e.g., GENESIS-OL-10, SKYLINE-OL-1) | Text | False | | | -| node_type | Topology role of this node | Dropdown | False | | endpoint, intermediate, branching | -| description | Node notes and function | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| device | DcimPhysicalDevice | True | one | Attribute | -| transponder_modules | DcimTransponderModule | True | many | Attribute | -| links | DcimFiberLink | True | many | Component | - -### PassiveMultiplexer - -- **Label:** Passive Multiplexer -- **Description:** Passive CWDM/DWDM multiplexer (fixed port count, no modules) -- **Namespace:** Dcim -- **Icon:** mdi:resistor-nodes -- **Uniqueness Constraints:** - - name__value -- **Human Friendly ID:** name__value -- **Inherit From:** DcimPhysicalDevice - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed name for display | Text | False | | | -| name | Passive mux name (e.g., CHI-PMUX-01) | Text | False | | | -| port_count | Number of fixed ports (e.g., 8, 16, 32, 40) | Number | False | | | -| mux_type | Type of passive multiplexer | Dropdown | False | | cwdm, dwdm | -| description | Device notes | Text | True | | | - -### FiberLink - -- **Label:** Fiber Link -- **Description:** Fiber connecting two optical nodes (graph edge) -- **Namespace:** Dcim -- **Icon:** mdi:cable-data -- **Uniqueness Constraints:** - - link_id__value -- **Human Friendly ID:** link_id__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| link_id | Unique link identifier (e.g., LINK-001) | Text | False | | | -| distance_km | Physical distance in kilometers (e.g., '920.5') | Text | True | | | -| attenuation_db | Total fiber attenuation in dB (e.g., '18.4') | Text | True | | | -| status | Operational status of fiber link | Dropdown | False | planned | planned, active, standby, maintenance, failed | -| commissioned_date | Date link was commissioned | DateTime | True | | | -| description | Additional link details | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| endpoints | DcimOpticalNode | False | many | Attribute | -| mappings | DcimFiberMapping | True | many | Component | - -### OpticalModuleType - -- **Label:** Optical Module Type -- **Description:** Categorization of optical modules by function -- **Namespace:** Dcim -- **Icon:** mdi:expansion-card -- **Inherit From:** DcimGenericModuleType - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Module type name | Text | False | | | -| description | Module type description | Text | True | | | -| module_category | Functional category of the module | Dropdown | False | | transponder, multiplexer, amplifier, monitoring, control, power, cooling | - -### TransponderModule - -- **Label:** Transponder Module -- **Description:** Optical-electrical-optical conversion module (100G, 400G coherent) installed in chassis -- **Namespace:** Dcim -- **Icon:** mdi:chip -- **Uniqueness Constraints:** - - computed_name__value -- **Human Friendly ID:** computed_name__value -- **Inherit From:** DcimGenericModule - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed module name (e.g., dc1-leaf1 > slot 1-TPD-1/1) | Text | False | | | -| slot_number | Slot number in chassis (e.g., '1/1', '1/2', '2/1') | Text | False | | | -| capacity_gbps | Line rate capacity in Gbps (e.g., 100, 200, 400) | Number | False | | | -| modulation_format | Modulation format for optical transmission | Dropdown | False | | dp_qpsk, dp_16qam, dp_8qam, dp_64qam | -| tunable_range | Wavelength tuning capability | Dropdown | False | | c_band, c_l_band, fixed | -| fec_type | Forward error correction type | Dropdown | True | | sd_fec, hd_fec, c_fec, o_fec | -| client_interface | Client-side interface (e.g., 100GE, 400GE, OTU4) | Text | True | | | -| line_interface | Line-side interface (e.g., CFP2-DCO, QSFP28, QSFP-DD) | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| tuned_channel | DcimDWDMChannel | True | one | Attribute | -| connected_to_optical_node | DcimOpticalNode | True | one | Attribute | - -### OpticalMultiplexerModule - -- **Label:** Optical Multiplexer Module -- **Description:** Multiplexer/Demultiplexer/ROADM module for wavelength management installed in chassis -- **Namespace:** Dcim -- **Icon:** mdi:router-network -- **Human Friendly ID:** computed_name__value -- **Inherit From:** DcimGenericModule - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed module name (e.g., dc1-leaf1 > slot 1-MUX-1/3) | Text | False | | | -| slot_number | Slot number in chassis (e.g., '1/3', '1/4', '2/3') | Text | False | | | -| mux_type | Type of multiplexer technology | Dropdown | False | | passive_mux, passive_demux, oadm, roadm, wss | -| channel_capacity | Number of supported DWDM channels (e.g., 40, 80, 96) | Number | False | | | -| technology | Underlying multiplexer technology | Dropdown | True | | thin_film_filter, awg, wss_lcos, wss_mems | -| degree_count | Number of ROADM degrees (e.g., 2, 4, 8, 16) | Number | True | | | -| colorless | Colorless add/drop capability (any channel on any port) | Boolean | True | False | | -| directionless | Directionless add/drop capability (any port to any degree) | Boolean | True | False | | -| contentionless | Contentionless add/drop (CDC - Colorless, Directionless, Contentionless) | Boolean | True | False | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| degrees | DcimRoadmDegree | True | many | Component | -| mappings | DcimChannelMapping | True | many | Attribute | - -### RoadmDegree - -- **Label:** ROADM Degree -- **Description:** ROADM degree with line port (OL-1, OL-2, etc.) -- **Namespace:** Dcim -- **Icon:** mdi:lan-connect -- **Uniqueness Constraints:** - - roadm, degree_number__value - - roadm, line_port__value -- **Human Friendly ID:** computed_name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed name (e.g., ROADM-SITE-A-OL-1) | Text | False | | | -| degree_number | Degree number (1-based, e.g., 1, 2, 3, 4) | Number | False | | | -| line_port | Line port designation (e.g., OL-1, OL-2, OL-7) | Text | False | | | -| direction | Directional designation of degree | Dropdown | False | | north, south, east, west, express, local | -| degree_type | Type of ROADM degree | Dropdown | False | | line, express, add_drop | -| wavelength_capacity | Number of wavelengths supported on this degree | Number | True | | | -| description | Additional degree details | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| roadm | DcimOpticalMultiplexerModule | False | one | Parent | -| connected_fiber | DcimFiberLink | True | one | Attribute | -| channel_mappings | DcimChannelMapping | True | many | Attribute | - -### WSSConnect - -- **Label:** WSS Connect -- **Description:** Internal WSS cross-connect between degrees on SAME ROADM device (0m distance) -- **Namespace:** Dcim -- **Icon:** mdi:swap-horizontal -- **Uniqueness Constraints:** - - roadm, channel -- **Human Friendly ID:** computed_name__value -- **Inherit From:** DcimChannelMapping - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed connection ID | Text | False | | | -| description | Additional cross-connect details | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| roadm | DcimOpticalMultiplexerModule | False | one | Attribute | - -### CableMapping - -- **Label:** Cable Mapping -- **Description:** Local patch cable between degrees on DIFFERENT ROADMs (meters distance, same site) -- **Namespace:** Dcim -- **Icon:** mdi:cable-data -- **Uniqueness Constraints:** - - cable, channel -- **Human Friendly ID:** computed_name__value -- **Inherit From:** DcimChannelMapping - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed mapping name (e.g., CABLE-123-CH58) | Text | False | | | -| description | Additional cable mapping details | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| cable | DcimCable | False | one | Attribute | - -### OpticalAmplifierModule - -- **Label:** Optical Amplifier Module -- **Description:** Optical signal amplifier module (EDFA, Raman, VGC) installed in chassis -- **Namespace:** Dcim -- **Icon:** mdi:amplifier -- **Human Friendly ID:** computed_name__value -- **Inherit From:** DcimGenericModule - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed module name (e.g., dc1-leaf1 > slot 1-AMP-1/5) | Text | False | | | -| slot_number | Slot number in chassis (e.g., '1/5', '1/6', '2/5') | Text | False | | | -| amplifier_type | Type of optical amplifier | Dropdown | False | | edfa, raman, soa, vgc, hybrid | -| stage | Amplifier stage position | Dropdown | False | | booster, inline, preamplifier | -| gain_db | Typical gain in dB (e.g., '20.0', '17.5') | Text | True | | | -| max_output_power_dbm | Maximum output power in dBm (e.g., '17.0', '23.0') | Text | True | | | -| noise_figure_db | Noise figure in dB (e.g., '5.5', '4.8') | Text | True | | | -| operating_band | Operating wavelength band | Dropdown | False | | c_band, l_band, c_l_band | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| amplified_link | DcimFiberLink | True | one | Attribute | - -### OpticalService - -- **Label:** Optical Service -- **Description:** End-to-end optical transport service (customer circuit) spanning multiple sites -- **Namespace:** Dcim -- **Icon:** mdi:transit-connection-variant -- **Uniqueness Constraints:** - - service_id__value -- **Human Friendly ID:** service_id__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| service_id | Unique service identifier | Text | False | | | -| service_name | Customer service name (e.g., 'ATC 10G - Albion to Arco #2') | Text | False | | | -| service_type | Type of optical service | Dropdown | False | | wavelength, transport, ip_transit | -| bandwidth | Service bandwidth (e.g., '10G', '100G', '400G') | Text | False | | | -| status | Service operational status | Dropdown | False | planned | planned, provisioned, active, maintenance, failed | -| customer_circuit_id | Customer's circuit ID (e.g., '99/OKFS/000029//SYG') | Text | True | | | -| provision_date | Date service was provisioned | DateTime | True | | | -| description | Additional service details | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| transponders | DcimTransponderModule | False | many | Attribute | -| channel | DcimDWDMChannel | False | one | Attribute | -| primary_path | DcimOpticalPath | False | one | Component | -| backup_path | DcimOpticalPath | True | one | Component | - -### OpticalPath - -- **Label:** Optical Path -- **Description:** Ordered sequence of segments forming an optical path through the network -- **Namespace:** Dcim -- **Icon:** mdi:map-marker-path -- **Human Friendly ID:** name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Path name (e.g., MS-W17D5-primary) | Text | False | | | -| path_type | Type of path (primary, backup, express) | Dropdown | False | | primary, backup, express | -| total_distance_km | Total path distance in kilometers | Text | True | | | -| total_loss_db | Total optical loss in dB | Text | True | | | -| hop_count | Number of ROADM hops in path | Number | True | | | -| is_active | Whether this path is currently active | Boolean | False | True | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| segments | DcimPathSegment | True | many | Component | -| is_primary_of_service | DcimOpticalService | True | one | Attribute | -| is_backup_of_service | DcimOpticalService | True | one | Attribute | - -### PathSegment - -- **Label:** Path Segment -- **Description:** One hop in optical path - references channel mapping (fiber, cable, or cross-connect) -- **Namespace:** Dcim -- **Icon:** mdi:ray-start-arrow -- **Uniqueness Constraints:** - - path, segment_order__value -- **Human Friendly ID:** computed_name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed segment name (e.g., MS-W17D5-primary-SEG1) | Text | False | | | -| segment_order | Order of this segment in the path (1, 2, 3...) | Number | False | | | -| segment_type | Type of segment | Dropdown | False | | fiber, cross_connect, cable, add, drop | -| loss_db | Optical loss for this segment in dB | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| path | DcimOpticalPath | False | one | Parent | -| channel_mapping | DcimChannelMapping | True | one | Attribute | - -## Generics - -### ChannelMapping - -- **Label:** Channel Mapping -- **Description:** Generic base for any channel allocation/routing (fiber, cable, or internal cross-connect) -- **Namespace:** Dcim - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| is_active | Whether this mapping is currently active | Boolean | False | True | | -| configured_date | Date this mapping was configured | DateTime | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| segment | DcimPathSegment | False | one | Parent | -| channel | DcimDWDMChannel | False | one | Attribute | -| degrees | DcimRoadmDegree | False | many | Attribute | - -### OpticalDevice - -- **Label:** Optical Multiplexer Device -- **Description:** Generic interface for any device that can multiplex DWDM channels (active or passive) -- **Namespace:** Dcim -- **Uniqueness Constraints:** - - computed_name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | | Text | False | | | - -## Extensions - -:::note - -In this context "extensions" refer to modifications or additions to the existing schema, such as adding new attributes, relationships, or other schema elements. - -::: - -### DcimPhysicalDevice - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| optical_node | DcimOpticalNode | True | many | Generic | - -## Code - -```yaml -version: '1.0' -generics: -- name: ChannelMapping - namespace: Dcim - description: Generic base for any channel allocation/routing (fiber, cable, or internal - cross-connect) - label: Channel Mapping - include_in_menu: false - attributes: - - name: is_active - kind: Boolean - optional: false - default_value: true - description: Whether this mapping is currently active - - name: configured_date - kind: DateTime - optional: true - description: Date this mapping was configured - relationships: - - name: segment - peer: DcimPathSegment - cardinality: one - kind: Parent - optional: false - identifier: channel_mapping__path_segments - description: Optical Path segment associated with this mapping - - name: channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: false - identifier: dwdm_channel__mappings - description: DWDM channel being mapped/routed - - name: degrees - peer: DcimRoadmDegree - cardinality: many - max_count: 2 - kind: Attribute - optional: false - identifier: roadm_degree__channel_mappings - description: Two ROADM degrees involved in this mapping (bidirectional) -- name: OpticalDevice - namespace: Dcim - description: Generic interface for any device that can multiplex DWDM channels (active - or passive) - label: Optical Multiplexer Device - include_in_menu: false - uniqueness_constraints: - - - computed_name__value - attributes: - - name: computed_name - kind: Text - optional: false -nodes: -- name: ITUGrid - namespace: Dcim - include_in_menu: true - label: ITU-T DWDM Grid - description: ITU-T G.694.1 frequency grid standards for DWDM - icon: mdi:grid - display_label: name__value - human_friendly_id: - - name__value - uniqueness_constraints: - - - name__value - attributes: - - name: name - kind: Text - optional: false - description: Grid name (e.g., 50GHz, 100GHz) - - name: channel_spacing_ghz - kind: Number - optional: false - description: Channel spacing in GHz (50, 100, etc.) - - name: reference_frequency_thz - kind: Text - optional: false - description: Reference frequency in THz (e.g., '193.1' for 1550nm) - - name: description - kind: Text - optional: true - description: Grid description and use cases - relationships: - - name: bands - peer: DcimOpticalBand - cardinality: many - kind: Component - optional: true - description: Optical bands using this grid -- name: OpticalBand - namespace: Dcim - include_in_menu: true - label: Optical Band - description: Optical frequency band (C-Band, L-Band, S-Band) - icon: mdi:sine-wave - display_label: computed_name__value - human_friendly_id: - - grid__name__value - - band_name__value - uniqueness_constraints: - - - grid - - band_name__value - attributes: - - name: band_name - kind: Dropdown - optional: false - choices: - - name: c_band - label: C-Band - description: Conventional Band (1530-1565 nm) - color: '#ff6b6b' - - name: l_band - label: L-Band - description: Long Band (1565-1625 nm) - color: '#4ecdc4' - - name: s_band - label: S-Band - description: Short Band (1460-1530 nm) - color: '#95e1d3' - - name: o_band - label: O-Band - description: Original Band (1260-1360 nm) - color: '#f38181' - description: Optical band designation - - name: start_frequency_thz - kind: Text - optional: false - description: Band start frequency in THz (e.g., '191.0') - - name: end_frequency_thz - kind: Text - optional: false - description: Band end frequency in THz (e.g., '196.1') - - name: start_wavelength_nm - kind: Text - optional: true - description: Band start wavelength in nm (e.g., '1530.0') - - name: end_wavelength_nm - kind: Text - optional: true - description: Band end wavelength in nm (e.g., '1565.0') - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ grid__name__value }}-{{ band_name__value|upper }}' - description: Auto-generated band identifier (e.g., 50GHz-C_BAND) - relationships: - - name: grid - peer: DcimITUGrid - cardinality: one - kind: Parent - optional: false - description: Parent ITU grid - - name: channels - peer: DcimDWDMChannel - cardinality: many - kind: Component - optional: true - description: DWDM channels in this band -- name: DWDMChannel - namespace: Dcim - include_in_menu: true - label: DWDM Channel - description: Individual DWDM wavelength/channel (CH20, CH21, etc.) - icon: mdi:wave - display_label: channel_name__value - human_friendly_id: - - channel_name__value - order_by: - - band__computed_name__value - - channel_number__value - uniqueness_constraints: - - - band - - channel_number__value - - - channel_name__value - - - channel_number__value - - frequency_thz__value - - wavelength_nm__value - attributes: - - name: channel_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: CH{{ channel_number__value }} - description: ITU DWDM Channel identifier (computed as CH + channel number, e.g., - CH20, CH21, CH40) - - name: adva_channel_name - kind: Text - optional: true - description: ADVA-specific channel name (e.g., D02, DC1, D32) - - name: channel_number - kind: Number - optional: false - description: ITU channel number (e.g., 20, 21, 60) - - name: frequency_thz - kind: Text - optional: false - description: Center frequency in THz (e.g., '192.1') - - name: wavelength_nm - kind: Text - optional: false - description: Center wavelength in nm (e.g., '1560.61') - - name: description - kind: Text - optional: true - description: Channel notes and usage - relationships: - - name: band - peer: DcimOpticalBand - cardinality: one - kind: Parent - optional: false - description: Parent optical band - - name: mux_assignments - peer: DcimMuxChannelAssignment - cardinality: many - kind: Component - optional: true - description: Mux port assignments for this channel - - name: mappings - peer: DcimChannelMapping - cardinality: many - kind: Generic - optional: true - description: Fiber allocations for this channel -- name: MuxChannelAssignment - namespace: Dcim - include_in_menu: true - label: Mux Channel Assignment - description: Maps DWDM channel to multiplexer port (equipment configuration) - icon: mdi:cable-data - display_label: computed_name__value - human_friendly_id: - - optical_device__computed_name__value - - port_number__value - uniqueness_constraints: - - - optical_device - - port_number__value - - - optical_device - - channel - attributes: - - name: port_number - kind: Number - optional: false - description: Physical port number on multiplexer (e.g., 1-96) - - name: tx_power_dbm - kind: Text - optional: true - description: Configured transmit power in dBm (e.g., '0.0') - - name: status - kind: Dropdown - optional: false - default_value: configured - choices: - - name: configured - label: Configured - description: Channel is configured on port - color: '#f5a623' - - name: active - label: Active - description: Channel is actively transmitting - color: '#00cc00' - - name: disabled - label: Disabled - description: Channel is disabled - color: '#cccccc' - - name: failed - label: Failed - description: Channel has failed - color: '#cc0000' - description: Channel assignment status - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ optical_device__computed_name__value }}-P{{ ''{:02d}''.format(port_number__value) - }}-{{ channel__channel_name__value }}' - description: Auto-generated assignment identifier - relationships: - - name: channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: false - description: DWDM channel assigned to this port - - name: optical_device - peer: DcimOpticalDevice - cardinality: one - kind: Parent - optional: false - identifier: mux_channel_assignments - description: Multiplexer device (OpticalNode or PassiveMultiplexer) -- name: FiberMapping - namespace: Dcim - inherit_from: - - DcimChannelMapping - include_in_menu: true - label: Fiber Mapping - description: Long-haul fiber link between degrees on DIFFERENT ROADMs/sites (kilometers - distance) - icon: mdi:fiber-optic - display_label: computed_name__value - human_friendly_id: - - fiber_link__link_id__value - - channel__channel_name__value - uniqueness_constraints: - - - fiber_link - - channel - attributes: - - name: allocation_status - kind: Dropdown - optional: false - default_value: reserved - choices: - - name: reserved - label: Reserved - description: Channel reserved but not in use - color: '#f5a623' - - name: allocated - label: Allocated - description: Channel allocated to service - color: '#0099cc' - - name: in_use - label: In Use - description: Channel actively carrying traffic - color: '#00cc00' - - name: maintenance - label: Maintenance - description: Channel under maintenance - color: '#ff9800' - - name: failed - label: Failed - description: Channel has failed - color: '#cc0000' - description: Allocation status - - name: tx_power_dbm - kind: Text - optional: true - description: Measured transmit power in dBm (e.g., '0.5') - - name: rx_power_dbm - kind: Text - optional: true - description: Measured receive power in dBm (e.g., '-2.3') - - name: osnr_db - kind: Text - optional: true - description: Optical Signal-to-Noise Ratio in dB (e.g., '25.5') - - name: allocated_date - kind: DateTime - optional: true - description: Date channel was allocated - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ fiber_link__link_id__value }}-{{ channel__channel_name__value - }}' - description: Auto-generated mapping identifier - - name: description - kind: Text - optional: true - description: Additional fiber mapping details - relationships: - - name: fiber_link - peer: DcimFiberLink - cardinality: one - kind: Attribute - optional: false - identifier: fiber_channel_mappings - description: Long-haul fiber link connecting the degrees -- name: OpticalNode - namespace: Dcim - include_in_menu: true - label: Optical Node - description: Logical network endpoint in optical topology (graph node, not physical - device) - icon: mdi:lan - inherit_from: - - DcimOpticalDevice - display_label: computed_name__value - human_friendly_id: - - name__value - uniqueness_constraints: - - - name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ name__value }}' - description: Computed name for display - - name: name - kind: Text - optional: false - description: Logical node name (e.g., GENESIS-OL-10, SKYLINE-OL-1) - - name: node_type - kind: Dropdown - optional: false - choices: - - name: endpoint - label: Endpoint - description: Edge node (traffic originates/terminates) - color: '#2196f3' - - name: intermediate - label: Intermediate - description: Pass-through node (ROADM only) - color: '#9c27b0' - - name: branching - label: Branching - description: Multiple fiber paths meet (hub) - color: '#ff9800' - description: Topology role of this node - - name: description - kind: Text - optional: true - description: Node notes and function - relationships: - - name: device - peer: DcimPhysicalDevice - cardinality: one - kind: Attribute - optional: true - identifier: optical_nodes__physical_device - description: Physical chassis that implements this logical node - - name: transponder_modules - peer: DcimTransponderModule - cardinality: many - kind: Attribute - optional: true - identifier: optical_node__transponder_modules - description: Transponder modules connected to this optical node (for cross-connects) - - name: links - peer: DcimFiberLink - cardinality: many - kind: Component - optional: true - identifier: optical_node__links - description: Fiber links connected to this node -- name: PassiveMultiplexer - namespace: Dcim - include_in_menu: true - label: Passive Multiplexer - description: Passive CWDM/DWDM multiplexer (fixed port count, no modules) - icon: mdi:resistor-nodes - inherit_from: - - DcimPhysicalDevice - display_label: computed_name__value - human_friendly_id: - - name__value - uniqueness_constraints: - - - name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ name__value }}' - description: Computed name for display - - name: name - kind: Text - optional: false - description: Passive mux name (e.g., CHI-PMUX-01) - - name: port_count - kind: Number - optional: false - description: Number of fixed ports (e.g., 8, 16, 32, 40) - - name: mux_type - kind: Dropdown - optional: false - choices: - - name: cwdm - label: CWDM - description: Coarse Wavelength Division Multiplexing - color: '#4a90e2' - - name: dwdm - label: DWDM - description: Dense Wavelength Division Multiplexing - color: '#9933cc' - description: Type of passive multiplexer - - name: description - kind: Text - optional: true - description: Device notes -- name: FiberLink - namespace: Dcim - include_in_menu: true - label: Fiber Link - description: Fiber connecting two optical nodes (graph edge) - icon: mdi:cable-data - display_label: link_id__value - human_friendly_id: - - link_id__value - uniqueness_constraints: - - - link_id__value - attributes: - - name: link_id - kind: Text - optional: false - description: Unique link identifier (e.g., LINK-001) - - name: distance_km - kind: Text - optional: true - description: Physical distance in kilometers (e.g., '920.5') - - name: attenuation_db - kind: Text - optional: true - description: Total fiber attenuation in dB (e.g., '18.4') - - name: status - kind: Dropdown - optional: false - default_value: planned - choices: - - name: planned - label: Planned - description: Link is planned but not yet installed - color: '#95a5a6' - - name: active - label: Active - description: Link is in service - color: '#00cc00' - - name: standby - label: Standby - description: Link is installed but not active - color: '#f5a623' - - name: maintenance - label: Maintenance - description: Link is under maintenance - color: '#ff9800' - - name: failed - label: Failed - description: Link has failed - color: '#cc0000' - description: Operational status of fiber link - - name: commissioned_date - kind: DateTime - optional: true - description: Date link was commissioned - - name: description - kind: Text - optional: true - description: Additional link details - relationships: - - name: endpoints - peer: DcimOpticalNode - identifier: optical_node__links - cardinality: many - kind: Attribute - optional: false - max_count: 2 - description: Port-level endpoints participating in this link - - name: mappings - peer: DcimFiberMapping - cardinality: many - kind: Component - identifier: fiber_channel_mappings - optional: true - description: DWDM channels allocated on this link -- name: OpticalModuleType - namespace: Dcim - include_in_menu: true - label: Optical Module Type - description: Categorization of optical modules by function - icon: mdi:expansion-card - inherit_from: - - DcimGenericModuleType - attributes: - - name: name - kind: Text - optional: false - description: Module type name - - name: description - kind: Text - optional: true - description: Module type description - - name: module_category - kind: Dropdown - optional: false - description: Functional category of the module - choices: - - name: transponder - label: Transponder - description: Optical-electrical-optical conversion - color: '#2196f3' - - name: multiplexer - label: Multiplexer/ROADM - description: Wavelength multiplexing and switching - color: '#9c27b0' - - name: amplifier - label: Amplifier - description: Optical signal amplification - color: '#ff9800' - - name: monitoring - label: Monitoring - description: Optical performance monitoring - color: '#4caf50' - - name: control - label: Control - description: System control and management - color: '#607d8b' - - name: power - label: Power Supply - description: Power management modules - color: '#795548' - - name: cooling - label: Cooling - description: Thermal management - color: '#00bcd4' -- name: TransponderModule - namespace: Dcim - include_in_menu: true - label: Transponder Module - description: Optical-electrical-optical conversion module (100G, 400G coherent) - installed in chassis - icon: mdi:chip - inherit_from: - - DcimGenericModule - display_label: computed_name__value - uniqueness_constraints: - - - computed_name__value - human_friendly_id: - - computed_name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ module_bay__computed_name__value }}-TPD-{{ slot_number__value - }}' - description: Computed module name (e.g., dc1-leaf1 > slot 1-TPD-1/1) - - name: slot_number - kind: Text - optional: false - description: Slot number in chassis (e.g., '1/1', '1/2', '2/1') - - name: capacity_gbps - kind: Number - optional: false - description: Line rate capacity in Gbps (e.g., 100, 200, 400) - - name: modulation_format - kind: Dropdown - optional: false - choices: - - name: dp_qpsk - label: DP-QPSK - description: Dual-polarization QPSK (100G) - color: '#2196f3' - - name: dp_16qam - label: DP-16QAM - description: Dual-polarization 16QAM (200G) - color: '#9c27b0' - - name: dp_8qam - label: DP-8QAM - description: Dual-polarization 8QAM (150G) - color: '#ff9800' - - name: dp_64qam - label: DP-64QAM - description: Dual-polarization 64QAM (400G) - color: '#4caf50' - description: Modulation format for optical transmission - - name: tunable_range - kind: Dropdown - optional: false - choices: - - name: c_band - label: C-Band (1530-1565nm) - description: Full C-Band tunable - color: '#9933cc' - - name: c_l_band - label: C+L-Band (1530-1625nm) - description: Extended C+L-Band tunable - color: '#cc33cc' - - name: fixed - label: Fixed Wavelength - description: Non-tunable, fixed wavelength - color: '#95a5a6' - description: Wavelength tuning capability - - name: fec_type - kind: Dropdown - optional: true - choices: - - name: sd_fec - label: SD-FEC - description: Soft-decision FEC (7% overhead) - color: '#2196f3' - - name: hd_fec - label: HD-FEC - description: Hard-decision FEC (25% overhead) - color: '#ff9800' - - name: c_fec - label: C-FEC - description: Concatenated FEC - color: '#4caf50' - - name: o_fec - label: O-FEC - description: OpenFEC - color: '#9c27b0' - description: Forward error correction type - - name: client_interface - kind: Text - optional: true - description: Client-side interface (e.g., 100GE, 400GE, OTU4) - - name: line_interface - kind: Text - optional: true - description: Line-side interface (e.g., CFP2-DCO, QSFP28, QSFP-DD) - relationships: - - name: tuned_channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: true - identifier: dwdm_channel__transponder_modules - description: DWDM channel currently tuned/configured - - name: connected_to_optical_node - peer: DcimOpticalNode - cardinality: one - kind: Attribute - optional: true - identifier: optical_node__transponder_modules - description: Optical node this transponder module connects to (for cross-connects) -- name: OpticalMultiplexerModule - namespace: Dcim - include_in_menu: true - label: Optical Multiplexer Module - description: Multiplexer/Demultiplexer/ROADM module for wavelength management installed - in chassis - icon: mdi:router-network - inherit_from: - - DcimGenericModule - display_label: computed_name__value - human_friendly_id: - - computed_name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ module_bay__computed_name__value }}-MUX-{{ slot_number__value - }}' - description: Computed module name (e.g., dc1-leaf1 > slot 1-MUX-1/3) - - name: slot_number - kind: Text - optional: false - description: Slot number in chassis (e.g., '1/3', '1/4', '2/3') - - name: mux_type - kind: Dropdown - optional: false - choices: - - name: passive_mux - label: Passive Mux - description: Passive wavelength multiplexer (fixed) - color: '#95a5a6' - - name: passive_demux - label: Passive Demux - description: Passive wavelength demultiplexer (fixed) - color: '#7f8c8d' - - name: oadm - label: OADM - description: Optical Add-Drop Multiplexer - color: '#3498db' - - name: roadm - label: ROADM - description: Reconfigurable Optical Add-Drop Multiplexer - color: '#9b59b6' - - name: wss - label: WSS - description: Wavelength Selective Switch - color: '#e74c3c' - description: Type of multiplexer technology - - name: channel_capacity - kind: Number - optional: false - description: Number of supported DWDM channels (e.g., 40, 80, 96) - - name: technology - kind: Dropdown - optional: true - choices: - - name: thin_film_filter - label: Thin Film Filter - description: Passive thin film filter technology - color: '#95a5a6' - - name: awg - label: AWG - description: Arrayed Waveguide Grating - color: '#3498db' - - name: wss_lcos - label: WSS (LCOS) - description: Wavelength Selective Switch (Liquid Crystal on Silicon) - color: '#9b59b6' - - name: wss_mems - label: WSS (MEMS) - description: Wavelength Selective Switch (Micro-Electro-Mechanical Systems) - color: '#e74c3c' - description: Underlying multiplexer technology - - name: degree_count - kind: Number - optional: true - description: Number of ROADM degrees (e.g., 2, 4, 8, 16) - - name: colorless - kind: Boolean - optional: true - default_value: false - description: Colorless add/drop capability (any channel on any port) - - name: directionless - kind: Boolean - optional: true - default_value: false - description: Directionless add/drop capability (any port to any degree) - - name: contentionless - kind: Boolean - optional: true - default_value: false - description: Contentionless add/drop (CDC - Colorless, Directionless, Contentionless) - relationships: - - name: degrees - peer: DcimRoadmDegree - cardinality: many - kind: Component - optional: true - identifier: optical_multiplexer_module__degrees - description: ROADM degrees (line ports) on this multiplexer module - - name: mappings - peer: DcimChannelMapping - cardinality: many - kind: Attribute - optional: true - identifier: roadm_module__channel_mappings - description: Channel mappings (DirectConnect, CableMapping, FiberMapping) associated - with this module -- name: RoadmDegree - namespace: Dcim - include_in_menu: true - label: ROADM Degree - description: ROADM degree with line port (OL-1, OL-2, etc.) - icon: mdi:lan-connect - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - - - roadm - - degree_number__value - - - roadm - - line_port__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ roadm__computed_name__value }}-{{ line_port__value }}' - description: Computed name (e.g., ROADM-SITE-A-OL-1) - - name: degree_number - kind: Number - optional: false - description: Degree number (1-based, e.g., 1, 2, 3, 4) - - name: line_port - kind: Text - optional: false - description: Line port designation (e.g., OL-1, OL-2, OL-7) - - name: direction - kind: Dropdown - optional: false - choices: - - name: north - label: North - description: Northbound direction - color: '#3498db' - - name: south - label: South - description: Southbound direction - color: '#e74c3c' - - name: east - label: East - description: Eastbound direction - color: '#2ecc71' - - name: west - label: West - description: Westbound direction - color: '#f39c12' - - name: express - label: Express - description: Express port (bypass) - color: '#9b59b6' - - name: local - label: Local - description: Local add/drop - color: '#95a5a6' - description: Directional designation of degree - - name: degree_type - kind: Dropdown - optional: false - choices: - - name: line - label: Line - description: Line port (connects to fiber link) - color: '#2196f3' - - name: express - label: Express - description: Express port (R-x ports, bypass) - color: '#9c27b0' - - name: add_drop - label: Add/Drop - description: Local add/drop for transponders - color: '#4caf50' - description: Type of ROADM degree - - name: wavelength_capacity - kind: Number - optional: true - description: Number of wavelengths supported on this degree - - name: description - kind: Text - optional: true - description: Additional degree details - relationships: - - name: roadm - peer: DcimOpticalMultiplexerModule - cardinality: one - kind: Parent - optional: false - identifier: optical_multiplexer_module__degrees - description: Parent ROADM module containing this degree - - name: connected_fiber - peer: DcimFiberLink - cardinality: one - kind: Attribute - optional: true - identifier: fiber_link__roadm_degree - description: Fiber link connected to this line port - - name: channel_mappings - peer: DcimChannelMapping - cardinality: many - kind: Attribute - optional: true - identifier: roadm_degree__channel_mappings - description: Channel mappings involving this degree -- name: WSSConnect - namespace: Dcim - inherit_from: - - DcimChannelMapping - include_in_menu: true - label: WSS Connect - description: Internal WSS cross-connect between degrees on SAME ROADM device (0m - distance) - icon: mdi:swap-horizontal - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - - - roadm - - channel - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ roadm__computed_name__value }}-{{ channel__channel_name__value - }}' - description: Computed connection ID - - name: description - kind: Text - optional: true - description: Additional cross-connect details - relationships: - - name: roadm - peer: DcimOpticalMultiplexerModule - cardinality: one - kind: Attribute - optional: false - identifier: roadm_module__channel_mappings - description: Parent ROADM device -- name: CableMapping - namespace: Dcim - inherit_from: - - DcimChannelMapping - include_in_menu: true - label: Cable Mapping - description: Local patch cable between degrees on DIFFERENT ROADMs (meters distance, - same site) - icon: mdi:cable-data - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - - - cable - - channel - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ cable__label__value }}-{{ channel__channel_name__value - }}' - description: Computed mapping name (e.g., CABLE-123-CH58) - - name: description - kind: Text - optional: true - description: Additional cable mapping details - relationships: - - name: cable - peer: DcimCable - cardinality: one - kind: Attribute - optional: false - identifier: cable__channel_mappings - description: Physical patch cable connecting the degrees -- name: OpticalAmplifierModule - namespace: Dcim - include_in_menu: true - label: Optical Amplifier Module - description: Optical signal amplifier module (EDFA, Raman, VGC) installed in chassis - icon: mdi:amplifier - inherit_from: - - DcimGenericModule - display_label: computed_name__value - human_friendly_id: - - computed_name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ module_bay__computed_name__value }}-AMP-{{ slot_number__value - }}' - description: Computed module name (e.g., dc1-leaf1 > slot 1-AMP-1/5) - - name: slot_number - kind: Text - optional: false - description: Slot number in chassis (e.g., '1/5', '1/6', '2/5') - - name: amplifier_type - kind: Dropdown - optional: false - choices: - - name: edfa - label: EDFA - description: Erbium-Doped Fiber Amplifier - color: '#2196f3' - - name: raman - label: Raman - description: Raman Amplifier (distributed) - color: '#9c27b0' - - name: soa - label: SOA - description: Semiconductor Optical Amplifier - color: '#ff9800' - - name: vgc - label: VGC - description: Variable Gain Controller - color: '#4caf50' - - name: hybrid - label: Hybrid - description: Hybrid amplifier (e.g., EDFA + Raman) - color: '#607d8b' - description: Type of optical amplifier - - name: stage - kind: Dropdown - optional: false - choices: - - name: booster - label: Booster - description: Power amplifier (transmit side) - color: '#e74c3c' - - name: inline - label: Inline - description: In-line amplifier (along fiber span) - color: '#3498db' - - name: preamplifier - label: Pre-Amplifier - description: Low-noise amplifier (receive side) - color: '#2ecc71' - description: Amplifier stage position - - name: gain_db - kind: Text - optional: true - description: Typical gain in dB (e.g., '20.0', '17.5') - - name: max_output_power_dbm - kind: Text - optional: true - description: Maximum output power in dBm (e.g., '17.0', '23.0') - - name: noise_figure_db - kind: Text - optional: true - description: Noise figure in dB (e.g., '5.5', '4.8') - - name: operating_band - kind: Dropdown - optional: false - choices: - - name: c_band - label: C-Band (1530-1565nm) - description: C-Band operation - color: '#9933cc' - - name: l_band - label: L-Band (1565-1625nm) - description: L-Band operation - color: '#cc33cc' - - name: c_l_band - label: C+L-Band - description: Dual-band operation - color: '#ff33cc' - description: Operating wavelength band - relationships: - - name: amplified_link - peer: DcimFiberLink - cardinality: one - kind: Attribute - optional: true - identifier: fiber_link__amplifier_modules - description: Fiber link being amplified (for inline amplifiers) -- name: OpticalService - namespace: Dcim - include_in_menu: true - label: Optical Service - description: End-to-end optical transport service (customer circuit) spanning multiple - sites - icon: mdi:transit-connection-variant - display_label: service_name__value - human_friendly_id: - - service_id__value - uniqueness_constraints: - - - service_id__value - order_by: - - service_id__value - attributes: - - name: service_id - kind: Text - optional: false - description: Unique service identifier - - name: service_name - kind: Text - optional: false - description: 'Customer service name (e.g., ''ATC 10G - Albion to Arco #2'')' - - name: service_type - kind: Dropdown - optional: false - choices: - - name: wavelength - label: Wavelength Service - description: Dedicated wavelength end-to-end - color: '#9c27b0' - - name: transport - label: Transport Service - description: Layer 1 optical transport - color: '#2196f3' - - name: ip_transit - label: IP Transit - description: Layer 3 IP service over optical - color: '#4caf50' - description: Type of optical service - - name: bandwidth - kind: Text - optional: false - description: Service bandwidth (e.g., '10G', '100G', '400G') - - name: status - kind: Dropdown - optional: false - default_value: planned - choices: - - name: planned - label: Planned - description: Service planned but not provisioned - color: '#95a5a6' - - name: provisioned - label: Provisioned - description: Service configured but not active - color: '#f5a623' - - name: active - label: Active - description: Service in production - color: '#00cc00' - - name: maintenance - label: Maintenance - description: Service under maintenance - color: '#ff9800' - - name: failed - label: Failed - description: Service down - color: '#cc0000' - description: Service operational status - - name: customer_circuit_id - kind: Text - optional: true - description: Customer's circuit ID (e.g., '99/OKFS/000029//SYG') - - name: provision_date - kind: DateTime - optional: true - description: Date service was provisioned - - name: description - kind: Text - optional: true - description: Additional service details - relationships: - - name: transponders - peer: DcimTransponderModule - cardinality: many - min_count: 2 - max_count: 2 - kind: Attribute - optional: false - identifier: transponder_module__optical_services - description: Two transponders (endpoints) for this service (bidirectional) - - name: channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: false - identifier: dwdm_channel__services - description: DWDM channel used for this service - - name: primary_path - peer: DcimOpticalPath - cardinality: one - kind: Component - optional: false - identifier: optical_service__primary_path - description: Primary optical path for this service - - name: backup_path - peer: DcimOpticalPath - cardinality: one - kind: Component - optional: true - identifier: optical_service__backup_path - description: Backup/protection path for this service -- name: OpticalPath - namespace: Dcim - include_in_menu: true - label: Optical Path - description: Ordered sequence of segments forming an optical path through the network - icon: mdi:map-marker-path - display_label: name__value - human_friendly_id: - - name__value - attributes: - - name: name - kind: Text - optional: false - unique: true - description: Path name (e.g., MS-W17D5-primary) - - name: path_type - kind: Dropdown - optional: false - choices: - - name: primary - label: Primary - description: Primary working path - color: '#2196f3' - - name: backup - label: Backup - description: Backup/protection path - color: '#ff9800' - - name: express - label: Express - description: Express bypass path - color: '#9c27b0' - description: Type of path (primary, backup, express) - - name: total_distance_km - kind: Text - optional: true - description: Total path distance in kilometers - - name: total_loss_db - kind: Text - optional: true - description: Total optical loss in dB - - name: hop_count - kind: Number - optional: true - description: Number of ROADM hops in path - - name: is_active - kind: Boolean - optional: false - default_value: true - description: Whether this path is currently active - relationships: - - name: segments - peer: DcimPathSegment - identifier: optical_path__segments - cardinality: many - kind: Component - optional: true - description: Ordered segments forming this path - - name: is_primary_of_service - peer: DcimOpticalService - identifier: optical_service__primary_path - cardinality: one - kind: Attribute - optional: true - description: Optical service using this path - - name: is_backup_of_service - peer: DcimOpticalService - identifier: optical_service__backup_path - cardinality: one - kind: Attribute - optional: true - description: Optical service using this path as backup -- name: PathSegment - namespace: Dcim - include_in_menu: true - label: Path Segment - description: One hop in optical path - references channel mapping (fiber, cable, - or cross-connect) - icon: mdi:ray-start-arrow - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - - - path - - segment_order__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: '{{ path__name__value }}-SEG{{ segment_order__value }}' - description: Computed segment name (e.g., MS-W17D5-primary-SEG1) - - name: segment_order - kind: Number - optional: false - description: Order of this segment in the path (1, 2, 3...) - - name: segment_type - kind: Dropdown - optional: false - choices: - - name: fiber - label: Fiber - description: Segment traverses a long-haul fiber link - color: '#2196f3' - - name: cross_connect - label: Cross-Connect - description: Segment crosses through ROADM degrees (internal WSS) - color: '#9c27b0' - - name: cable - label: Cable - description: Segment traverses a local patch cable - color: '#ff9800' - - name: add - label: Add - description: Service added at this point (A-end) - color: '#4caf50' - - name: drop - label: Drop - description: Service dropped at this point (Z-end) - color: '#ff5722' - description: Type of segment - - name: loss_db - kind: Text - optional: true - description: Optical loss for this segment in dB - relationships: - - name: path - peer: DcimOpticalPath - cardinality: one - kind: Parent - optional: false - identifier: optical_path__segments - description: Parent path containing this segment - - name: channel_mapping - peer: DcimChannelMapping - cardinality: one - kind: Attribute - on_delete: cascade - optional: true - identifier: channel_mapping__path_segments - description: Channel mapping (WSS Connect, Cable Mapping, or Fiber Mapping) -extensions: - nodes: - - kind: DcimPhysicalDevice - relationships: - - name: optical_node - peer: DcimOpticalNode - kind: Generic - optional: true - cardinality: many - identifier: optical_nodes__physical_device - -``` \ No newline at end of file diff --git a/docs/docs/reference/otn.mdx b/docs/docs/reference/otn.mdx new file mode 100644 index 00000000..039c336a --- /dev/null +++ b/docs/docs/reference/otn.mdx @@ -0,0 +1,3875 @@ +--- +title: OTN +--- + +Optical transport network schemas covering the physical plant, the wavelength catalog, optical devices and their ports, pluggable optics, carriers and end-to-end services. + +## Details + +- **Dependencies:** + - [base](dcim) + - [extensions/location_site](location_site) + - [extensions/transceiver](transceiver) + +## Use cases + +This extension covers: +- Recording the ITU-T G.694.1 dense grid and G.694.2 coarse plan as separate kinds, so a carrier pointed at the wrong plan is refused when written. +- Tracking pluggable optics as inventory, with the part number in this extension's catalog, the serial on the library's transceiver kinds from extensions/transceiver, and which optical port each unit is fitted in. +- Modelling the outside plant, including fiber types, conduits, spans and the optical multiplex sections built over them. A section terminates on any OMS endpoint, so a fixed point-to-point system built from passive multiplexers is modellable without a ROADM. +- Cabling optical gear with extensions/cable. Every OTN port kind inherits DcimEndpoint, so a DcimCable terminates on one for intra-site jumpers, through a DcimPatchPanel where a panel sits in the run. +- Provisioning a wavelength end to end, as a service with an optical path and its hops through the elements the light crosses. Each hop records what the element does to the carrier and across which port pair, so a ROADM cross-connect reads either from the path or from the ROADM's own ports. +- Modelling optical protection, with a working and a protect path on one service, a diversity group that keeps two services off shared plant, and OtnSplitter for the coupler that feeds both legs. + +Out of scope, and what to reach for instead: +- Validation of what a schema cannot express, such as which port kind may hold a pluggable, whether a mux client port binds a channel on the same plan its multiplexer declares, or whether a hop's ingress and egress ports belong to that hop's own element. This extension ships no checks; the schema comments mark each such rule. +- Device types, platforms and rack elevations for optical gear, as native OTN fields. Model the physical asset as a DcimPhysicalDevice and link it with OtnGenericDevice.dcim_device; that edge reaches device_type, platform, position and rack_face, and a location that may be a LocationRack. Nothing keeps OtnGenericDevice.site in agreement with the site above that rack. +- Optical performance monitoring. The schema carries ratings and settings, such as a port's transmit power or a mode's required OSNR, but nothing that is measured, such as live power, OSNR, pre-FEC BER or an error counter. Those change continuously and belong in the network management system or a time series store. +- Optical path budgets, including the record of design. OtnOpticalPath records which elements the light crosses, in what order and across which ports, but carries no loss, OSNR margin or latency for that route, so a turn-up figure has nowhere to live. OtnService.max_latency_ns is a commitment on the service, not a measurement of a path. Compute budgets in a planning tool such as GNPy. +- Frequency plans other than one fixed dense grid. OtnFrequencyGrid models a single ITU-T G.694.1 fixed 50 GHz plan across the C band, from 191.35 to 196.10 THz. L band, C plus L systems, flexgrid and other channel spacings are out of scope. +- Protection mechanisms. OtnOpticalPath.path_role marks a path as working or protect and OtnDiversityGroup keeps two services apart, but nothing states the scheme, so 1+1, 1:1, optical line protection, OMS protection and ODU SNCP are indistinguishable. Switching thresholds and hold-off timers are out of scope with it. OtnSplitter models the coupler such a scheme is built from. +- The OTU and OPU layers of ITU-T G.709. The model goes from the optical channel, OtnOpticalCarrier, straight to the ODU, OtnContainer. Forward error correction lives on OtnOpticalMode, so what an OTU would add is its section monitoring and framing overhead, which are not modelled. + +## Nodes + +### RouterPort + +- **Label:** Router port +- **Description:** Grey optics on an IP router. Not on the C-band grid. +- **Namespace:** Otn +- **Icon:** mdi:ethernet +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| transceiver | DcimGenericTransceiver | True | one | Attribute | + +### ClientPort + +- **Label:** Client port +- **Description:** Transponder client side. Where grey light arrives. +- **Namespace:** Otn +- **Icon:** mdi:lan-connect +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| transceiver | DcimGenericTransceiver | True | one | Attribute | + +### LinePort + +- **Label:** Line port +- **Description:** Transponder DWDM line side. Where coloured light leaves. +- **Namespace:** Otn +- **Icon:** mdi:transit-connection +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| carrier | OtnOpticalCarrier | True | one | Attribute | +| transceiver | DcimGenericTransceiver | True | one | Attribute | + +### RoadmAddDropPort + +- **Label:** ROADM add/drop port +- **Description:** Local add and drop on a ROADM. +- **Namespace:** Otn +- **Icon:** mdi:call-split +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +### RoadmDegreePort + +- **Label:** ROADM degree port +- **Description:** Line-facing degree on a ROADM. One per direction. +- **Namespace:** Otn +- **Icon:** mdi:compass-outline +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| direction | How operators label this degree. Until now the port name was the only place to say it. | Dropdown | True | | north, south, east, west, express, local | +| wavelength_capacity | Nameplate wavelengths this degree is rated to pass, such as 40, 80 or 96. Not a count in use. | Number | True | | | + +### AmplifierPort + +- **Label:** Amplifier port +- **Description:** Amplifier input or output. +- **Namespace:** Otn +- **Icon:** mdi:amplifier +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +### SplitterPort + +- **Label:** Splitter port +- **Description:** The common side of a splitter, or one of its output legs. +- **Namespace:** Otn +- **Icon:** mdi:call-split +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| leg | Whether this port is the common side or an output leg. | Dropdown | False | output | common, output | + +### MuxClientPort + +- **Label:** Mux client port +- **Description:** One channel of a multiplexer. The side facing the transponder or router that lights it. +- **Namespace:** Otn +- **Icon:** mdi:import +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| dwdm_channel | OtnFrequencyGrid | True | one | Attribute | +| cwdm_channel | OtnCwdmChannel | True | one | Attribute | + +### MuxLinePort + +- **Label:** Mux line port +- **Description:** The common side of a multiplexer, where the whole band leaves. +- **Namespace:** Otn +- **Icon:** mdi:export +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnOpticalPort + +### TributaryPort + +- **Label:** Tributary port +- **Description:** E1 or T1 G.703 electrical tributary. The only copper port here. +- **Namespace:** Otn +- **Icon:** mdi:cable-data +- **Inherit From:** DcimEndpoint, OtnGenericPort, OtnCopperPort + +### TransceiverType + +- **Label:** Transceiver type +- **Description:** A pluggable optic part number and what it can be made to do. +- **Namespace:** Otn +- **Icon:** mdi:chip +- **Human Friendly ID:** part_number__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| part_number | Vendor part number, such as QDD-400G-ZRP-S. | Text | False | | | +| description | | Text | True | | | +| form_factor | The cage this part fits. It decides which ports can hold it. | Dropdown | False | | QSFP-DD, QSFP28, OSFP, CFP2-DCO, CFP2-ACO, SFP28, SFP+ | +| tunable | Whether the laser can be tuned across the grid or is fixed at one wavelength. | Boolean | False | False | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| supported_modes | OtnOpticalMode | True | many | Attribute | +| manufacturer | OrganizationManufacturer | True | one | Attribute | + +### FiberType + +- **Label:** Fiber type +- **Description:** Single-mode fiber family. Attenuation, dispersion and group index at 1550 nm. +- **Namespace:** Otn +- **Icon:** mdi:cable-data +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | ITU-T designation, such as G.652.D. | Text | False | | | +| description | | Text | True | | | +| attenuation_coefficient_mdb_per_km | Attenuation at 1550 nm in millidecibels per kilometre. 0.20 dB/km is 200. Wrong for CWDM. | Number | False | | | +| attenuation_coefficient_display | Attenuation in dB/km. Read-only, derived from attenuation_coefficient_mdb_per_km. | Text | True | | | +| dispersion_fs_per_nm_km | Chromatic dispersion at 1550 nm in femtoseconds per nm per km. 17 ps/nm/km is 17000. | Number | False | | | +| dispersion_display | Dispersion in ps/nm/km. Read-only, derived from dispersion_fs_per_nm_km. | Text | True | | | +| group_index_milli | Group index at 1550 nm in milli-units. 1.468 is 1468. Sets propagation delay. | Number | False | 1468 | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| spans | OtnFiberSpan | True | many | Attribute | + +### Conduit + +- **Label:** Conduit +- **Description:** Shared-risk link group. Two routes through one conduit are not diverse. +- **Namespace:** Otn +- **Icon:** mdi:pipe +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| owner | Who owns the trench. Often not the network operator. | Text | True | | | +| description | | Text | True | | | +| status | Lifecycle state of the duct itself, independent of the spans pulled through it. | Dropdown | False | active | planned, active, standby, maintenance, failed, decommissioned | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| spans | OtnFiberSpan | True | many | Attribute | + +### FiberSpan + +- **Label:** Fiber span +- **Description:** One amplifier-to-amplifier fiber section. Lossy, but not racked and not a device. +- **Namespace:** Otn +- **Icon:** mdi:vector-line +- **Human Friendly ID:** name__value +- **Inherit From:** OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| description | | Text | True | | | +| oms_sequence | Position of this span within its optical multiplex section, counting from the A end. | Number | True | | | +| status | Lifecycle state of the span. A planned span is designed but not yet spliced through. | Dropdown | False | active | planned, active, standby, maintenance, failed, decommissioned | +| commissioned_date | When the span was accepted into service. A recorded fact, not a reading. | DateTime | True | | | +| length_m | Route length in metres, not straight-line distance. 500 km is the practical ceiling. | Number | False | | | +| length_display | Route length in km. Read-only, derived from length_m. | Text | True | | | +| splice_count | Fusion splices along the span. Roughly one per drum of cable. | Number | False | 0 | | +| splice_loss_mdb | Loss per splice in millidecibels. 0.05 dB is 50. | Number | False | 50 | | +| connector_count | Mated connector pairs on the span, normally one at each end. | Number | False | 2 | | +| connector_loss_mdb | Loss per mated connector pair in millidecibels. 0.3 dB is 300. | Number | False | 300 | | +| aging_margin_mdb | Reserved margin for repairs and ageing, in millidecibels. 1.5 dB is 1500. | Number | False | 1500 | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| fiber_type | OtnFiberType | False | one | Attribute | +| site_a | LocationSite | False | one | Attribute | +| site_b | LocationSite | False | one | Attribute | +| conduit | OtnConduit | True | one | Attribute | +| oms | OtnOpticalMultiplexSection | True | one | Attribute | +| raman_pumps | OtnRamanPump | True | many | Attribute | +| terminating_ports | OtnGenericPort | True | many | Attribute | + +### OpticalMultiplexSection + +- **Label:** Optical multiplex section +- **Description:** Groups the ordered spans and inline amplifiers between two OMS endpoints. +- **Namespace:** Otn +- **Icon:** mdi:ray-start-end +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| description | | Text | True | | | +| status | Lifecycle state of the section as a whole, not of the spans it groups. | Dropdown | False | active | planned, active, standby, maintenance, failed, decommissioned | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| endpoint_a | OtnOmsEndpoint | False | one | Attribute | +| endpoint_b | OtnOmsEndpoint | False | one | Attribute | +| spans | OtnFiberSpan | True | many | Attribute | +| amplifiers_a2b | OtnAmplifier | True | many | Attribute | +| amplifiers_b2a | OtnAmplifier | True | many | Attribute | + +### FrequencyGrid + +- **Label:** Frequency grid channel +- **Description:** One ITU-T G.694.1 channel. 50 GHz fixed grid, 191.35 to 196.10 THz. +- **Namespace:** Otn +- **Icon:** mdi:sine-wave +- **Human Friendly ID:** center_frequency_mhz__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| channel_number | ITU channel number, 1 to 96. Channel 1 is 191.35 THz. Derived from the centre frequency. | Text | True | | | +| center_frequency_mhz | Centre frequency in MHz. Channel n is 191350000 + (n - 1) x 50000. | Number | False | | | +| center_frequency_display | Centre frequency in THz. Byte-identical to the optical-port rendering. | Text | True | | | +| center_wavelength_display | Centre wavelength in nm, derived from the centre frequency. | Text | True | | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| carriers | OtnOpticalCarrier | True | many | Attribute | + +### CwdmChannel + +- **Label:** CWDM wavelength +- **Description:** One ITU-T G.694.2 coarse wavelength. 20 nm spacing, 1271 to 1611 nm. +- **Namespace:** Otn +- **Icon:** mdi:palette-swatch-variant +- **Human Friendly ID:** center_wavelength_nm__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| center_wavelength_nm | Nominal central wavelength in nm. Wavelength n is 1271 + (n - 1) x 20. | Number | False | | | +| band | ITU band, derived from the wavelength. Only the two C-band wavelengths sit in the erbium window. | Text | True | | | + +### OpticalMode + +- **Label:** Optical mode +- **Description:** What a transponder or coherent pluggable can do. Reach and required OSNR are data, not assumptions. +- **Namespace:** Otn +- **Icon:** mdi:waveform +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| mode_class | Two values, and the pluggable-reach report filters on it. | Dropdown | False | transponder | transponder, pluggable | +| modulation | | Dropdown | False | | DP-QPSK, DP-8QAM, DP-16QAM, DP-64QAM | +| description | | Text | True | | | +| line_rate_gbps | Client-side capacity in Gbps. Already a whole number in its natural unit. | Number | False | | | +| baud_mbaud | Symbol rate in megabaud. 59.84 GBd is 59840. Sets the spectral width. | Number | False | | | +| required_osnr_mdb | OSNR needed at the receiver, in millidecibels. 26 dB is 26000. | Number | False | | | +| required_osnr_display | Required OSNR in dB. Read-only, derived from required_osnr_mdb. | Text | True | | | +| cd_tolerance_fs_per_nm | Chromatic dispersion the receiver compensates, in fs/nm. 100000 ps/nm is 100000000. | Number | False | | | +| nominal_reach_m | Vendor-quoted reach in metres. A starting point for the budget, not a guarantee. | Number | False | | | +| nominal_reach_display | Nominal reach in km. Read-only, derived from nominal_reach_m. | Text | True | | | +| fec_type | | Dropdown | False | SD-FEC | none, GFEC, SD-FEC, cFEC, oFEC | +| fec_latency_ns | Encoder and decoder latency in nanoseconds. Small next to propagation, but not zero. | Number | False | 0 | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| carriers | OtnOpticalCarrier | True | many | Attribute | + +### ClientSignal + +- **Label:** Client signal +- **Description:** What a customer hands over, and the container it maps into. +- **Namespace:** Otn +- **Icon:** mdi:import +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| alias | The SONET name where one exists. STM-16 is OC-48. | Text | True | | | +| layer | Grouping the catalog by layer is the first thing a reader does. | Dropdown | False | | ethernet, sdh, pdh, fibre_channel, infiniband | +| auto_selectable | May the rate rule pick this signal when a service states none. | Boolean | False | False | | +| description | | Text | True | | | +| bit_rate_kbps | Nominal line rate in kbps. E1 is 2048, 100GBASE-LR4 is 103100000. | Number | False | | | +| bit_rate_display | Bit rate in Mbps below one gigabit, Gbps at or above it. | Text | True | | | +| default_container_type | The first step of the mapping chain, not the last. E1 maps into VC-12, not ODU1. | Dropdown | False | | ODU0, ODU1, ODU2, ODU2e, ODU3, ODU4, ODUC1, ODUC2, ODUC3, ODUC4, ODUflex, VC-12, VC-4, STM-N | +| default_mapping | ITU-T G.709 mapping procedure. Generic, bit-synchronous or asynchronous. | Dropdown | False | | GMP, BMP, AMP | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| containers | OtnContainer | True | many | Attribute | +| services | OtnService | True | many | Attribute | + +### Container + +- **Label:** Container +- **Description:** ODU or SDH virtual container. The digital adaptation layer between a client and a wavelength. +- **Namespace:** Otn +- **Icon:** mdi:package-variant-closed +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| odu_type | | Dropdown | False | | ODU0, ODU1, ODU2, ODU2e, ODU3, ODU4, ODUC1, ODUC2, ODUC3, ODUC4, ODUC6, ODUC8, ODUflex, VC-12, VC-4, STM-N | +| mapping_mode | | Dropdown | False | GMP | GMP, BMP, AMP | +| description | | Text | True | | | +| segment_sequence | Which segment of its circuit this container rides. 1 for a circuit that spans one wavelength. | Number | False | 1 | | +| tributary_slots | Slots this container occupies in its parent. An ODU2 in an ODU4 takes 8. | Number | False | 0 | | +| tributary_slot_capacity | Slots this container offers to its children. An ODU4 offers 80. | Number | False | 0 | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| carrier | OtnOpticalCarrier | True | one | Attribute | +| client_signal | OtnClientSignal | True | one | Attribute | +| parent_container | OtnContainer | True | one | Attribute | +| service | OtnService | True | one | Attribute | +| child_containers | OtnContainer | True | many | Attribute | + +### Router + +- **Label:** Router +- **Description:** IP router. Light terminates here, so its insertion loss stays at the zero default. +- **Namespace:** Otn +- **Icon:** mdi:router +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +### Transponder + +- **Label:** Transponder +- **Description:** Client to DWDM line adaptation. +- **Namespace:** Otn +- **Icon:** mdi:transit-connection-variant +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +### Roadm + +- **Label:** ROADM +- **Description:** Reconfigurable optical add/drop multiplexer. +- **Namespace:** Otn +- **Icon:** mdi:call-split +- **Inherit From:** OtnGenericDevice, OtnOmsEndpoint, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| channel_capacity | Nameplate channels this ROADM is rated for, such as 40, 80 or 96. Not a count in use. | Number | True | | | +| colorless | Any add/drop port can take any wavelength, so assignment is not fixed per port. | Boolean | True | | | +| directionless | An added wavelength can leave by any degree, so assignment does not pick a degree. | Boolean | True | | | +| contentionless | The same wavelength can be added twice toward different degrees without blocking. | Boolean | True | | | +| technology | How the switch is built. Nameplate data, often unknown. | Dropdown | True | | wss_lcos, wss_mems, broadcast_select | + +### Amplifier + +- **Label:** Amplifier +- **Description:** Inline, booster or pre-amplifier. +- **Namespace:** Otn +- **Icon:** mdi:amplifier +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| amplifier_type | Nameplate amplifier technology. A Raman-only pump is its own kind, OtnRamanPump. | Dropdown | True | | edfa, soa, hybrid | +| stage | Nameplate stage this amplifier is built for, not a position derived from the plant. | Dropdown | True | | booster, inline, preamp | +| noise_figure_mdb | Noise figure in millidecibels. 4.0 dB is 4000. Sets the ASE this stage adds. | Number | False | 4000 | | +| noise_figure_display | Noise figure in dB. Read-only, derived from noise_figure_mdb. | Text | True | | | +| gain_mdb | Gain in millidecibels. 22.0 dB is 22000. Must cover the loss ahead of the input. | Number | False | 22000 | | +| gain_display | Gain in dB. Read-only, derived from gain_mdb. | Text | True | | | +| oms_sequence | Position in this amplifier's own chain, counting along the direction it amplifies. | Number | True | | | +| max_total_output_power_mdbm | Rated total output power in milli-dBm, 0 to +30 dBm. A nameplate ceiling, not a reading. | Number | True | | | +| max_total_output_power_display | Rated total output power in dBm. Read-only, derived from max_total_output_power_mdbm. | Text | True | | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| oms_a2b | OtnOpticalMultiplexSection | True | one | Attribute | +| oms_b2a | OtnOpticalMultiplexSection | True | one | Attribute | + +### MuxDemux + +- **Label:** Mux/demux +- **Description:** Passive multiplexer. A dense AWG on the core, a coarse thin-film filter on a tail. +- **Namespace:** Otn +- **Icon:** mdi:call-merge +- **Inherit From:** OtnGenericDevice, OtnOmsEndpoint, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| channel_capacity | Nameplate channels this multiplexer is rated for, such as 8, 16, 40 or 96. Not a count in use. | Number | True | | | +| plan | Which wavelength plan this multiplexer multiplexes. | Dropdown | False | dwdm | dwdm, cwdm | +| mux_role | What this passive device does with the channels it carries. | Dropdown | False | mux_demux | mux, demux, mux_demux, oadm | +| technology | How the device separates wavelengths. Nameplate data, often unknown. | Dropdown | True | | thin_film_filter, awg, interleaver | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| cwdm_channels | OtnCwdmChannel | True | many | Attribute | + +### PatchPanel + +- **Label:** Patch panel +- **Description:** Optical distribution frame. Carries connector loss. +- **Namespace:** Otn +- **Icon:** mdi:view-grid-outline +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +### RamanPump + +- **Label:** Raman pump +- **Description:** Pump laser injecting Raman gain into one fiber span. +- **Namespace:** Otn +- **Icon:** mdi:laser-pointer +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| on_off_gain_mdb | Raman on-off gain in millidecibels. 10.0 dB is 10000. | Number | False | 10000 | | +| on_off_gain_display | On-off gain in dB. Read-only, derived from on_off_gain_mdb. | Text | True | | | +| injection_end | Which end of its span the pump is injected at, named against the span's own site_a and site_b. | Dropdown | False | site_b | site_a, site_b | +| propagation | Whether the pump fires against the signal or with it. | Dropdown | False | counter | counter, co | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| span | OtnFiberSpan | False | one | Attribute | + +### OduSwitch + +- **Label:** ODU switch +- **Description:** O-E-O device. Terminates one wavelength, originates the next, as a regenerator or ODU cross-connect. +- **Namespace:** Otn +- **Icon:** mdi:swap-horizontal-variant +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| switching_mode | Whether the device carries the whole payload through or demultiplexes and regroups containers. | Dropdown | False | regenerator | regenerator, cross_connect | +| framing_latency_ns | Delay this device adds in nanoseconds, from framing and from the electrical crossing. | Number | False | 0 | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| carriers | OtnOpticalCarrier | True | many | Attribute | + +### Splitter + +- **Label:** Splitter +- **Description:** Passive splitter or coupler. Divides one carrier across several legs. +- **Namespace:** Otn +- **Icon:** mdi:call-split +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| split_type | How the input is divided across the output legs. | Dropdown | False | even | even, tap | +| output_count | Number of output legs, such as 2 for a 1:2 or 8 for a 1:8. | Number | False | 2 | | +| tap_ratio_percent | Share taken by the tap leg, as a percentage. 10 is a 90/10 tap. Null on an even split. | Number | True | | | + +### FixedAttenuator + +- **Label:** Fixed attenuator +- **Description:** A pad. One fixed amount of loss, patched into a link that arrives too hot. +- **Namespace:** Otn +- **Icon:** mdi:filter-outline +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| attenuation_mdb | Attenuation the pad is set to, in millidecibels. 5.0 dB is 5000. | Number | False | 0 | | +| attenuation_display | Attenuation in dB. Read-only, derived from attenuation_mdb. | Text | True | | | + +### VariableAttenuator + +- **Label:** Variable attenuator +- **Description:** A VOA. The same loss, dialled rather than fixed, within the range the hardware has. +- **Namespace:** Otn +- **Icon:** mdi:tune-variant +- **Inherit From:** OtnGenericDevice, OtnOpticalElement + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| attenuation_mdb | Attenuation the pad is set to, in millidecibels. 5.0 dB is 5000. | Number | False | 0 | | +| attenuation_display | Attenuation in dB. Read-only, derived from attenuation_mdb. | Text | True | | | +| max_attenuation_mdb | Largest attenuation this device can be dialled to, in millidecibels. | Number | False | | | +| max_attenuation_display | Maximum attenuation in dB. Read-only, derived from max_attenuation_mdb. | Text | True | | | + +### OpticalCarrier + +- **Label:** Optical carrier +- **Description:** One provisioned wavelength. Occupies its channel on every section it crosses. +- **Namespace:** Otn +- **Icon:** mdi:waves +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| description | | Text | True | | | +| status | | Dropdown | False | active | planned, reserved, active, decommissioned | +| provisioned_date | When the wavelength was turned up. A recorded fact, not a reading. | DateTime | True | | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| channel | OtnFrequencyGrid | False | one | Attribute | +| optical_mode | OtnOpticalMode | True | one | Attribute | +| optical_path | OtnOpticalPath | True | many | Attribute | +| sections | OtnOpticalMultiplexSection | True | many | Attribute | +| containers | OtnContainer | True | many | Attribute | +| odu_switches | OtnOduSwitch | True | many | Attribute | +| line_ports | OtnLinePort | True | many | Attribute | + +### Service + +- **Label:** Service +- **Description:** Customer intent. Two endpoints, a rate, a profile and an optional latency budget. +- **Namespace:** Otn +- **Icon:** mdi:file-document-outline +- **Human Friendly ID:** name__value +- **Inherit From:** CoreArtifactTarget + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| description | | Text | True | | | +| external_circuit_id | The customer's or partner's own reference for this circuit, where `name` is ours. | Text | True | | | +| rate_gbps | Requested client capacity in Gbps. Already whole in its natural unit. | Number | False | | | +| sla | | Dropdown | False | silver | gold, silver, bronze, best_effort | +| status | | Dropdown | False | planned | planned, provisioning, active, maintenance, failed, rejected, decommissioned | +| provisioned_date | When the circuit was handed to the customer. A recorded fact, not a reading. | DateTime | True | | | +| service_type | Which kind of service this is. | Dropdown | False | wavelength | wavelength, transport, ip_transit | +| max_latency_ns | One-way latency budget in nanoseconds. Null when the service commits to none. | Number | True | | | +| max_latency_display | Latency budget in microseconds. Read-only, derived from max_latency_ns. | Text | True | | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| endpoint_a | OtnGenericDevice | False | one | Attribute | +| endpoint_z | OtnGenericDevice | False | one | Attribute | +| optical_path | OtnOpticalPath | True | many | Component | +| client_signal | OtnClientSignal | True | one | Attribute | +| diversity_group | OtnDiversityGroup | True | one | Attribute | +| containers | OtnContainer | True | many | Attribute | +| customer | OrganizationGeneric | False | one | Attribute | + +### DiversityGroup + +- **Label:** Diversity group +- **Description:** A declared diversity requirement. The services in one group must route over disjoint conduits. +- **Namespace:** Otn +- **Icon:** mdi:call-split +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| description | | Text | True | | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| services | OtnService | True | many | Attribute | + +### OpticalPath + +- **Label:** Optical path +- **Description:** The materialised chosen route for one service. +- **Namespace:** Otn +- **Icon:** mdi:map-marker-path +- **Uniqueness Constraints:** + - service, segment_sequence__value, path_role__value +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| description | | Text | True | | | +| segment_sequence | Which segment of its circuit this path is. 1 for a circuit that spans one wavelength. | Number | False | 1 | | +| path_role | Which role this path plays for its service, working, protect or express. | Dropdown | False | working | working, protect, express | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| service | OtnService | False | one | Parent | +| carrier | OtnOpticalCarrier | True | one | Attribute | +| hops | OtnPathHop | True | many | Component | + +### PathHop + +- **Label:** Path hop +- **Description:** One ordered element on a path. +- **Namespace:** Otn +- **Icon:** mdi:ray-vertex +- **Uniqueness Constraints:** + - path, sequence__value +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| sequence | Position along the path, counting from the endpoint A ROADM. | Number | False | | | +| action | What this element does to the carrier at this hop. | Dropdown | True | | add, drop, express, through, terminate | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| path | OtnOpticalPath | False | one | Parent | +| element | OtnOpticalElement | False | one | Attribute | +| ingress_port | OtnGenericPort | True | one | Attribute | +| egress_port | OtnGenericPort | True | one | Attribute | + +### Facility + +- **Label:** Facility +- **Description:** A supercomputing facility hosted at a PoP. +- **Namespace:** Otn +- **Icon:** ri:cpu-line +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | | | | +| description | | Text | True | | | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| site | LocationSite | True | one | Attribute | + +## Generics + +### GenericPort + +- **Label:** Port +- **Description:** Any port on any OTN device. The connection surface of the network. +- **Namespace:** Otn +- **Icon:** mdi:ethernet +- **Uniqueness Constraints:** + - device, name__value +- **Human Friendly ID:** device__name__value, name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | Port identifier as the vendor labels it, such as 1/1/1. | Text | False | | | +| description | | Text | True | | | +| role | | Dropdown | False | spare | client, line, add_drop, degree, express, booster, preamp, tributary, spare, monitor | +| enabled | | Boolean | False | True | | +| admin_state | RFC 2863 ifAdminStatus. What the operator asked for. | Dropdown | False | up | up, down, testing | +| oper_state | RFC 2863 ifOperStatus subset. What the port actually does. | Dropdown | False | down | up, down, testing, dormant, unknown | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| device | OtnGenericDevice | False | one | Parent | +| hops_ingress | OtnPathHop | True | many | Attribute | +| hops_egress | OtnPathHop | True | many | Attribute | + +### OpticalElement + +- **Label:** Optical element +- **Description:** Anything light passes through and loses power in. +- **Namespace:** Otn +- **Icon:** mdi:blur-linear + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| insertion_loss_mdb | Insertion loss in millidecibels, 0 to 60 dB. No Float kind exists. | Number | False | 0 | | +| insertion_loss_display | Insertion loss in dB. Read-only, derived from insertion_loss_mdb. | Text | True | | | +| vendor | | Text | True | | | +| model | | Text | True | | | + +### OmsEndpoint + +- **Label:** OMS endpoint +- **Description:** A device that can terminate an optical multiplex section. +- **Namespace:** Otn +- **Icon:** mdi:ray-start-end + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| sections_a | OtnOpticalMultiplexSection | True | many | Attribute | +| sections_b | OtnOpticalMultiplexSection | True | many | Attribute | + +### GenericDevice + +- **Label:** Device +- **Description:** Anything racked at a site. +- **Namespace:** Otn +- **Icon:** mdi:server +- **Human Friendly ID:** name__value + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | +| status | | Dropdown | False | active | planned, provisioning, active, maintenance, decommissioned | +| role | | Dropdown | False | | core, edge, access, passive | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| site | LocationSite | True | one | Attribute | +| dcim_device | DcimPhysicalDevice | True | one | Attribute | +| ports | OtnGenericPort | True | many | Component | + +### OpticalPort + +- **Label:** Optical port +- **Description:** Optical-specific port properties. +- **Namespace:** Otn +- **Icon:** mdi:lightbulb-on-outline + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| center_frequency_mhz | ITU-T G.694.1 centre frequency in MHz. No Float kind exists. | Number | True | | | +| center_frequency_display | Centre frequency in THz. Empty on a grey port, which has none. | Text | True | | | +| tx_power_mdbm | Transmit power in milli-dBm, -30 to +30 dBm. | Number | True | | | +| tx_power_display | Transmit power in dBm. Read-only, derived from tx_power_mdbm. | Text | True | | | +| rx_sensitivity_mdbm | Receiver sensitivity in milli-dBm, -40 to +10 dBm. | Number | True | | | +| rx_sensitivity_display | Receiver sensitivity in dBm. Derived from rx_sensitivity_mdbm. | Text | True | | | +| connector_type | | Dropdown | True | | LC, SC, MPO-12, MPO-16, FC, E2000, MU, CS, splice | +| polish | Endface polish. Mating an APC to a UPC costs about 0.5 dB and reflects. | Dropdown | True | | UPC, APC, PC, none | + +### CopperPort + +- **Label:** Copper port +- **Description:** Electrical port properties for G.703 tributaries. +- **Namespace:** Otn +- **Icon:** mdi:cable-data + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| speed_kbps | Line rate in kbps. E1 is 2048, T1 is 1544, STM-1 is 155520. | Number | False | 2048 | | +| impedance_ohm | Nominal impedance in ohms. 120 for E1 pair, 75 for coax. | Number | False | 120 | | +| connector_type | | Dropdown | False | RJ48 | BNC, RJ48, RJ45 | + +## Extensions + +:::note + +In this context "extensions" refer to modifications or additions to the existing schema, such as adding new attributes, relationships, or other schema elements. + +::: + +### LocationSite + +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| latitude_microdeg | Latitude in millionths of a degree. No Float kind exists. | Number | True | | | +| longitude_microdeg | Longitude in millionths of a degree. No Float kind exists. | Number | True | | | +| site_type | A PoP hosting OTN equipment, or a customer site handing traffic to one. | Dropdown | True | | pop, customer | + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| otn_devices | OtnGenericDevice | True | many | Generic | +| spans_a | OtnFiberSpan | True | many | Attribute | +| spans_b | OtnFiberSpan | True | many | Attribute | +| otn_facility | OtnFacility | True | one | Attribute | + +### DcimGenericTransceiver + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| otn_port | OtnOpticalPort | True | one | Attribute | +| otn_type | OtnTransceiverType | True | one | Attribute | + +## Code + +```yaml +version: '1.0' +generics: +- name: GenericPort + namespace: Otn + description: Any port on any OTN device. The connection surface of the network. + label: Port + icon: mdi:ethernet + include_in_menu: false + human_friendly_id: + - device__name__value + - name__value + order_by: + - name__value + display_label: '{{ device__name__value }} {{ name__value }}' + uniqueness_constraints: + - - device + - name__value + attributes: + - name: name + kind: Text + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._/-]+$ + optional: false + description: Port identifier as the vendor labels it, such as 1/1/1. + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: role + kind: Dropdown + default_value: spare + choices: + - name: client + label: Client + color: '#4caf50' + - name: line + label: Line + color: '#2196f3' + - name: add_drop + label: Add/drop + color: '#9c27b0' + - name: degree + label: Degree + color: '#673ab7' + - name: express + label: Express + description: A degree-to-degree pass-through. Wavelengths cross the node without + adding or dropping. + color: '#00bcd4' + - name: booster + label: Booster + color: '#ff9800' + - name: preamp + label: Pre-amplifier + color: '#ffc107' + - name: tributary + label: Tributary + color: '#795548' + - name: spare + label: Spare + color: '#9e9e9e' + - name: monitor + label: Monitor + description: A monitoring interface, not a traffic-carrying port. + color: '#607d8b' + optional: false + order_weight: 1100 + - name: enabled + kind: Boolean + default_value: true + optional: false + order_weight: 1200 + - name: admin_state + kind: Dropdown + default_value: up + choices: + - name: up + label: Up + color: '#4caf50' + - name: down + label: Down + color: '#f44336' + - name: testing + label: Testing + color: '#ff9800' + optional: false + description: RFC 2863 ifAdminStatus. What the operator asked for. + order_weight: 1300 + - name: oper_state + kind: Dropdown + default_value: down + choices: + - name: up + label: Up + color: '#4caf50' + - name: down + label: Down + color: '#f44336' + - name: testing + label: Testing + color: '#ff9800' + - name: dormant + label: Dormant + color: '#2196f3' + - name: unknown + label: Unknown + color: '#9e9e9e' + optional: false + description: RFC 2863 ifOperStatus subset. What the port actually does. + order_weight: 1400 + relationships: + - name: device + peer: OtnGenericDevice + kind: Parent + cardinality: one + optional: false + identifier: otn_device__ports + order_weight: 800 + - name: hops_ingress + peer: OtnPathHop + label: Hops entering here + kind: Attribute + cardinality: many + optional: true + identifier: otn_hop__ingress_port + order_weight: 910 + - name: hops_egress + peer: OtnPathHop + label: Hops leaving here + kind: Attribute + cardinality: many + optional: true + identifier: otn_hop__egress_port + order_weight: 920 +- name: OpticalElement + namespace: Otn + description: Anything light passes through and loses power in. + label: Optical element + icon: mdi:blur-linear + include_in_menu: false + attributes: + - name: insertion_loss_mdb + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 60000 + optional: false + description: Insertion loss in millidecibels, 0 to 60 dB. No Float kind exists. + order_weight: 1500 + - name: insertion_loss_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if insertion_loss_mdb__value is not none %}{{ insertion_loss_mdb__value + / 1000 }} dB{% endif %}' + optional: true + description: Insertion loss in dB. Read-only, derived from insertion_loss_mdb. + order_weight: 1510 + - name: vendor + kind: Text + parameters: + max_length: 64 + optional: true + order_weight: 1600 + - name: model + kind: Text + parameters: + max_length: 64 + optional: true + order_weight: 1700 +- name: OmsEndpoint + namespace: Otn + description: A device that can terminate an optical multiplex section. + label: OMS endpoint + icon: mdi:ray-start-end + include_in_menu: false + relationships: + - name: sections_a + peer: OtnOpticalMultiplexSection + label: Sections (A end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__endpoint_a + order_weight: 960 + - name: sections_b + peer: OtnOpticalMultiplexSection + label: Sections (B end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__endpoint_b + order_weight: 970 +- name: GenericDevice + namespace: Otn + description: Anything racked at a site. + label: Device + icon: mdi:server + include_in_menu: true + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: '#2196f3' + - name: provisioning + label: Provisioning + color: '#ff9800' + - name: active + label: Active + color: '#4caf50' + - name: maintenance + label: Maintenance + color: '#ffc107' + - name: decommissioned + label: Decommissioned + color: '#9e9e9e' + optional: false + order_weight: 1100 + - name: role + kind: Dropdown + choices: + - name: core + label: Core + color: '#3f51b5' + - name: edge + label: Edge + color: '#2196f3' + - name: access + label: Access + color: '#00bcd4' + - name: passive + label: Passive + color: '#9e9e9e' + optional: false + order_weight: 1200 + relationships: + - name: site + peer: LocationSite + kind: Attribute + cardinality: one + optional: true + identifier: otn_site__devices + order_weight: 800 + - name: dcim_device + peer: DcimPhysicalDevice + label: Physical device record + kind: Attribute + cardinality: one + optional: true + identifier: otn_device__dcim_device + order_weight: 940 + - name: ports + peer: OtnGenericPort + kind: Component + cardinality: many + optional: true + identifier: otn_device__ports + on_delete: cascade + order_weight: 900 +- name: OpticalPort + namespace: Otn + description: Optical-specific port properties. + label: Optical port + icon: mdi:lightbulb-on-outline + include_in_menu: false + attributes: + - name: center_frequency_mhz + kind: Number + parameters: + min_value: 191350000 + max_value: 196100000 + optional: true + description: ITU-T G.694.1 centre frequency in MHz. No Float kind exists. + order_weight: 1600 + - name: center_frequency_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if center_frequency_mhz__value is not none %}{{ center_frequency_mhz__value + / 1000000 }} THz{% endif %}' + optional: true + description: Centre frequency in THz. Empty on a grey port, which has none. + order_weight: 1610 + - name: tx_power_mdbm + kind: Number + parameters: + min_value: -30000 + max_value: 30000 + optional: true + description: Transmit power in milli-dBm, -30 to +30 dBm. + order_weight: 1700 + - name: tx_power_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if tx_power_mdbm__value is not none %}{{ tx_power_mdbm__value + / 1000 }} dBm{% endif %}' + optional: true + description: Transmit power in dBm. Read-only, derived from tx_power_mdbm. + order_weight: 1710 + - name: rx_sensitivity_mdbm + kind: Number + parameters: + min_value: -40000 + max_value: 10000 + optional: true + description: Receiver sensitivity in milli-dBm, -40 to +10 dBm. + order_weight: 1800 + - name: rx_sensitivity_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if rx_sensitivity_mdbm__value is not none %}{{ rx_sensitivity_mdbm__value + / 1000 }} dBm{% endif %}' + optional: true + description: Receiver sensitivity in dBm. Derived from rx_sensitivity_mdbm. + order_weight: 1810 + - name: connector_type + kind: Dropdown + choices: + - name: LC + label: LC + description: Small-form duplex latch. What transponder and pluggable optics + take. + color: '#2196f3' + - name: SC + label: SC + description: Push-pull square ferrule, common on older distribution frames. + color: '#4caf50' + - name: MPO-12 + label: MPO-12 + description: Twelve-fibre ribbon ferrule for parallel optics. + color: '#9c27b0' + - name: MPO-16 + label: MPO-16 + description: Sixteen-fibre ribbon ferrule for 400G parallel optics. + color: '#673ab7' + - name: FC + label: FC + description: Threaded ferrule. Still found on test sets and metro equipment. + color: '#ff9800' + - name: E2000 + label: E2000 + description: Shuttered push-pull connector, widespread on European carrier plant. + color: '#00bcd4' + - name: MU + label: MU + description: Miniature unibody connector, half the footprint of an SC. + color: '#8bc34a' + - name: CS + label: CS + description: Narrow-pitch duplex connector, used for QSFP-DD breakout. + color: '#e91e63' + - name: splice + label: Splice + description: Fusion splice rather than a mated pair. No connector loss and no + polish. + color: '#9e9e9e' + optional: true + order_weight: 1900 + - name: polish + kind: Dropdown + choices: + - name: UPC + label: UPC + description: Ultra physical contact. Blue housing, about 50 dB return loss. + color: '#2196f3' + - name: APC + label: APC + description: Angled physical contact. Green housing, about 65 dB return loss. + color: '#4caf50' + - name: PC + label: PC + description: Physical contact. The oldest polish, about 35 dB return loss. + color: '#ff9800' + - name: none + label: None + description: No polished endface, such as a fusion splice. + color: '#9e9e9e' + optional: true + description: Endface polish. Mating an APC to a UPC costs about 0.5 dB and reflects. + order_weight: 1910 +- name: CopperPort + namespace: Otn + description: Electrical port properties for G.703 tributaries. + label: Copper port + icon: mdi:cable-data + include_in_menu: false + attributes: + - name: speed_kbps + kind: Number + default_value: 2048 + parameters: + min_value: 64 + max_value: 400000000 + optional: false + description: Line rate in kbps. E1 is 2048, T1 is 1544, STM-1 is 155520. + order_weight: 1600 + - name: impedance_ohm + kind: Number + default_value: 120 + parameters: + min_value: 50 + max_value: 600 + optional: false + description: Nominal impedance in ohms. 120 for E1 pair, 75 for coax. + order_weight: 1700 + - name: connector_type + kind: Dropdown + default_value: RJ48 + choices: + - name: BNC + label: BNC + description: Coaxial bayonet connector, used for 75 ohm E1 and STM-1. + color: '#ff9800' + - name: RJ48 + label: RJ48 + description: Eight-position jack for 120 ohm balanced E1 and T1 pairs. + color: '#2196f3' + - name: RJ45 + label: RJ45 + description: Eight-position jack for Ethernet management and console. + color: '#4caf50' + optional: false + order_weight: 1900 +nodes: +- name: RouterPort + namespace: Otn + description: Grey optics on an IP router. Not on the C-band grid. + label: Router port + icon: mdi:ethernet + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + relationships: + - name: transceiver + peer: DcimGenericTransceiver + label: Module fitted in this port + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 960 +- name: ClientPort + namespace: Otn + description: Transponder client side. Where grey light arrives. + label: Client port + icon: mdi:lan-connect + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + relationships: + - name: transceiver + peer: DcimGenericTransceiver + label: Module fitted in this port + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 960 +- name: LinePort + namespace: Otn + description: Transponder DWDM line side. Where coloured light leaves. + label: Line port + icon: mdi:transit-connection + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + relationships: + - name: carrier + peer: OtnOpticalCarrier + label: Wavelength this port terminates + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__line_ports + order_weight: 850 + - name: transceiver + peer: DcimGenericTransceiver + label: Module fitted in this port + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 960 +- name: RoadmAddDropPort + namespace: Otn + description: Local add and drop on a ROADM. + label: ROADM add/drop port + icon: mdi:call-split + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort +- name: RoadmDegreePort + namespace: Otn + description: Line-facing degree on a ROADM. One per direction. + label: ROADM degree port + icon: mdi:compass-outline + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + attributes: + - name: direction + kind: Dropdown + choices: + - name: north + label: North + color: '#2196f3' + - name: south + label: South + color: '#4caf50' + - name: east + label: East + color: '#ff9800' + - name: west + label: West + color: '#9c27b0' + - name: express + label: Express + description: Faces another degree rather than the outside world. Nothing adds + or drops here. + color: '#00bcd4' + - name: local + label: Local + description: Faces add/drop equipment in the same building instead of a line + route. + color: '#9e9e9e' + optional: true + description: How operators label this degree. Until now the port name was the + only place to say it. + order_weight: 1500 + - name: wavelength_capacity + kind: Number + parameters: + min_value: 1 + max_value: 96 + optional: true + description: Nameplate wavelengths this degree is rated to pass, such as 40, 80 + or 96. Not a count in use. + order_weight: 1520 +- name: AmplifierPort + namespace: Otn + description: Amplifier input or output. + label: Amplifier port + icon: mdi:amplifier + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort +- name: SplitterPort + namespace: Otn + description: The common side of a splitter, or one of its output legs. + label: Splitter port + icon: mdi:call-split + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + attributes: + - name: leg + kind: Dropdown + default_value: output + choices: + - name: common + label: Common + description: The single side that carries the whole carrier. + color: '#2196f3' + - name: output + label: Output + description: One of the divided legs. + color: '#4caf50' + optional: false + description: Whether this port is the common side or an output leg. + order_weight: 1500 +- name: MuxClientPort + namespace: Otn + description: One channel of a multiplexer. The side facing the transponder or router + that lights it. + label: Mux client port + icon: mdi:import + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + relationships: + - name: dwdm_channel + peer: OtnFrequencyGrid + label: Dense channel this port carries + kind: Attribute + cardinality: one + optional: true + identifier: otn_frequency_grid__mux_client_ports + order_weight: 850 + - name: cwdm_channel + peer: OtnCwdmChannel + label: Coarse wavelength this port carries + kind: Attribute + cardinality: one + optional: true + identifier: otn_cwdm_channel__mux_client_ports + order_weight: 860 +- name: MuxLinePort + namespace: Otn + description: The common side of a multiplexer, where the whole band leaves. + label: Mux line port + icon: mdi:export + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort +- name: TributaryPort + namespace: Otn + description: E1 or T1 G.703 electrical tributary. The only copper port here. + label: Tributary port + icon: mdi:cable-data + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnCopperPort +- name: TransceiverType + namespace: Otn + description: A pluggable optic part number and what it can be made to do. + label: Transceiver type + icon: mdi:chip + include_in_menu: true + menu_placement: OtnGenericDevice + human_friendly_id: + - part_number__value + order_by: + - part_number__value + display_label: part_number__value + attributes: + - name: part_number + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._/+-]+$ + optional: false + description: Vendor part number, such as QDD-400G-ZRP-S. + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1200 + - name: form_factor + kind: Dropdown + choices: + - name: QSFP-DD + label: QSFP-DD + description: Eight-lane double-density cage. What a coherent 400G pluggable + takes. + color: '#2196f3' + - name: QSFP28 + label: QSFP28 + description: Four-lane cage, 100G grey optics. + color: '#4caf50' + - name: OSFP + label: OSFP + description: Eight-lane cage with a larger thermal budget than QSFP-DD. + color: '#9c27b0' + - name: CFP2-DCO + label: CFP2-DCO + description: Digital coherent optic. The DSP is in the module. + color: '#ff9800' + - name: CFP2-ACO + label: CFP2-ACO + description: Analogue coherent optic. The DSP is on the host card. + color: '#ffc107' + - name: SFP28 + label: SFP28 + description: Single-lane 25G cage. + color: '#00bcd4' + - name: SFP+ + label: SFP+ + description: Single-lane 10G cage. + color: '#9e9e9e' + optional: false + description: The cage this part fits. It decides which ports can hold it. + order_weight: 1300 + - name: tunable + kind: Boolean + default_value: false + optional: false + description: Whether the laser can be tuned across the grid or is fixed at one + wavelength. + order_weight: 1400 + relationships: + - name: supported_modes + peer: OtnOpticalMode + label: Modes this part can run + kind: Attribute + cardinality: many + optional: true + identifier: otn_optical_mode__transceiver_types + order_weight: 900 + - name: manufacturer + peer: OrganizationManufacturer + kind: Attribute + cardinality: one + optional: true + identifier: otn_transceiver_type__manufacturer + order_weight: 1100 +- name: FiberType + namespace: Otn + description: Single-mode fiber family. Attenuation, dispersion and group index at + 1550 nm. + label: Fiber type + icon: mdi:cable-data + include_in_menu: true + menu_placement: OtnFiberSpan + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 32 + regex: ^[A-Za-z0-9.-]+$ + optional: false + description: ITU-T designation, such as G.652.D. + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: attenuation_coefficient_mdb_per_km + kind: Number + parameters: + min_value: 150 + max_value: 400 + optional: false + description: Attenuation at 1550 nm in millidecibels per kilometre. 0.20 dB/km + is 200. Wrong for CWDM. + order_weight: 1500 + - name: attenuation_coefficient_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if attenuation_coefficient_mdb_per_km__value is not none + %}{{ attenuation_coefficient_mdb_per_km__value / 1000 }} dB/km{% endif %}' + optional: true + description: Attenuation in dB/km. Read-only, derived from attenuation_coefficient_mdb_per_km. + order_weight: 1510 + - name: dispersion_fs_per_nm_km + kind: Number + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Chromatic dispersion at 1550 nm in femtoseconds per nm per km. 17 + ps/nm/km is 17000. + order_weight: 1600 + - name: dispersion_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if dispersion_fs_per_nm_km__value is not none %}{{ dispersion_fs_per_nm_km__value + / 1000 }} ps/nm/km{% endif %}' + optional: true + description: Dispersion in ps/nm/km. Read-only, derived from dispersion_fs_per_nm_km. + order_weight: 1610 + - name: group_index_milli + kind: Number + default_value: 1468 + parameters: + min_value: 1400 + max_value: 1500 + optional: false + description: Group index at 1550 nm in milli-units. 1.468 is 1468. Sets propagation + delay. + order_weight: 1700 + relationships: + - name: spans + peer: OtnFiberSpan + kind: Attribute + cardinality: many + optional: true + identifier: otn_fiber_type__spans + order_weight: 900 +- name: Conduit + namespace: Otn + description: Shared-risk link group. Two routes through one conduit are not diverse. + label: Conduit + icon: mdi:pipe + include_in_menu: true + menu_placement: OtnFiberSpan + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: owner + kind: Text + parameters: + max_length: 64 + optional: true + description: Who owns the trench. Often not the network operator. + order_weight: 1100 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1200 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: '#2196f3' + - name: active + label: Active + color: '#4caf50' + - name: standby + label: Standby + color: '#00bcd4' + - name: maintenance + label: Maintenance + color: '#ffc107' + - name: failed + label: Failed + color: '#ff5722' + - name: decommissioned + label: Decommissioned + color: '#9e9e9e' + optional: false + description: Lifecycle state of the duct itself, independent of the spans pulled + through it. + order_weight: 1300 + relationships: + - name: spans + peer: OtnFiberSpan + kind: Attribute + cardinality: many + optional: true + identifier: otn_conduit__spans + order_weight: 900 +- name: FiberSpan + namespace: Otn + description: One amplifier-to-amplifier fiber section. Lossy, but not racked and + not a device. + label: Fiber span + icon: mdi:vector-line + include_in_menu: true + inherit_from: + - OtnOpticalElement + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: oms_sequence + kind: Number + parameters: + min_value: 1 + max_value: 50 + optional: true + description: Position of this span within its optical multiplex section, counting + from the A end. + order_weight: 1200 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: '#2196f3' + - name: active + label: Active + color: '#4caf50' + - name: standby + label: Standby + color: '#00bcd4' + - name: maintenance + label: Maintenance + color: '#ffc107' + - name: failed + label: Failed + color: '#ff5722' + - name: decommissioned + label: Decommissioned + color: '#9e9e9e' + optional: false + description: Lifecycle state of the span. A planned span is designed but not yet + spliced through. + order_weight: 1300 + - name: commissioned_date + kind: DateTime + optional: true + description: When the span was accepted into service. A recorded fact, not a reading. + order_weight: 1400 + - name: length_m + kind: Number + parameters: + min_value: 0 + max_value: 500000 + optional: false + description: Route length in metres, not straight-line distance. 500 km is the + practical ceiling. + order_weight: 1500 + - name: length_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if length_m__value is not none %}{{ length_m__value / 1000 + }} km{% endif %}' + optional: true + description: Route length in km. Read-only, derived from length_m. + order_weight: 1510 + - name: splice_count + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 500 + optional: false + description: Fusion splices along the span. Roughly one per drum of cable. + order_weight: 1600 + - name: splice_loss_mdb + kind: Number + default_value: 50 + parameters: + min_value: 0 + max_value: 1000 + optional: false + description: Loss per splice in millidecibels. 0.05 dB is 50. + order_weight: 1610 + - name: connector_count + kind: Number + default_value: 2 + parameters: + min_value: 0 + max_value: 20 + optional: false + description: Mated connector pairs on the span, normally one at each end. + order_weight: 1700 + - name: connector_loss_mdb + kind: Number + default_value: 300 + parameters: + min_value: 0 + max_value: 2000 + optional: false + description: Loss per mated connector pair in millidecibels. 0.3 dB is 300. + order_weight: 1710 + - name: aging_margin_mdb + kind: Number + default_value: 1500 + parameters: + min_value: 0 + max_value: 5000 + optional: false + description: Reserved margin for repairs and ageing, in millidecibels. 1.5 dB + is 1500. + order_weight: 1720 + relationships: + - name: fiber_type + peer: OtnFiberType + kind: Attribute + cardinality: one + optional: false + identifier: otn_fiber_type__spans + order_weight: 800 + - name: site_a + peer: LocationSite + kind: Attribute + cardinality: one + optional: false + identifier: otn_span__site_a + order_weight: 810 + - name: site_b + peer: LocationSite + kind: Attribute + cardinality: one + optional: false + identifier: otn_span__site_b + order_weight: 820 + - name: conduit + peer: OtnConduit + kind: Attribute + cardinality: one + optional: true + identifier: otn_conduit__spans + order_weight: 830 + - name: oms + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: one + optional: true + identifier: otn_oms__spans + order_weight: 840 + - name: raman_pumps + peer: OtnRamanPump + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__raman_pumps + order_weight: 850 + - name: terminating_ports + peer: OtnGenericPort + label: Ports at the ends of this span + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__terminating_ports + order_weight: 950 +- name: OpticalMultiplexSection + namespace: Otn + description: Groups the ordered spans and inline amplifiers between two OMS endpoints. + label: Optical multiplex section + icon: mdi:ray-start-end + include_in_menu: true + menu_placement: OtnFiberSpan + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: '#2196f3' + - name: active + label: Active + color: '#4caf50' + - name: standby + label: Standby + color: '#00bcd4' + - name: maintenance + label: Maintenance + color: '#ffc107' + - name: failed + label: Failed + color: '#ff5722' + - name: decommissioned + label: Decommissioned + color: '#9e9e9e' + optional: false + description: Lifecycle state of the section as a whole, not of the spans it groups. + order_weight: 1200 + relationships: + - name: endpoint_a + peer: OtnOmsEndpoint + kind: Attribute + cardinality: one + optional: false + identifier: otn_oms__endpoint_a + order_weight: 800 + - name: endpoint_b + peer: OtnOmsEndpoint + kind: Attribute + cardinality: one + optional: false + identifier: otn_oms__endpoint_b + order_weight: 810 + - name: spans + peer: OtnFiberSpan + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__spans + order_weight: 900 + - name: amplifiers_a2b + peer: OtnAmplifier + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__amplifiers_a2b + order_weight: 910 + - name: amplifiers_b2a + peer: OtnAmplifier + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__amplifiers_b2a + order_weight: 920 +- name: FrequencyGrid + namespace: Otn + description: One ITU-T G.694.1 channel. 50 GHz fixed grid, 191.35 to 196.10 THz. + label: Frequency grid channel + icon: mdi:sine-wave + include_in_menu: true + menu_placement: OtnOpticalCarrier + human_friendly_id: + - center_frequency_mhz__value + order_by: + - center_frequency_mhz__value + display_label: Ch{{ channel_number__value }} + attributes: + - name: channel_number + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if center_frequency_mhz__value is not none -%} {{ ((center_frequency_mhz__value + - 191350000) // 50000) + 1 }} {%- endif %}' + optional: true + description: ITU channel number, 1 to 96. Channel 1 is 191.35 THz. Derived from + the centre frequency. + order_weight: 1000 + - name: center_frequency_mhz + kind: Number + unique: true + parameters: + min_value: 191350000 + max_value: 196100000 + optional: false + description: Centre frequency in MHz. Channel n is 191350000 + (n - 1) x 50000. + order_weight: 1500 + - name: center_frequency_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if center_frequency_mhz__value is not none %}{{ center_frequency_mhz__value + / 1000000 }} THz{% endif %}' + optional: true + description: Centre frequency in THz. Byte-identical to the optical-port rendering. + order_weight: 1510 + - name: center_wavelength_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if center_frequency_mhz__value is not none -%} {{ (299792458000 + / center_frequency_mhz__value) | round(2) }} nm {%- endif %}' + optional: true + description: Centre wavelength in nm, derived from the centre frequency. + order_weight: 1520 + relationships: + - name: carriers + peer: OtnOpticalCarrier + label: Carriers on this channel + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__channel + order_weight: 900 +- name: CwdmChannel + namespace: Otn + description: One ITU-T G.694.2 coarse wavelength. 20 nm spacing, 1271 to 1611 nm. + label: CWDM wavelength + icon: mdi:palette-swatch-variant + include_in_menu: true + menu_placement: OtnOpticalCarrier + human_friendly_id: + - center_wavelength_nm__value + order_by: + - center_wavelength_nm__value + display_label: '{{ center_wavelength_nm__value }} nm' + attributes: + - name: center_wavelength_nm + kind: Number + unique: true + parameters: + min_value: 1271 + max_value: 1611 + optional: false + description: Nominal central wavelength in nm. Wavelength n is 1271 + (n - 1) + x 20. + order_weight: 1000 + - name: band + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if center_wavelength_nm__value is not none -%} {% if center_wavelength_nm__value + < 1360 -%}O {%- elif center_wavelength_nm__value < 1460 -%}E {%- elif center_wavelength_nm__value + < 1530 -%}S {%- elif center_wavelength_nm__value < 1565 -%}C {%- else -%}L + {%- endif %} {%- endif %}' + optional: true + description: ITU band, derived from the wavelength. Only the two C-band wavelengths + sit in the erbium window. + order_weight: 1100 +- name: OpticalMode + namespace: Otn + description: What a transponder or coherent pluggable can do. Reach and required + OSNR are data, not assumptions. + label: Optical mode + icon: mdi:waveform + include_in_menu: true + menu_placement: OtnOpticalCarrier + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9 .+/_-]+$ + optional: false + order_weight: 1000 + - name: mode_class + kind: Dropdown + default_value: transponder + choices: + - name: transponder + label: Transponder + color: '#2196f3' + - name: pluggable + label: Coherent pluggable + color: '#4caf50' + optional: false + description: Two values, and the pluggable-reach report filters on it. + order_weight: 1100 + - name: modulation + kind: Dropdown + choices: + - name: DP-QPSK + label: DP-QPSK + description: Dual-polarisation QPSK. Four bits per symbol, the longest reach + of the four. + color: '#2196f3' + - name: DP-8QAM + label: DP-8QAM + description: Dual-polarisation 8QAM. Six bits per symbol. + color: '#4caf50' + - name: DP-16QAM + label: DP-16QAM + description: Dual-polarisation 16QAM. Eight bits per symbol. + color: '#ff9800' + - name: DP-64QAM + label: DP-64QAM + description: Dual-polarisation 64QAM. Twelve bits per symbol, the shortest reach. + color: '#e91e63' + optional: false + order_weight: 1200 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1300 + - name: line_rate_gbps + kind: Number + parameters: + min_value: 1 + max_value: 1600 + optional: false + description: Client-side capacity in Gbps. Already a whole number in its natural + unit. + order_weight: 1500 + - name: baud_mbaud + kind: Number + parameters: + min_value: 1000 + max_value: 200000 + optional: false + description: Symbol rate in megabaud. 59.84 GBd is 59840. Sets the spectral width. + order_weight: 1600 + - name: required_osnr_mdb + kind: Number + parameters: + min_value: 5000 + max_value: 40000 + optional: false + description: OSNR needed at the receiver, in millidecibels. 26 dB is 26000. + order_weight: 1700 + - name: required_osnr_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if required_osnr_mdb__value is not none %}{{ required_osnr_mdb__value + / 1000 }} dB{% endif %}' + optional: true + description: Required OSNR in dB. Read-only, derived from required_osnr_mdb. + order_weight: 1710 + - name: cd_tolerance_fs_per_nm + kind: Number + parameters: + min_value: 0 + max_value: 200000000 + optional: false + description: Chromatic dispersion the receiver compensates, in fs/nm. 100000 ps/nm + is 100000000. + order_weight: 1800 + - name: nominal_reach_m + kind: Number + parameters: + min_value: 0 + max_value: 5000000 + optional: false + description: Vendor-quoted reach in metres. A starting point for the budget, not + a guarantee. + order_weight: 1900 + - name: nominal_reach_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if nominal_reach_m__value is not none %}{{ nominal_reach_m__value + / 1000 }} km{% endif %}' + optional: true + description: Nominal reach in km. Read-only, derived from nominal_reach_m. + order_weight: 1910 + - name: fec_type + kind: Dropdown + default_value: SD-FEC + choices: + - name: none + label: None + description: No forward error correction. + color: '#9e9e9e' + - name: GFEC + label: GFEC + description: The G.709 Reed-Solomon code. Hard decision, about 7 percent overhead. + color: '#2196f3' + - name: SD-FEC + label: SD-FEC + description: Soft-decision FEC. More coding gain than a hard-decision code, + at more latency. + color: '#4caf50' + - name: cFEC + label: cFEC + description: Concatenated FEC from OIF 400ZR. Less coding gain and less power + than oFEC. + color: '#00bcd4' + - name: oFEC + label: oFEC + description: Open FEC from OpenROADM and OpenZR+. More coding gain, for longer + reach. + color: '#9c27b0' + optional: false + order_weight: 1950 + - name: fec_latency_ns + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 100000 + optional: false + description: Encoder and decoder latency in nanoseconds. Small next to propagation, + but not zero. + order_weight: 1960 + relationships: + - name: carriers + peer: OtnOpticalCarrier + label: Carriers using this mode + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__optical_mode + order_weight: 900 +- name: ClientSignal + namespace: Otn + description: What a customer hands over, and the container it maps into. + label: Client signal + icon: mdi:import + include_in_menu: true + menu_placement: OtnService + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 32 + regex: ^[A-Za-z0-9./_-]+$ + optional: false + order_weight: 1000 + - name: alias + kind: Text + parameters: + max_length: 32 + optional: true + description: The SONET name where one exists. STM-16 is OC-48. + order_weight: 1100 + - name: layer + kind: Dropdown + choices: + - name: ethernet + label: Ethernet + color: '#2196f3' + - name: sdh + label: SDH / SONET + color: '#9c27b0' + - name: pdh + label: PDH + color: '#795548' + - name: fibre_channel + label: Fibre Channel + color: '#ff9800' + - name: infiniband + label: InfiniBand + color: '#673ab7' + optional: false + description: Grouping the catalog by layer is the first thing a reader does. + order_weight: 1200 + - name: auto_selectable + kind: Boolean + default_value: false + optional: false + description: May the rate rule pick this signal when a service states none. + order_weight: 1250 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1300 + - name: bit_rate_kbps + kind: Number + parameters: + min_value: 64 + max_value: 1600000000 + optional: false + description: Nominal line rate in kbps. E1 is 2048, 100GBASE-LR4 is 103100000. + order_weight: 1500 + - name: bit_rate_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if bit_rate_kbps__value is none %}{% elif bit_rate_kbps__value + >= 1000000 %}{{ bit_rate_kbps__value / 1000000 }} Gbps{% else %}{{ bit_rate_kbps__value + / 1000 }} Mbps{% endif %}' + optional: true + description: Bit rate in Mbps below one gigabit, Gbps at or above it. + order_weight: 1510 + - name: default_container_type + kind: Dropdown + choices: + - name: ODU0 + label: ODU0 + description: About 1.25 Gbps. Sized for a gigabit Ethernet client. + color: '#2196f3' + - name: ODU1 + label: ODU1 + description: About 2.5 Gbps, the original G.709 tributary rate. + color: '#2196f3' + - name: ODU2 + label: ODU2 + description: About 10 Gbps. Takes 10G Ethernet at its WAN rate. + color: '#2196f3' + - name: ODU2e + label: ODU2e + description: About 10.4 Gbps, sized for the 10GBASE-R LAN rate. + color: '#2196f3' + - name: ODU3 + label: ODU3 + description: About 40 Gbps. + color: '#2196f3' + - name: ODU4 + label: ODU4 + description: About 100 Gbps. Takes 100G Ethernet. + color: '#2196f3' + - name: ODUC1 + label: ODUC1 + description: ODUCn at n=1. About 100 Gbps. + color: '#673ab7' + - name: ODUC2 + label: ODUC2 + description: ODUCn at n=2. About 200 Gbps. + color: '#673ab7' + - name: ODUC3 + label: ODUC3 + description: ODUCn at n=3. About 300 Gbps. + color: '#673ab7' + - name: ODUC4 + label: ODUC4 + description: ODUCn at n=4. About 400 Gbps. + color: '#673ab7' + - name: ODUflex + label: ODUflex + description: Sized to the client rather than to a fixed rate. + color: '#00bcd4' + - name: VC-12 + label: VC-12 + description: SDH virtual container carrying a 2 Mbps E1. + color: '#ff9800' + - name: VC-4 + label: VC-4 + description: SDH virtual container carrying the 140 Mbps STM-1 payload. + color: '#ff9800' + - name: STM-N + label: STM-N + description: A whole SDH aggregate carried transparently. + color: '#ff9800' + optional: false + description: The first step of the mapping chain, not the last. E1 maps into VC-12, + not ODU1. + order_weight: 1600 + - name: default_mapping + kind: Dropdown + choices: + - name: GMP + label: GMP + description: Generic mapping procedure. Rate agnostic, and what a modern client + uses. + color: '#2196f3' + - name: BMP + label: BMP + description: Bit-synchronous mapping procedure. Client and container clocks + are locked. + color: '#4caf50' + - name: AMP + label: AMP + description: Asynchronous mapping procedure. Justification bytes absorb the + clock offset. + color: '#ff9800' + optional: false + description: ITU-T G.709 mapping procedure. Generic, bit-synchronous or asynchronous. + order_weight: 1700 + relationships: + - name: containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_client_signal__containers + order_weight: 900 + - name: services + peer: OtnService + kind: Attribute + cardinality: many + optional: true + identifier: otn_service__client_signal + order_weight: 910 +- name: Container + namespace: Otn + description: ODU or SDH virtual container. The digital adaptation layer between + a client and a wavelength. + label: Container + icon: mdi:package-variant-closed + include_in_menu: true + menu_placement: OtnService + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: odu_type + kind: Dropdown + choices: + - name: ODU0 + label: ODU0 + description: About 1.25 Gbps. Sized for a gigabit Ethernet client. + color: '#2196f3' + - name: ODU1 + label: ODU1 + description: About 2.5 Gbps, the original G.709 tributary rate. + color: '#2196f3' + - name: ODU2 + label: ODU2 + description: About 10 Gbps. Takes 10G Ethernet at its WAN rate. + color: '#2196f3' + - name: ODU2e + label: ODU2e + description: About 10.4 Gbps, sized for the 10GBASE-R LAN rate. + color: '#2196f3' + - name: ODU3 + label: ODU3 + description: About 40 Gbps. + color: '#2196f3' + - name: ODU4 + label: ODU4 + description: About 100 Gbps. Takes 100G Ethernet. + color: '#2196f3' + - name: ODUC1 + label: ODUC1 + description: ODUCn at n=1. About 100 Gbps. + color: '#673ab7' + - name: ODUC2 + label: ODUC2 + description: ODUCn at n=2. About 200 Gbps. + color: '#673ab7' + - name: ODUC3 + label: ODUC3 + description: ODUCn at n=3. About 300 Gbps. + color: '#673ab7' + - name: ODUC4 + label: ODUC4 + description: ODUCn at n=4. About 400 Gbps. + color: '#673ab7' + - name: ODUC6 + label: ODUC6 + description: ODUCn at n=6. About 600 Gbps. + color: '#673ab7' + - name: ODUC8 + label: ODUC8 + description: ODUCn at n=8. About 800 Gbps. + color: '#673ab7' + - name: ODUflex + label: ODUflex + description: Sized to the client rather than to a fixed rate. + color: '#00bcd4' + - name: VC-12 + label: VC-12 + description: SDH virtual container carrying a 2 Mbps E1. + color: '#ff9800' + - name: VC-4 + label: VC-4 + description: SDH virtual container carrying the 140 Mbps STM-1 payload. + color: '#ff9800' + - name: STM-N + label: STM-N + description: A whole SDH aggregate carried transparently. + color: '#ff9800' + optional: false + order_weight: 1100 + - name: mapping_mode + kind: Dropdown + default_value: GMP + choices: + - name: GMP + label: GMP + description: Generic mapping procedure. Rate agnostic, and what a modern client + uses. + color: '#2196f3' + - name: BMP + label: BMP + description: Bit-synchronous mapping procedure. Client and container clocks + are locked. + color: '#4caf50' + - name: AMP + label: AMP + description: Asynchronous mapping procedure. Justification bytes absorb the + clock offset. + color: '#ff9800' + optional: false + order_weight: 1200 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1300 + - name: segment_sequence + kind: Number + default_value: 1 + parameters: + min_value: 1 + max_value: 50 + optional: false + description: Which segment of its circuit this container rides. 1 for a circuit + that spans one wavelength. + order_weight: 1400 + - name: tributary_slots + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 640 + optional: false + description: Slots this container occupies in its parent. An ODU2 in an ODU4 takes + 8. + order_weight: 1500 + - name: tributary_slot_capacity + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 640 + optional: false + description: Slots this container offers to its children. An ODU4 offers 80. + order_weight: 1600 + relationships: + - name: carrier + peer: OtnOpticalCarrier + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__containers + order_weight: 790 + - name: client_signal + peer: OtnClientSignal + kind: Attribute + cardinality: one + optional: true + identifier: otn_client_signal__containers + order_weight: 800 + - name: parent_container + peer: OtnContainer + kind: Attribute + cardinality: one + optional: true + identifier: otn_container__children + direction: outbound + order_weight: 810 + - name: service + peer: OtnService + kind: Attribute + cardinality: one + optional: true + identifier: otn_service__containers + order_weight: 820 + - name: child_containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_container__children + direction: inbound + order_weight: 900 +- name: Router + namespace: Otn + description: IP router. Light terminates here, so its insertion loss stays at the + zero default. + label: Router + icon: mdi:router + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement +- name: Transponder + namespace: Otn + description: Client to DWDM line adaptation. + label: Transponder + icon: mdi:transit-connection-variant + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement +- name: Roadm + namespace: Otn + description: Reconfigurable optical add/drop multiplexer. + label: ROADM + icon: mdi:call-split + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOmsEndpoint + - OtnOpticalElement + attributes: + - name: channel_capacity + kind: Number + parameters: + min_value: 1 + max_value: 96 + optional: true + description: Nameplate channels this ROADM is rated for, such as 40, 80 or 96. + Not a count in use. + order_weight: 1300 + - name: colorless + kind: Boolean + optional: true + description: Any add/drop port can take any wavelength, so assignment is not fixed + per port. + order_weight: 1320 + - name: directionless + kind: Boolean + optional: true + description: An added wavelength can leave by any degree, so assignment does not + pick a degree. + order_weight: 1330 + - name: contentionless + kind: Boolean + optional: true + description: The same wavelength can be added twice toward different degrees without + blocking. + order_weight: 1340 + - name: technology + kind: Dropdown + choices: + - name: wss_lcos + label: WSS (LCoS) + color: '#673ab7' + - name: wss_mems + label: WSS (MEMS) + color: '#3f51b5' + - name: broadcast_select + label: Broadcast and select + color: '#607d8b' + optional: true + description: How the switch is built. Nameplate data, often unknown. + order_weight: 1350 +- name: Amplifier + namespace: Otn + description: Inline, booster or pre-amplifier. + label: Amplifier + icon: mdi:amplifier + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: amplifier_type + kind: Dropdown + choices: + - name: edfa + label: EDFA + description: Erbium-doped fibre amplifier. The usual choice on a C band line + system. + color: '#2196f3' + - name: soa + label: SOA + description: Semiconductor optical amplifier. Compact, noisier, found in access + gear. + color: '#ff9800' + - name: hybrid + label: Hybrid + description: An erbium stage combined with distributed Raman gain in one box. + color: '#673ab7' + optional: true + description: Nameplate amplifier technology. A Raman-only pump is its own kind, + OtnRamanPump. + order_weight: 1300 + - name: stage + kind: Dropdown + choices: + - name: booster + label: Booster + description: First stage after the transmitter, lifting power into the span. + color: '#ff9800' + - name: inline + label: Inline + description: A mid-route stage that recovers span loss and passes the light + on. + color: '#4caf50' + - name: preamp + label: Pre-amplifier + description: Last stage before the receiver, raising power to its sensitivity. + color: '#ffc107' + optional: true + description: Nameplate stage this amplifier is built for, not a position derived + from the plant. + order_weight: 1400 + - name: noise_figure_mdb + kind: Number + default_value: 4000 + parameters: + min_value: 3000 + max_value: 10000 + optional: false + description: Noise figure in millidecibels. 4.0 dB is 4000. Sets the ASE this + stage adds. + order_weight: 1520 + - name: noise_figure_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if noise_figure_mdb__value is not none %}{{ noise_figure_mdb__value + / 1000 }} dB{% endif %}' + optional: true + description: Noise figure in dB. Read-only, derived from noise_figure_mdb. + order_weight: 1530 + - name: gain_mdb + kind: Number + default_value: 22000 + parameters: + min_value: 0 + max_value: 40000 + optional: false + description: Gain in millidecibels. 22.0 dB is 22000. Must cover the loss ahead + of the input. + order_weight: 1540 + - name: gain_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if gain_mdb__value is not none %}{{ gain_mdb__value / 1000 + }} dB{% endif %}' + optional: true + description: Gain in dB. Read-only, derived from gain_mdb. + order_weight: 1550 + - name: oms_sequence + kind: Number + parameters: + min_value: 1 + max_value: 51 + optional: true + description: Position in this amplifier's own chain, counting along the direction + it amplifies. + order_weight: 1560 + - name: max_total_output_power_mdbm + kind: Number + parameters: + min_value: 0 + max_value: 30000 + optional: true + description: Rated total output power in milli-dBm, 0 to +30 dBm. A nameplate + ceiling, not a reading. + order_weight: 1570 + - name: max_total_output_power_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if max_total_output_power_mdbm__value is not none %}{{ + max_total_output_power_mdbm__value / 1000 }} dBm{% endif %}' + optional: true + description: Rated total output power in dBm. Read-only, derived from max_total_output_power_mdbm. + order_weight: 1580 + relationships: + - name: oms_a2b + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: one + optional: true + identifier: otn_oms__amplifiers_a2b + order_weight: 950 + - name: oms_b2a + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: one + optional: true + identifier: otn_oms__amplifiers_b2a + order_weight: 960 +- name: MuxDemux + namespace: Otn + description: Passive multiplexer. A dense AWG on the core, a coarse thin-film filter + on a tail. + label: Mux/demux + icon: mdi:call-merge + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOmsEndpoint + - OtnOpticalElement + attributes: + - name: channel_capacity + kind: Number + parameters: + min_value: 1 + max_value: 96 + optional: true + description: Nameplate channels this multiplexer is rated for, such as 8, 16, + 40 or 96. Not a count in use. + order_weight: 1300 + - name: plan + kind: Dropdown + default_value: dwdm + choices: + - name: dwdm + label: DWDM + description: ITU-T G.694.1 dense grid. + color: '#2196f3' + - name: cwdm + label: CWDM + description: ITU-T G.694.2 coarse plan. + color: '#ff9800' + optional: false + description: Which wavelength plan this multiplexer multiplexes. + order_weight: 1310 + - name: mux_role + kind: Dropdown + default_value: mux_demux + choices: + - name: mux + label: Multiplexer + description: Combines channels onto one common port. + color: '#4caf50' + - name: demux + label: Demultiplexer + description: Splits one common port into channels. + color: '#00bcd4' + - name: mux_demux + label: Mux/demux + description: Both directions in one device. + color: '#2196f3' + - name: oadm + label: Fixed OADM + description: Drops and adds a fixed subset, passing the rest through. + color: '#9c27b0' + optional: false + description: What this passive device does with the channels it carries. + order_weight: 1320 + - name: technology + kind: Dropdown + choices: + - name: thin_film_filter + label: Thin-film filter + color: '#795548' + - name: awg + label: AWG + color: '#607d8b' + - name: interleaver + label: Interleaver + color: '#009688' + optional: true + description: How the device separates wavelengths. Nameplate data, often unknown. + order_weight: 1330 + relationships: + - name: cwdm_channels + peer: OtnCwdmChannel + kind: Attribute + cardinality: many + optional: true + identifier: otn_mux_demux__cwdm_channels + order_weight: 1900 +- name: PatchPanel + namespace: Otn + description: Optical distribution frame. Carries connector loss. + label: Patch panel + icon: mdi:view-grid-outline + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement +- name: RamanPump + namespace: Otn + description: Pump laser injecting Raman gain into one fiber span. + label: Raman pump + icon: mdi:laser-pointer + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: on_off_gain_mdb + kind: Number + default_value: 10000 + parameters: + min_value: 0 + max_value: 15000 + optional: false + description: Raman on-off gain in millidecibels. 10.0 dB is 10000. + order_weight: 1520 + - name: on_off_gain_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if on_off_gain_mdb__value is not none %}{{ on_off_gain_mdb__value + / 1000 }} dB{% endif %}' + optional: true + description: On-off gain in dB. Read-only, derived from on_off_gain_mdb. + order_weight: 1530 + - name: injection_end + kind: Dropdown + default_value: site_b + choices: + - name: site_a + label: Site A end + color: '#2196f3' + - name: site_b + label: Site B end + color: '#ff5722' + optional: false + description: Which end of its span the pump is injected at, named against the + span's own site_a and site_b. + order_weight: 1540 + - name: propagation + kind: Dropdown + default_value: counter + choices: + - name: counter + label: Counter-propagating + color: '#3f51b5' + - name: co + label: Co-propagating + color: '#009688' + optional: false + description: Whether the pump fires against the signal or with it. + order_weight: 1550 + relationships: + - name: span + peer: OtnFiberSpan + kind: Attribute + cardinality: one + optional: false + identifier: otn_span__raman_pumps + order_weight: 850 +- name: OduSwitch + namespace: Otn + description: O-E-O device. Terminates one wavelength, originates the next, as a + regenerator or ODU cross-connect. + label: ODU switch + icon: mdi:swap-horizontal-variant + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: switching_mode + kind: Dropdown + default_value: regenerator + choices: + - name: regenerator + label: Regenerator + color: '#3f51b5' + - name: cross_connect + label: ODU cross-connect + color: '#009688' + optional: false + description: Whether the device carries the whole payload through or demultiplexes + and regroups containers. + order_weight: 1300 + - name: framing_latency_ns + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 100000 + optional: false + description: Delay this device adds in nanoseconds, from framing and from the + electrical crossing. + order_weight: 1520 + relationships: + - name: carriers + peer: OtnOpticalCarrier + label: Carriers patched to this shelf + kind: Attribute + cardinality: many + optional: true + identifier: otn_odu_switch__carriers + order_weight: 1900 +- name: Splitter + namespace: Otn + description: Passive splitter or coupler. Divides one carrier across several legs. + label: Splitter + icon: mdi:call-split + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: split_type + kind: Dropdown + default_value: even + choices: + - name: even + label: Even + description: Every output leg receives the same share. + color: '#2196f3' + - name: tap + label: Tap + description: One leg takes a small share for monitoring, the rest passes on. + color: '#ff9800' + optional: false + description: How the input is divided across the output legs. + order_weight: 1900 + - name: output_count + kind: Number + default_value: 2 + parameters: + min_value: 2 + max_value: 64 + optional: false + description: Number of output legs, such as 2 for a 1:2 or 8 for a 1:8. + order_weight: 1910 + - name: tap_ratio_percent + kind: Number + parameters: + min_value: 1 + max_value: 50 + optional: true + description: Share taken by the tap leg, as a percentage. 10 is a 90/10 tap. Null + on an even split. + order_weight: 1920 +- name: FixedAttenuator + namespace: Otn + description: A pad. One fixed amount of loss, patched into a link that arrives too + hot. + label: Fixed attenuator + icon: mdi:filter-outline + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: attenuation_mdb + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Attenuation the pad is set to, in millidecibels. 5.0 dB is 5000. + order_weight: 1900 + - name: attenuation_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if attenuation_mdb__value is not none %}{{ attenuation_mdb__value + / 1000 }} dB{% endif %}' + optional: true + description: Attenuation in dB. Read-only, derived from attenuation_mdb. + order_weight: 1910 +- name: VariableAttenuator + namespace: Otn + description: A VOA. The same loss, dialled rather than fixed, within the range the + hardware has. + label: Variable attenuator + icon: mdi:tune-variant + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: attenuation_mdb + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Attenuation the pad is set to, in millidecibels. 5.0 dB is 5000. + order_weight: 1900 + - name: attenuation_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if attenuation_mdb__value is not none %}{{ attenuation_mdb__value + / 1000 }} dB{% endif %}' + optional: true + description: Attenuation in dB. Read-only, derived from attenuation_mdb. + order_weight: 1910 + - name: max_attenuation_mdb + kind: Number + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Largest attenuation this device can be dialled to, in millidecibels. + order_weight: 1920 + - name: max_attenuation_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if max_attenuation_mdb__value is not none %}{{ max_attenuation_mdb__value + / 1000 }} dB{% endif %}' + optional: true + description: Maximum attenuation in dB. Read-only, derived from max_attenuation_mdb. + order_weight: 1930 +- name: OpticalCarrier + namespace: Otn + description: One provisioned wavelength. Occupies its channel on every section it + crosses. + label: Optical carrier + icon: mdi:waves + include_in_menu: true + menu_placement: OtnService + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: '#2196f3' + - name: reserved + label: Reserved + color: '#ff9800' + - name: active + label: Active + color: '#4caf50' + - name: decommissioned + label: Decommissioned + color: '#9e9e9e' + optional: false + order_weight: 1200 + - name: provisioned_date + kind: DateTime + optional: true + description: When the wavelength was turned up. A recorded fact, not a reading. + order_weight: 1300 + relationships: + - name: channel + peer: OtnFrequencyGrid + kind: Attribute + cardinality: one + optional: false + identifier: otn_carrier__channel + order_weight: 800 + - name: optical_mode + peer: OtnOpticalMode + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__optical_mode + order_weight: 810 + - name: optical_path + peer: OtnOpticalPath + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__optical_path + order_weight: 820 + - name: sections + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__sections + order_weight: 900 + - name: containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__containers + order_weight: 910 + - name: odu_switches + peer: OtnOduSwitch + label: ODU switches this carrier is patched to + kind: Attribute + cardinality: many + optional: true + identifier: otn_odu_switch__carriers + order_weight: 920 + - name: line_ports + peer: OtnLinePort + label: Line ports terminating this wavelength + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__line_ports + order_weight: 930 +- name: Service + namespace: Otn + description: Customer intent. Two endpoints, a rate, a profile and an optional latency + budget. + label: Service + icon: mdi:file-document-outline + include_in_menu: true + inherit_from: + - CoreArtifactTarget + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: external_circuit_id + kind: Text + parameters: + max_length: 64 + optional: true + description: The customer's or partner's own reference for this circuit, where + `name` is ours. + order_weight: 1200 + - name: rate_gbps + kind: Number + parameters: + min_value: 1 + max_value: 1600 + optional: false + description: Requested client capacity in Gbps. Already whole in its natural unit. + order_weight: 1300 + - name: sla + kind: Dropdown + default_value: silver + choices: + - name: gold + label: Gold + color: '#ffc107' + - name: silver + label: Silver + color: '#9e9e9e' + - name: bronze + label: Bronze + color: '#795548' + - name: best_effort + label: Best effort + color: '#607d8b' + optional: false + order_weight: 1400 + - name: status + kind: Dropdown + default_value: planned + choices: + - name: planned + label: Planned + color: '#2196f3' + - name: provisioning + label: Provisioning + color: '#ff9800' + - name: active + label: Active + color: '#4caf50' + - name: maintenance + label: Maintenance + color: '#ffc107' + - name: failed + label: Failed + color: '#ff5722' + - name: rejected + label: Rejected + color: '#f44336' + - name: decommissioned + label: Decommissioned + color: '#9e9e9e' + optional: false + order_weight: 1500 + - name: provisioned_date + kind: DateTime + optional: true + description: When the circuit was handed to the customer. A recorded fact, not + a reading. + order_weight: 1520 + - name: service_type + kind: Dropdown + default_value: wavelength + choices: + - name: wavelength + label: Wavelength + description: A whole optical carrier handed over to the customer. + color: '#2196f3' + - name: transport + label: Transport + description: A sub-carrier circuit, groomed into ODU containers. + color: '#673ab7' + - name: ip_transit + label: IP transit + description: IP handoff, with the transport kept internal. + color: '#4caf50' + optional: false + description: Which kind of service this is. + order_weight: 1600 + - name: max_latency_ns + kind: Number + parameters: + min_value: 0 + max_value: 1000000000 + optional: true + description: One-way latency budget in nanoseconds. Null when the service commits + to none. + order_weight: 1700 + - name: max_latency_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: '{% if max_latency_ns__value is not none %}{{ max_latency_ns__value + / 1000 }} us{% endif %}' + optional: true + description: Latency budget in microseconds. Read-only, derived from max_latency_ns. + order_weight: 1710 + relationships: + - name: endpoint_a + peer: OtnGenericDevice + kind: Attribute + cardinality: one + optional: false + identifier: otn_service__endpoint_a + order_weight: 800 + - name: endpoint_z + peer: OtnGenericDevice + kind: Attribute + cardinality: one + optional: false + identifier: otn_service__endpoint_z + order_weight: 810 + - name: optical_path + peer: OtnOpticalPath + kind: Component + cardinality: many + optional: true + identifier: otn_service__optical_path + on_delete: cascade + order_weight: 900 + - name: client_signal + peer: OtnClientSignal + kind: Attribute + cardinality: one + optional: true + identifier: otn_service__client_signal + order_weight: 910 + - name: diversity_group + peer: OtnDiversityGroup + kind: Attribute + cardinality: one + optional: true + identifier: otn_diversity_group__services + order_weight: 915 + - name: containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_service__containers + order_weight: 920 + - name: customer + peer: OrganizationGeneric + label: Customer + kind: Attribute + cardinality: one + optional: false + identifier: otn_service__customer + order_weight: 1200 +- name: DiversityGroup + namespace: Otn + description: A declared diversity requirement. The services in one group must route + over disjoint conduits. + label: Diversity group + icon: mdi:call-split + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + relationships: + - name: services + peer: OtnService + kind: Attribute + cardinality: many + optional: true + identifier: otn_diversity_group__services + order_weight: 800 +- name: OpticalPath + namespace: Otn + description: The materialised chosen route for one service. + label: Optical path + icon: mdi:map-marker-path + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + uniqueness_constraints: + - - service + - segment_sequence__value + - path_role__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: segment_sequence + kind: Number + default_value: 1 + parameters: + min_value: 1 + max_value: 50 + optional: false + description: Which segment of its circuit this path is. 1 for a circuit that spans + one wavelength. + order_weight: 1200 + - name: path_role + kind: Dropdown + default_value: working + choices: + - name: working + label: Working + description: The route the service takes while nothing on it has failed. + color: '#4caf50' + - name: protect + label: Protect + description: The standby route the service switches to when its working one + fails. + color: '#2196f3' + - name: express + label: Express + description: A route passing a site optically, with nothing added or dropped + there. + color: '#9c27b0' + optional: false + description: Which role this path plays for its service, working, protect or express. + order_weight: 1300 + relationships: + - name: service + peer: OtnService + kind: Parent + cardinality: one + optional: false + identifier: otn_service__optical_path + order_weight: 800 + - name: carrier + peer: OtnOpticalCarrier + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__optical_path + order_weight: 810 + - name: hops + peer: OtnPathHop + kind: Component + cardinality: many + optional: true + identifier: otn_path__hops + on_delete: cascade + order_weight: 900 +- name: PathHop + namespace: Otn + description: One ordered element on a path. + label: Path hop + icon: mdi:ray-vertex + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - sequence__value + display_label: name__value + uniqueness_constraints: + - - path + - sequence__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 96 + regex: ^[A-Za-z0-9._-]+$ + optional: false + order_weight: 1000 + - name: sequence + kind: Number + parameters: + min_value: 1 + max_value: 1000 + optional: false + description: Position along the path, counting from the endpoint A ROADM. + order_weight: 1100 + - name: action + kind: Dropdown + choices: + - name: add + label: Add + description: The carrier joins the line system here. + color: '#4caf50' + - name: drop + label: Drop + description: The carrier leaves the line system here. + color: '#ff9800' + - name: express + label: Express + description: Switched degree to degree without reaching an add/drop port. + color: '#673ab7' + - name: through + label: Through + description: Crossed passively, as on a span, an amplifier or a panel. + color: '#607d8b' + - name: terminate + label: Terminate + description: The light ends here, on a transponder or a router. + color: '#f44336' + optional: true + description: What this element does to the carrier at this hop. + order_weight: 1200 + relationships: + - name: path + peer: OtnOpticalPath + kind: Parent + cardinality: one + optional: false + identifier: otn_path__hops + order_weight: 800 + - name: element + peer: OtnOpticalElement + kind: Attribute + cardinality: one + optional: false + identifier: otn_hop__element + order_weight: 810 + - name: ingress_port + peer: OtnGenericPort + kind: Attribute + cardinality: one + optional: true + identifier: otn_hop__ingress_port + order_weight: 820 + - name: egress_port + peer: OtnGenericPort + kind: Attribute + cardinality: one + optional: true + identifier: otn_hop__egress_port + order_weight: 830 +- name: Facility + namespace: Otn + description: A supercomputing facility hosted at a PoP. + label: Facility + icon: ri:cpu-line + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + order_weight: 1000 + - name: description + kind: Text + optional: true + order_weight: 1200 + relationships: + - name: site + peer: LocationSite + kind: Attribute + cardinality: one + optional: true + identifier: otn_site__facility + order_weight: 900 +extensions: + nodes: + - kind: LocationSite + attributes: + - name: latitude_microdeg + kind: Number + parameters: + min_value: -90000000 + max_value: 90000000 + optional: true + description: Latitude in millionths of a degree. No Float kind exists. + order_weight: 1600 + - name: longitude_microdeg + kind: Number + parameters: + min_value: -180000000 + max_value: 180000000 + optional: true + description: Longitude in millionths of a degree. No Float kind exists. + order_weight: 1700 + - name: site_type + kind: Dropdown + choices: + - name: pop + label: PoP + color: '#2196f3' + - name: customer + label: Customer site + color: '#ff9800' + optional: true + description: A PoP hosting OTN equipment, or a customer site handing traffic + to one. + order_weight: 1800 + relationships: + - name: otn_devices + peer: OtnGenericDevice + kind: Generic + cardinality: many + optional: true + identifier: otn_site__devices + order_weight: 900 + - name: spans_a + peer: OtnFiberSpan + label: Fiber spans (A end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__site_a + order_weight: 910 + - name: spans_b + peer: OtnFiberSpan + label: Fiber spans (B end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__site_b + order_weight: 920 + - name: otn_facility + peer: OtnFacility + kind: Attribute + cardinality: one + optional: true + identifier: otn_site__facility + order_weight: 930 + - kind: DcimGenericTransceiver + relationships: + - name: otn_port + peer: OtnOpticalPort + label: OTN port this unit is fitted in + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 1600 + - name: otn_type + peer: OtnTransceiverType + label: OTN part this unit is + kind: Attribute + cardinality: one + optional: true + identifier: otn_transceiver_type__units + order_weight: 1700 + +``` \ No newline at end of file diff --git a/docs/docs/reference/transceiver.mdx b/docs/docs/reference/transceiver.mdx index 2ac312bb..023d363c 100644 --- a/docs/docs/reference/transceiver.mdx +++ b/docs/docs/reference/transceiver.mdx @@ -50,7 +50,7 @@ Limitations: there is no validation between type, form factor, protocol and dist | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | | serial_number | | Text | True | | | -| transceiver_type | Type of transceiver, such as LR, SR, T. | Dropdown | False | | lr, sr, lrm, t, sr4, lr4, zr, er, dac, aoc | +| transceiver_type | Type of transceiver, such as LR, SR, T. | Dropdown | False | | lr, sr, lrm, t, sr4, lr4, dr4, zr, er, dac, aoc | | status | | Dropdown | False | plugged | plugged, spare, decommissioned | | form_factor | The physical form factor of the transceiver. | Dropdown | False | | sfp, sfp_plus, qsfp, qsfp_plus, qsfp28, qsfp_dd, cfp, cfp2, cfp4, xfp, sfp56, qsfp56, osfp | @@ -140,6 +140,10 @@ generics: description: Long Range 4-lane transceiver, typically used for longer distances over parallel optics. color: '#336699' + - name: dr4 + label: DR4 (500m Range 4-lane) + description: 500 m 4-lane transceiver over parallel single mode fiber. + color: '#339966' - name: zr label: ZR (Extended Reach) description: Extended Reach transceiver, suitable for distances up to 80km. diff --git a/experimental/optical_transport/README.md b/experimental/optical_transport/README.md deleted file mode 100644 index 6b5478c3..00000000 --- a/experimental/optical_transport/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# optical_transport - -Please refer to the [reference page](https://docs.infrahub.app/schema-library/reference/optical_transport) for the corresponding documentation. diff --git a/experimental/optical_transport/optical_transport.yml b/experimental/optical_transport/optical_transport.yml deleted file mode 100644 index 0ecb9e65..00000000 --- a/experimental/optical_transport/optical_transport.yml +++ /dev/null @@ -1,1500 +0,0 @@ -# yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json -# --------------------------------------------------------------------------- -# This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review, see -# docs.infrahub.app, or reach out to OpsMill for help. -# --------------------------------------------------------------------------- ---- -version: "1.0" - -# Optical Transport Network Schemas for DWDM/WDM systems -# -# Depends on: -# - base/dcim.yml (DcimGenericDevice, DcimPhysicalDevice, DcimEndpoint, DcimConnector) -# - extensions/device_module/device_module.yml (DcimGenericModule, DcimGenericModuleType, DcimModuleBay) -# - extensions/cable/cable.yml (DcimCable) -# -# Four layers: -# 1. Wavelength - ITU-T G.694.1 grid, optical bands, DWDM channels -# 2. Topology - Logical optical nodes, passive multiplexers, fiber links -# 3. Equipment - Transponder/amplifier/ROADM modules, degrees, cross-connects -# 4. Service - End-to-end optical services, paths, segments - -generics: - # ============================================================================ - # ChannelMapping - Generic for any channel allocation/routing - # ============================================================================ - - name: ChannelMapping # DcimChannelMapping - namespace: Dcim - description: "Generic base for any channel allocation/routing (fiber, cable, or internal cross-connect)" - label: "Channel Mapping" - include_in_menu: false - attributes: - # TODO: Replace with a proper status - - name: is_active - kind: Boolean - optional: false - default_value: true - description: "Whether this mapping is currently active" - - name: configured_date - kind: DateTime - optional: true - description: "Date this mapping was configured" - relationships: - - name: segment - peer: DcimPathSegment - cardinality: one - kind: Parent - optional: false - identifier: "channel_mapping__path_segments" - description: "Optical Path segment associated with this mapping" - - name: channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: false - identifier: "dwdm_channel__mappings" - description: "DWDM channel being mapped/routed" - - name: degrees - peer: DcimRoadmDegree - cardinality: many - max_count: 2 - kind: Attribute - optional: false - identifier: "roadm_degree__channel_mappings" - description: "Two ROADM degrees involved in this mapping (bidirectional)" - - # ============================================================================ - # OpticalDevice - Generic for any device that can multiplex channels - # ============================================================================ - - name: OpticalDevice # DcimOpticalDevice - namespace: Dcim - description: "Generic interface for any device that can multiplex DWDM channels (active or passive)" - label: "Optical Multiplexer Device" - include_in_menu: false - uniqueness_constraints: - - [computed_name__value] - attributes: - # Placeholder, will be overridden in child nodes - - name: computed_name - kind: Text - optional: false - -# ============================================================================== -# NODES -# ============================================================================== -nodes: - # ============================================================================ - # Wavelength Layer - ITU-T G.694.1 Grid and Channels - # ============================================================================ - - # ============================================================================ - # ITUGrid - ITU-T G.694.1 DWDM Grid Standards - # ============================================================================ - - name: ITUGrid # DcimITUGrid - namespace: Dcim - include_in_menu: true - label: "ITU-T DWDM Grid" - description: "ITU-T G.694.1 frequency grid standards for DWDM" - icon: mdi:grid - display_label: name__value - human_friendly_id: - - name__value - uniqueness_constraints: - - [name__value] - attributes: - - name: name - kind: Text - optional: false - description: "Grid name (e.g., 50GHz, 100GHz)" - - name: channel_spacing_ghz - kind: Number - optional: false - description: "Channel spacing in GHz (50, 100, etc.)" - - name: reference_frequency_thz - kind: Text - optional: false - description: "Reference frequency in THz (e.g., '193.1' for 1550nm)" - - name: description - kind: Text - optional: true - description: "Grid description and use cases" - relationships: - - name: bands - peer: DcimOpticalBand - cardinality: many - kind: Component - optional: true - description: "Optical bands using this grid" - - # ============================================================================ - # OpticalBand - C-Band, L-Band, etc. - # ============================================================================ - - name: OpticalBand # DcimOpticalBand - namespace: Dcim - include_in_menu: true - label: "Optical Band" - description: "Optical frequency band (C-Band, L-Band, S-Band)" - icon: mdi:sine-wave - display_label: computed_name__value - human_friendly_id: [grid__name__value, band_name__value] - uniqueness_constraints: - - [grid, band_name__value] - attributes: - - name: band_name - kind: Dropdown - optional: false - choices: - - name: c_band - label: "C-Band" - description: "Conventional Band (1530-1565 nm)" - color: "#ff6b6b" - - name: l_band - label: "L-Band" - description: "Long Band (1565-1625 nm)" - color: "#4ecdc4" - - name: s_band - label: "S-Band" - description: "Short Band (1460-1530 nm)" - color: "#95e1d3" - - name: o_band - label: "O-Band" - description: "Original Band (1260-1360 nm)" - color: "#f38181" - description: "Optical band designation" - - name: start_frequency_thz - kind: Text - optional: false - description: "Band start frequency in THz (e.g., '191.0')" - - name: end_frequency_thz - kind: Text - optional: false - description: "Band end frequency in THz (e.g., '196.1')" - - name: start_wavelength_nm - kind: Text - optional: true - description: "Band start wavelength in nm (e.g., '1530.0')" - - name: end_wavelength_nm - kind: Text - optional: true - description: "Band end wavelength in nm (e.g., '1565.0')" - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ grid__name__value }}-{{ band_name__value|upper }}" - description: "Auto-generated band identifier (e.g., 50GHz-C_BAND)" - relationships: - - name: grid - peer: DcimITUGrid - cardinality: one - kind: Parent - optional: false - description: "Parent ITU grid" - - name: channels - peer: DcimDWDMChannel - cardinality: many - kind: Component - optional: true - description: "DWDM channels in this band" - - # ============================================================================ - # DWDMChannel - Individual Wavelength/Channel - # ============================================================================ - - name: DWDMChannel # DcimDWDMChannel - namespace: Dcim - include_in_menu: true - label: "DWDM Channel" - description: "Individual DWDM wavelength/channel (CH20, CH21, etc.)" - icon: mdi:wave - display_label: channel_name__value - human_friendly_id: - - channel_name__value - order_by: - - band__computed_name__value - - channel_number__value - uniqueness_constraints: - - [band, channel_number__value] - - [channel_name__value] - - [channel_number__value, frequency_thz__value, wavelength_nm__value] - attributes: - - name: channel_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "CH{{ channel_number__value }}" - description: "ITU DWDM Channel identifier (computed as CH + channel number, e.g., CH20, CH21, CH40)" - - name: adva_channel_name - kind: Text - optional: true - description: "ADVA-specific channel name (e.g., D02, DC1, D32)" - - name: channel_number - kind: Number - optional: false - description: "ITU channel number (e.g., 20, 21, 60)" - - name: frequency_thz - kind: Text - optional: false - description: "Center frequency in THz (e.g., '192.1')" - - name: wavelength_nm - kind: Text - optional: false - description: "Center wavelength in nm (e.g., '1560.61')" - - name: description - kind: Text - optional: true - description: "Channel notes and usage" - relationships: - - name: band - peer: DcimOpticalBand - cardinality: one - kind: Parent - optional: false - description: "Parent optical band" - - name: mux_assignments - peer: DcimMuxChannelAssignment - cardinality: many - kind: Component - optional: true - description: "Mux port assignments for this channel" - - name: mappings - peer: DcimChannelMapping - cardinality: many - kind: Generic - optional: true - description: "Fiber allocations for this channel" - - # ============================================================================ - # MuxChannelAssignment - Channel to Mux Port Mapping - # ============================================================================ - - name: MuxChannelAssignment # DcimMuxChannelAssignment - namespace: Dcim - include_in_menu: true - label: "Mux Channel Assignment" - description: "Maps DWDM channel to multiplexer port (equipment configuration)" - icon: mdi:cable-data - display_label: computed_name__value - human_friendly_id: - - optical_device__computed_name__value - - port_number__value - uniqueness_constraints: - - [optical_device, port_number__value] - - [optical_device, channel] - attributes: - - name: port_number - kind: Number - optional: false - description: "Physical port number on multiplexer (e.g., 1-96)" - - name: tx_power_dbm - kind: Text - optional: true - description: "Configured transmit power in dBm (e.g., '0.0')" - - name: status - kind: Dropdown - optional: false - default_value: "configured" - choices: - - name: configured - label: "Configured" - description: "Channel is configured on port" - color: "#f5a623" - - name: active - label: "Active" - description: "Channel is actively transmitting" - color: "#00cc00" - - name: disabled - label: "Disabled" - description: "Channel is disabled" - color: "#cccccc" - - name: failed - label: "Failed" - description: "Channel has failed" - color: "#cc0000" - description: "Channel assignment status" - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: >- - {{ optical_device__computed_name__value - }}-P{{ '{:02d}'.format(port_number__value) - }}-{{ channel__channel_name__value }} - description: "Auto-generated assignment identifier" - relationships: - - name: channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: false - description: "DWDM channel assigned to this port" - - name: optical_device - peer: DcimOpticalDevice - cardinality: one - kind: Parent - optional: false - identifier: "mux_channel_assignments" - description: "Multiplexer device (OpticalNode or PassiveMultiplexer)" - - # ============================================================================ - # FiberMapping - Channel Allocation on Long-Haul Fiber - # ============================================================================ - - name: FiberMapping # DcimFiberMapping - namespace: Dcim - inherit_from: - - DcimChannelMapping - include_in_menu: true - label: "Fiber Mapping" - description: "Long-haul fiber link between degrees on DIFFERENT ROADMs/sites (kilometers distance)" - icon: mdi:fiber-optic - display_label: computed_name__value - human_friendly_id: - - fiber_link__link_id__value - - channel__channel_name__value - uniqueness_constraints: - - [fiber_link, channel] - attributes: - - name: allocation_status - kind: Dropdown - optional: false - default_value: "reserved" - choices: - - name: reserved - label: "Reserved" - description: "Channel reserved but not in use" - color: "#f5a623" - - name: allocated - label: "Allocated" - description: "Channel allocated to service" - color: "#0099cc" - - name: in_use - label: "In Use" - description: "Channel actively carrying traffic" - color: "#00cc00" - - name: maintenance - label: "Maintenance" - description: "Channel under maintenance" - color: "#ff9800" - - name: failed - label: "Failed" - description: "Channel has failed" - color: "#cc0000" - description: "Allocation status" - - name: tx_power_dbm - kind: Text - optional: true - description: "Measured transmit power in dBm (e.g., '0.5')" - - name: rx_power_dbm - kind: Text - optional: true - description: "Measured receive power in dBm (e.g., '-2.3')" - - name: osnr_db - kind: Text - optional: true - description: "Optical Signal-to-Noise Ratio in dB (e.g., '25.5')" - - name: allocated_date - kind: DateTime - optional: true - description: "Date channel was allocated" - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ fiber_link__link_id__value }}-{{ channel__channel_name__value }}" - description: "Auto-generated mapping identifier" - - name: description - kind: Text - optional: true - description: "Additional fiber mapping details" - relationships: - - name: fiber_link - peer: DcimFiberLink - cardinality: one - kind: Attribute - optional: false - identifier: "fiber_channel_mappings" - description: "Long-haul fiber link connecting the degrees" - - # ============================================================================ - # Topology Layer - Optical Nodes and Fiber Links - # ============================================================================ - - # ============================================================================ - # OpticalNode - Logical Network Topology Element - # ============================================================================ - - name: OpticalNode # DcimOpticalNode - namespace: Dcim - include_in_menu: true - label: "Optical Node" - description: "Logical network endpoint in optical topology (graph node, not physical device)" - icon: mdi:lan - inherit_from: - - DcimOpticalDevice - display_label: computed_name__value - human_friendly_id: - - name__value - uniqueness_constraints: - - [name__value] - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ name__value }}" - description: "Computed name for display" - - name: name - kind: Text - optional: false - description: "Logical node name (e.g., GENESIS-OL-10, SKYLINE-OL-1)" - - name: node_type - kind: Dropdown - optional: false - choices: - - name: endpoint - label: "Endpoint" - description: "Edge node (traffic originates/terminates)" - color: "#2196f3" - - name: intermediate - label: "Intermediate" - description: "Pass-through node (ROADM only)" - color: "#9c27b0" - - name: branching - label: "Branching" - description: "Multiple fiber paths meet (hub)" - color: "#ff9800" - description: "Topology role of this node" - - name: description - kind: Text - optional: true - description: "Node notes and function" - relationships: - - name: device - peer: DcimPhysicalDevice - cardinality: one - kind: Attribute - optional: true - identifier: optical_nodes__physical_device - description: "Physical chassis that implements this logical node" - - name: transponder_modules - peer: DcimTransponderModule - cardinality: many - kind: Attribute - optional: true - identifier: optical_node__transponder_modules - description: "Transponder modules connected to this optical node (for cross-connects)" - - name: links - peer: DcimFiberLink - cardinality: many - kind: Component - optional: true - identifier: optical_node__links - description: "Fiber links connected to this node" - - # ============================================================================ - # PassiveMultiplexer - Standalone Passive Mux/Demux - # ============================================================================ - - name: PassiveMultiplexer # DcimPassiveMultiplexer - namespace: Dcim - include_in_menu: true - label: "Passive Multiplexer" - description: "Passive CWDM/DWDM multiplexer (fixed port count, no modules)" - icon: mdi:resistor-nodes - inherit_from: - - DcimPhysicalDevice - display_label: computed_name__value - human_friendly_id: - - name__value - uniqueness_constraints: - - [name__value] - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ name__value }}" - description: "Computed name for display" - - name: name - kind: Text - optional: false - description: "Passive mux name (e.g., CHI-PMUX-01)" - - name: port_count - kind: Number - optional: false - description: "Number of fixed ports (e.g., 8, 16, 32, 40)" - - name: mux_type - kind: Dropdown - optional: false - choices: - - name: cwdm - label: "CWDM" - description: "Coarse Wavelength Division Multiplexing" - color: "#4a90e2" - - name: dwdm - label: "DWDM" - description: "Dense Wavelength Division Multiplexing" - color: "#9933cc" - description: "Type of passive multiplexer" - - name: description - kind: Text - optional: true - description: "Device notes" - - # ============================================================================ - # FiberLink - Network Graph Edge - # ============================================================================ - - name: FiberLink # DcimFiberLink - namespace: Dcim - include_in_menu: true - label: "Fiber Link" - description: "Fiber connecting two optical nodes (graph edge)" - icon: mdi:cable-data - display_label: link_id__value - human_friendly_id: - - link_id__value - uniqueness_constraints: - - [link_id__value] - attributes: - - name: link_id - kind: Text - optional: false - description: "Unique link identifier (e.g., LINK-001)" - # FIXME: Text until float are supported in Number - - name: distance_km - kind: Text - optional: true - description: "Physical distance in kilometers (e.g., '920.5')" - # FIXME: Text until float are supported in Number - - name: attenuation_db - kind: Text - optional: true - description: "Total fiber attenuation in dB (e.g., '18.4')" - - name: status - kind: Dropdown - optional: false - default_value: "planned" - choices: - - name: planned - label: "Planned" - description: "Link is planned but not yet installed" - color: "#95a5a6" - - name: active - label: "Active" - description: "Link is in service" - color: "#00cc00" - - name: standby - label: "Standby" - description: "Link is installed but not active" - color: "#f5a623" - - name: maintenance - label: "Maintenance" - description: "Link is under maintenance" - color: "#ff9800" - - name: failed - label: "Failed" - description: "Link has failed" - color: "#cc0000" - description: "Operational status of fiber link" - - name: commissioned_date - kind: DateTime - optional: true - description: "Date link was commissioned" - - name: description - kind: Text - optional: true - description: "Additional link details" - relationships: - - name: endpoints - peer: DcimOpticalNode - identifier: optical_node__links - cardinality: many - # Keeping them as Attribute as we want to show both endpoints in link view - kind: Attribute - optional: false - max_count: 2 - description: "Port-level endpoints participating in this link" - - name: mappings - peer: DcimFiberMapping - cardinality: many - kind: Component - identifier: "fiber_channel_mappings" - optional: true - description: "DWDM channels allocated on this link" - - # ============================================================================ - # Equipment Layer - Modules and ROADM Degrees - # ============================================================================ - - # ============================================================================ - # OpticalModuleType - Specific optical module categorization - # ============================================================================ - - name: OpticalModuleType # DcimOpticalModuleType - namespace: Dcim - include_in_menu: true - label: "Optical Module Type" - description: "Categorization of optical modules by function" - icon: mdi:expansion-card - inherit_from: - - DcimGenericModuleType - attributes: - - name: name - kind: Text - optional: false - description: "Module type name" - - name: description - kind: Text - optional: true - description: "Module type description" - - name: module_category - kind: Dropdown - optional: false - description: "Functional category of the module" - choices: - - name: transponder - label: "Transponder" - description: "Optical-electrical-optical conversion" - color: "#2196f3" - - name: multiplexer - label: "Multiplexer/ROADM" - description: "Wavelength multiplexing and switching" - color: "#9c27b0" - - name: amplifier - label: "Amplifier" - description: "Optical signal amplification" - color: "#ff9800" - - name: monitoring - label: "Monitoring" - description: "Optical performance monitoring" - color: "#4caf50" - - name: control - label: "Control" - description: "System control and management" - color: "#607d8b" - - name: power - label: "Power Supply" - description: "Power management modules" - color: "#795548" - - name: cooling - label: "Cooling" - description: "Thermal management" - color: "#00bcd4" - - # ============================================================================ - # TransponderModule - Wavelength Transmitter/Receiver Module - # ============================================================================ - - name: TransponderModule # DcimTransponderModule - namespace: Dcim - include_in_menu: true - label: "Transponder Module" - description: "Optical-electrical-optical conversion module (100G, 400G coherent) installed in chassis" - icon: mdi:chip - inherit_from: - - DcimGenericModule - display_label: computed_name__value - uniqueness_constraints: - - [computed_name__value] - human_friendly_id: - - computed_name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ module_bay__computed_name__value }}-TPD-{{ slot_number__value }}" - description: "Computed module name (e.g., dc1-leaf1 > slot 1-TPD-1/1)" - - name: slot_number - kind: Text - optional: false - description: "Slot number in chassis (e.g., '1/1', '1/2', '2/1')" - - name: capacity_gbps - kind: Number - optional: false - description: "Line rate capacity in Gbps (e.g., 100, 200, 400)" - - name: modulation_format - kind: Dropdown - optional: false - choices: - - name: dp_qpsk - label: "DP-QPSK" - description: "Dual-polarization QPSK (100G)" - color: "#2196f3" - - name: dp_16qam - label: "DP-16QAM" - description: "Dual-polarization 16QAM (200G)" - color: "#9c27b0" - - name: dp_8qam - label: "DP-8QAM" - description: "Dual-polarization 8QAM (150G)" - color: "#ff9800" - - name: dp_64qam - label: "DP-64QAM" - description: "Dual-polarization 64QAM (400G)" - color: "#4caf50" - description: "Modulation format for optical transmission" - - name: tunable_range - kind: Dropdown - optional: false - choices: - - name: c_band - label: "C-Band (1530-1565nm)" - description: "Full C-Band tunable" - color: "#9933cc" - - name: c_l_band - label: "C+L-Band (1530-1625nm)" - description: "Extended C+L-Band tunable" - color: "#cc33cc" - - name: fixed - label: "Fixed Wavelength" - description: "Non-tunable, fixed wavelength" - color: "#95a5a6" - description: "Wavelength tuning capability" - - name: fec_type - kind: Dropdown - optional: true - choices: - - name: sd_fec - label: "SD-FEC" - description: "Soft-decision FEC (7% overhead)" - color: "#2196f3" - - name: hd_fec - label: "HD-FEC" - description: "Hard-decision FEC (25% overhead)" - color: "#ff9800" - - name: c_fec - label: "C-FEC" - description: "Concatenated FEC" - color: "#4caf50" - - name: o_fec - label: "O-FEC" - description: "OpenFEC" - color: "#9c27b0" - description: "Forward error correction type" - - name: client_interface - kind: Text - optional: true - description: "Client-side interface (e.g., 100GE, 400GE, OTU4)" - - name: line_interface - kind: Text - optional: true - description: "Line-side interface (e.g., CFP2-DCO, QSFP28, QSFP-DD)" - relationships: - - name: tuned_channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: true - identifier: "dwdm_channel__transponder_modules" - description: "DWDM channel currently tuned/configured" - - name: connected_to_optical_node - peer: DcimOpticalNode - cardinality: one - kind: Attribute - optional: true - identifier: optical_node__transponder_modules - description: "Optical node this transponder module connects to (for cross-connects)" - - # ============================================================================ - # OpticalMultiplexerModule - Mux/Demux/ROADM Module - # ============================================================================ - - name: OpticalMultiplexerModule # DcimOpticalMultiplexerModule - namespace: Dcim - include_in_menu: true - label: "Optical Multiplexer Module" - description: "Multiplexer/Demultiplexer/ROADM module for wavelength management installed in chassis" - icon: mdi:router-network - inherit_from: - - DcimGenericModule - display_label: computed_name__value - human_friendly_id: - - computed_name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ module_bay__computed_name__value }}-MUX-{{ slot_number__value }}" - description: "Computed module name (e.g., dc1-leaf1 > slot 1-MUX-1/3)" - - name: slot_number - kind: Text - optional: false - description: "Slot number in chassis (e.g., '1/3', '1/4', '2/3')" - - name: mux_type - kind: Dropdown - optional: false - choices: - - name: passive_mux - label: "Passive Mux" - description: "Passive wavelength multiplexer (fixed)" - color: "#95a5a6" - - name: passive_demux - label: "Passive Demux" - description: "Passive wavelength demultiplexer (fixed)" - color: "#7f8c8d" - - name: oadm - label: "OADM" - description: "Optical Add-Drop Multiplexer" - color: "#3498db" - - name: roadm - label: "ROADM" - description: "Reconfigurable Optical Add-Drop Multiplexer" - color: "#9b59b6" - - name: wss - label: "WSS" - description: "Wavelength Selective Switch" - color: "#e74c3c" - description: "Type of multiplexer technology" - - name: channel_capacity - kind: Number - optional: false - description: "Number of supported DWDM channels (e.g., 40, 80, 96)" - - name: technology - kind: Dropdown - optional: true - choices: - - name: thin_film_filter - label: "Thin Film Filter" - description: "Passive thin film filter technology" - color: "#95a5a6" - - name: awg - label: "AWG" - description: "Arrayed Waveguide Grating" - color: "#3498db" - - name: wss_lcos - label: "WSS (LCOS)" - description: "Wavelength Selective Switch (Liquid Crystal on Silicon)" - color: "#9b59b6" - - name: wss_mems - label: "WSS (MEMS)" - description: "Wavelength Selective Switch (Micro-Electro-Mechanical Systems)" - color: "#e74c3c" - description: "Underlying multiplexer technology" - - name: degree_count - kind: Number - optional: true - description: "Number of ROADM degrees (e.g., 2, 4, 8, 16)" - - name: colorless - kind: Boolean - optional: true - default_value: false - description: "Colorless add/drop capability (any channel on any port)" - - name: directionless - kind: Boolean - optional: true - default_value: false - description: "Directionless add/drop capability (any port to any degree)" - - name: contentionless - kind: Boolean - optional: true - default_value: false - description: "Contentionless add/drop (CDC - Colorless, Directionless, Contentionless)" - relationships: - - name: degrees - peer: DcimRoadmDegree - cardinality: many - kind: Component - optional: true - identifier: "optical_multiplexer_module__degrees" - description: "ROADM degrees (line ports) on this multiplexer module" - - name: mappings - peer: DcimChannelMapping - cardinality: many - kind: Attribute - optional: true - identifier: "roadm_module__channel_mappings" - description: "Channel mappings (DirectConnect, CableMapping, FiberMapping) associated with this module" - - # ============================================================================ - # RoadmDegree - ROADM Degree with Line Port - # ============================================================================ - - name: RoadmDegree # DcimRoadmDegree - namespace: Dcim - include_in_menu: true - label: "ROADM Degree" - description: "ROADM degree with line port (OL-1, OL-2, etc.)" - icon: mdi:lan-connect - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - - [roadm, degree_number__value] - - [roadm, line_port__value] - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ roadm__computed_name__value }}-{{ line_port__value }}" - description: "Computed name (e.g., ROADM-SITE-A-OL-1)" - - name: degree_number - kind: Number - optional: false - description: "Degree number (1-based, e.g., 1, 2, 3, 4)" - # TODO: Should we compute it based on degree_number and degree_type - - name: line_port - kind: Text - optional: false - description: "Line port designation (e.g., OL-1, OL-2, OL-7)" - - name: direction - kind: Dropdown - optional: false - choices: - - name: north - label: "North" - description: "Northbound direction" - color: "#3498db" - - name: south - label: "South" - description: "Southbound direction" - color: "#e74c3c" - - name: east - label: "East" - description: "Eastbound direction" - color: "#2ecc71" - - name: west - label: "West" - description: "Westbound direction" - color: "#f39c12" - - name: express - label: "Express" - description: "Express port (bypass)" - color: "#9b59b6" - - name: local - label: "Local" - description: "Local add/drop" - color: "#95a5a6" - description: "Directional designation of degree" - - name: degree_type - kind: Dropdown - optional: false - choices: - - name: line - label: "Line" - description: "Line port (connects to fiber link)" - color: "#2196f3" - - name: express - label: "Express" - description: "Express port (R-x ports, bypass)" - color: "#9c27b0" - - name: add_drop - label: "Add/Drop" - description: "Local add/drop for transponders" - color: "#4caf50" - description: "Type of ROADM degree" - - name: wavelength_capacity - kind: Number - optional: true - description: "Number of wavelengths supported on this degree" - - name: description - kind: Text - optional: true - description: "Additional degree details" - relationships: - - name: roadm - peer: DcimOpticalMultiplexerModule - cardinality: one - kind: Parent - optional: false - identifier: "optical_multiplexer_module__degrees" - description: "Parent ROADM module containing this degree" - - name: connected_fiber - peer: DcimFiberLink - cardinality: one - kind: Attribute - optional: true - identifier: "fiber_link__roadm_degree" - description: "Fiber link connected to this line port" - - name: channel_mappings - peer: DcimChannelMapping - cardinality: many - kind: Attribute - optional: true - identifier: "roadm_degree__channel_mappings" - description: "Channel mappings involving this degree" - - # ============================================================================ - # WSSConnect - Internal WSS Cross-Connect (Same ROADM) - # ============================================================================ - - name: WSSConnect # DcimWSSConnect - namespace: Dcim - inherit_from: - - DcimChannelMapping - include_in_menu: true - label: "WSS Connect" - description: "Internal WSS cross-connect between degrees on SAME ROADM device (0m distance)" - icon: mdi:swap-horizontal - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - # FIXME: enforce per degrees ? - - [roadm, channel] - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - # TODO: should have the degrees, but need computed with Python for that - jinja2_template: "{{ roadm__computed_name__value }}-{{ channel__channel_name__value }}" - description: "Computed connection ID" - - name: description - kind: Text - optional: true - description: "Additional cross-connect details" - relationships: - - name: roadm - peer: DcimOpticalMultiplexerModule - cardinality: one - kind: Attribute - optional: false - identifier: "roadm_module__channel_mappings" - description: "Parent ROADM device" - # Note: channel and degrees relationships inherited from ChannelMapping generic - # TODO: Add validation to ensure both degrees have same parent as roadm - - # ============================================================================ - # CableMapping - Local Patch Cable Mapping (Different ROADMs, Same Site) - # ============================================================================ - - name: CableMapping # DcimCableMapping - namespace: Dcim - inherit_from: - - DcimChannelMapping - include_in_menu: true - label: "Cable Mapping" - description: "Local patch cable between degrees on DIFFERENT ROADMs (meters distance, same site)" - icon: mdi:cable-data - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - - [cable, channel] - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ cable__label__value }}-{{ channel__channel_name__value }}" - description: "Computed mapping name (e.g., CABLE-123-CH58)" - - name: description - kind: Text - optional: true - description: "Additional cable mapping details" - relationships: - - name: cable - peer: DcimCable - cardinality: one - kind: Attribute - optional: false - identifier: "cable__channel_mappings" - description: "Physical patch cable connecting the degrees" - # Note: channel and degrees relationships inherited from ChannelMapping generic - # TODO: Add validation to ensure degrees are from different ROADMs - - # ============================================================================ - # OpticalAmplifierModule - EDFA/Raman/VGC Amplifier Module - # ============================================================================ - - name: OpticalAmplifierModule # DcimOpticalAmplifierModule - namespace: Dcim - include_in_menu: true - label: "Optical Amplifier Module" - description: "Optical signal amplifier module (EDFA, Raman, VGC) installed in chassis" - icon: mdi:amplifier - inherit_from: - - DcimGenericModule - display_label: computed_name__value - human_friendly_id: - - computed_name__value - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ module_bay__computed_name__value }}-AMP-{{ slot_number__value }}" - description: "Computed module name (e.g., dc1-leaf1 > slot 1-AMP-1/5)" - - name: slot_number - kind: Text - optional: false - description: "Slot number in chassis (e.g., '1/5', '1/6', '2/5')" - - name: amplifier_type - kind: Dropdown - optional: false - choices: - - name: edfa - label: "EDFA" - description: "Erbium-Doped Fiber Amplifier" - color: "#2196f3" - - name: raman - label: "Raman" - description: "Raman Amplifier (distributed)" - color: "#9c27b0" - - name: soa - label: "SOA" - description: "Semiconductor Optical Amplifier" - color: "#ff9800" - - name: vgc - label: "VGC" - description: "Variable Gain Controller" - color: "#4caf50" - - name: hybrid - label: "Hybrid" - description: "Hybrid amplifier (e.g., EDFA + Raman)" - color: "#607d8b" - description: "Type of optical amplifier" - - name: stage - kind: Dropdown - optional: false - choices: - - name: booster - label: "Booster" - description: "Power amplifier (transmit side)" - color: "#e74c3c" - - name: inline - label: "Inline" - description: "In-line amplifier (along fiber span)" - color: "#3498db" - - name: preamplifier - label: "Pre-Amplifier" - description: "Low-noise amplifier (receive side)" - color: "#2ecc71" - description: "Amplifier stage position" - - name: gain_db - kind: Text - optional: true - description: "Typical gain in dB (e.g., '20.0', '17.5')" - - name: max_output_power_dbm - kind: Text - optional: true - description: "Maximum output power in dBm (e.g., '17.0', '23.0')" - - name: noise_figure_db - kind: Text - optional: true - description: "Noise figure in dB (e.g., '5.5', '4.8')" - - name: operating_band - kind: Dropdown - optional: false - choices: - - name: c_band - label: "C-Band (1530-1565nm)" - description: "C-Band operation" - color: "#9933cc" - - name: l_band - label: "L-Band (1565-1625nm)" - description: "L-Band operation" - color: "#cc33cc" - - name: c_l_band - label: "C+L-Band" - description: "Dual-band operation" - color: "#ff33cc" - description: "Operating wavelength band" - relationships: - - name: amplified_link - peer: DcimFiberLink - cardinality: one - kind: Attribute - optional: true - identifier: "fiber_link__amplifier_modules" - description: "Fiber link being amplified (for inline amplifiers)" - - # ============================================================================ - # Service Layer - End-to-End Optical Services - # ============================================================================ - - # ============================================================================ - # OpticalService - End-to-End Customer Circuit - # ============================================================================ - - name: OpticalService # DcimOpticalService - namespace: Dcim - include_in_menu: true - label: "Optical Service" - description: "End-to-end optical transport service (customer circuit) spanning multiple sites" - icon: mdi:transit-connection-variant - display_label: service_name__value - human_friendly_id: - - service_id__value - uniqueness_constraints: - - [service_id__value] - order_by: - - service_id__value - attributes: - - name: service_id - kind: Text - optional: false - description: "Unique service identifier" - - name: service_name - kind: Text - optional: false - description: "Customer service name (e.g., 'ATC 10G - Albion to Arco #2')" - - name: service_type - kind: Dropdown - optional: false - choices: - - name: wavelength - label: "Wavelength Service" - description: "Dedicated wavelength end-to-end" - color: "#9c27b0" - - name: transport - label: "Transport Service" - description: "Layer 1 optical transport" - color: "#2196f3" - - name: ip_transit - label: "IP Transit" - description: "Layer 3 IP service over optical" - color: "#4caf50" - description: "Type of optical service" - - name: bandwidth - kind: Text - optional: false - description: "Service bandwidth (e.g., '10G', '100G', '400G')" - - name: status - kind: Dropdown - optional: false - default_value: "planned" - choices: - - name: planned - label: "Planned" - description: "Service planned but not provisioned" - color: "#95a5a6" - - name: provisioned - label: "Provisioned" - description: "Service configured but not active" - color: "#f5a623" - - name: active - label: "Active" - description: "Service in production" - color: "#00cc00" - - name: maintenance - label: "Maintenance" - description: "Service under maintenance" - color: "#ff9800" - - name: failed - label: "Failed" - description: "Service down" - color: "#cc0000" - description: "Service operational status" - - name: customer_circuit_id - kind: Text - optional: true - description: "Customer's circuit ID (e.g., '99/OKFS/000029//SYG')" - - name: provision_date - kind: DateTime - optional: true - description: "Date service was provisioned" - - name: description - kind: Text - optional: true - description: "Additional service details" - relationships: - - name: transponders - peer: DcimTransponderModule - cardinality: many - min_count: 2 - max_count: 2 - kind: Attribute - optional: false - identifier: "transponder_module__optical_services" - description: "Two transponders (endpoints) for this service (bidirectional)" - - name: channel - peer: DcimDWDMChannel - cardinality: one - kind: Attribute - optional: false - identifier: "dwdm_channel__services" - description: "DWDM channel used for this service" - - name: primary_path - peer: DcimOpticalPath - cardinality: one - kind: Component - optional: false - identifier: "optical_service__primary_path" - description: "Primary optical path for this service" - - name: backup_path - peer: DcimOpticalPath - cardinality: one - kind: Component - optional: true - identifier: "optical_service__backup_path" - description: "Backup/protection path for this service" - - # ============================================================================ - # OpticalPath - Network Path Through Multiple Sites - # ============================================================================ - - name: OpticalPath # DcimOpticalPath - namespace: Dcim - include_in_menu: true - label: "Optical Path" - description: "Ordered sequence of segments forming an optical path through the network" - icon: mdi:map-marker-path - display_label: name__value - human_friendly_id: - - name__value - attributes: - - name: name - kind: Text - optional: false - unique: true - description: "Path name (e.g., MS-W17D5-primary)" - - name: path_type - kind: Dropdown - optional: false - choices: - - name: primary - label: "Primary" - description: "Primary working path" - color: "#2196f3" - - name: backup - label: "Backup" - description: "Backup/protection path" - color: "#ff9800" - - name: express - label: "Express" - description: "Express bypass path" - color: "#9c27b0" - description: "Type of path (primary, backup, express)" - # TODO: Computed ? - - name: total_distance_km - kind: Text - optional: true - description: "Total path distance in kilometers" - # TODO: Computed ? - - name: total_loss_db - kind: Text - optional: true - description: "Total optical loss in dB" - # TODO: Computed ? - - name: hop_count - kind: Number - optional: true - description: "Number of ROADM hops in path" - # TODO: Replace with a status - - name: is_active - kind: Boolean - optional: false - default_value: true - description: "Whether this path is currently active" - relationships: - - name: segments - peer: DcimPathSegment - identifier: optical_path__segments - cardinality: many - kind: Component - optional: true - description: "Ordered segments forming this path" - - name: is_primary_of_service - peer: DcimOpticalService - identifier: optical_service__primary_path - cardinality: one - kind: Attribute - optional: true - description: "Optical service using this path" - - name: is_backup_of_service - peer: DcimOpticalService - identifier: optical_service__backup_path - cardinality: one - kind: Attribute - optional: true - description: "Optical service using this path as backup" - - # ============================================================================ - # PathSegment - One Hop in the Optical Path - # ============================================================================ - - name: PathSegment # DcimPathSegment - namespace: Dcim - include_in_menu: true - label: "Path Segment" - description: "One hop in optical path - references channel mapping (fiber, cable, or cross-connect)" - icon: mdi:ray-start-arrow - display_label: computed_name__value - human_friendly_id: - - computed_name__value - uniqueness_constraints: - - [path, segment_order__value] - attributes: - - name: computed_name - kind: Text - read_only: true - optional: false - computed_attribute: - kind: Jinja2 - jinja2_template: "{{ path__name__value }}-SEG{{ segment_order__value }}" - description: "Computed segment name (e.g., MS-W17D5-primary-SEG1)" - - name: segment_order - kind: Number - optional: false - description: "Order of this segment in the path (1, 2, 3...)" - - name: segment_type - kind: Dropdown - optional: false - choices: - - name: fiber - label: "Fiber" - description: "Segment traverses a long-haul fiber link" - color: "#2196f3" - - name: cross_connect - label: "Cross-Connect" - description: "Segment crosses through ROADM degrees (internal WSS)" - color: "#9c27b0" - - name: cable - label: "Cable" - description: "Segment traverses a local patch cable" - color: "#ff9800" - - name: add - label: "Add" - description: "Service added at this point (A-end)" - color: "#4caf50" - - name: drop - label: "Drop" - description: "Service dropped at this point (Z-end)" - color: "#ff5722" - description: "Type of segment" - - name: loss_db - kind: Text - optional: true - description: "Optical loss for this segment in dB" - relationships: - - name: path - peer: DcimOpticalPath - cardinality: one - kind: Parent - optional: false - identifier: optical_path__segments - description: "Parent path containing this segment" - - name: channel_mapping - peer: DcimChannelMapping - cardinality: one - kind: Attribute - on_delete: cascade - optional: true - identifier: "channel_mapping__path_segments" - description: "Channel mapping (WSS Connect, Cable Mapping, or Fiber Mapping)" - -extensions: - nodes: - - kind: DcimPhysicalDevice - relationships: - - name: optical_node - peer: DcimOpticalNode - kind: Generic - optional: true - cardinality: many - identifier: optical_nodes__physical_device diff --git a/extensions/optical_multiplexer/README.md b/extensions/optical_multiplexer/README.md deleted file mode 100644 index 11a07d92..00000000 --- a/extensions/optical_multiplexer/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# optical_multiplexer - -Please refer to the [reference page](https://docs.infrahub.app/schema-library/reference/optical_multiplexer) for the corresponding documentation. diff --git a/extensions/optical_multiplexer/optical_multiplexer.yml b/extensions/optical_multiplexer/optical_multiplexer.yml deleted file mode 100644 index f6e6311f..00000000 --- a/extensions/optical_multiplexer/optical_multiplexer.yml +++ /dev/null @@ -1,323 +0,0 @@ ---- -# yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json -# --------------------------------------------------------------------------- -# This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review, see -# docs.infrahub.app, or reach out to OpsMill for help. -# --------------------------------------------------------------------------- -version: "1.0" - -generics: - - name: GenericOadmInterface - namespace: Dcim - description: Generic interface of an optical add-drop multiplexer, front or rear. - label: Optical Multiplexer Interfaces - icon: mdi:ethernet - include_in_menu: true - menu_placement: DcimOpticalMultiplexer - attributes: - - name: name - kind: Text - optional: false - order_weight: 1000 - - name: description - kind: Text - optional: true - order_weight: 1100 - # NOTE: this choice list is duplicated in extensions/patch_panel and the two must be - # kept in sync. Infrahub cannot share a choice list across extension files without a - # shared generic in a common ancestor, which is a base-tier change. - - name: connector_type - kind: Dropdown - choices: - - name: fc - label: FC - description: "Standardized fiber optic connector used primarily in datacom and telecom applications." - - name: lc - label: LC - description: "Compact fiber optic connector with a push-pull mechanism." - - name: lc_pc - label: LC/PC - description: "Polished LC connector providing physical contact (PC)." - - name: lc_upc - label: LC/UPC - description: "Ultra-Physical Contact (UPC) variant of the LC connector with enhanced polish." - - name: lc_apc - label: LC/APC - description: "Angled Physical Contact (APC) version of the LC connector with a slanted fiber end-face." - - name: lsh - label: LSH - description: "European fiber optic connector offering high durability." - - name: lsh_pc - label: LSH/PC - description: "Physical Contact version of LSH with standard polish." - - name: lsh_upc - label: LSH/UPC - description: "Ultra-Physical Contact variant of LSH, minimizing return loss with a superior polish." - - name: lsh_apc - label: LSH/APC - description: "Angled Physical Contact version of LSH, designed to reduce back reflections." - - name: lx_5 - label: LX.5 - description: "Miniaturized fiber optic connector similar to LC but with an additional shutter mechanism." - - name: lx_5_pc - label: LX.5/PC - description: "Physical Contact version of LX.5." - - name: lx_5_upc - label: LX.5/UPC - description: "Ultra-Physical Contact variant of LX.5." - - name: lx_5_apc - label: LX.5/APC - description: "Angled Physical Contact version of LX.5." - - name: mpo - label: MPO - description: "Multi-fiber Push-On connector typically used in data centers for high-speed applications." - - name: mtrj - label: MTRJ - description: "Male-to-female fiber optic connector with two fibers." - - name: sc - label: SC - description: "Square fiber optic connector with push-pull lock." - - name: sc_pc - label: SC/PC - description: "Physical Contact SC connector with a polished end-face." - - name: sc_upc - label: SC/UPC - description: "Ultra-Physical Contact variant of SC." - - name: sc_apc - label: SC/APC - description: "Angled Physical Contact version of SC." - - name: st - label: ST - description: "Bayonet-style fiber optic connector primarily used in industrial and military applications." - - name: cs - label: CS - description: "Compact connector with a high-density duplex configuration." - - name: sn - label: SN - description: "Small-form connector with dual fibers." - - name: sma_905 - label: SMA 905 - description: "Stainless steel fiber optic connector." - - name: sma_906 - label: SMA 906 - description: "Variant of SMA 905 with similar durability, frequently used in high-vibration settings." - - name: urm_p2 - label: URM-P2 - description: "Specialized fiber optic connector for industrial and harsh environments." - - name: urm_p4 - label: URM-P4 - description: "Similar to URM-P2 but designed for higher performance." - - name: urm_p8 - label: URM-P8 - description: "Enhanced version of URM connectors with higher protection." - - name: splice - label: Splice - description: "Permanent fiber connection method where two fiber ends are fused." - optional: false - order_weight: 1200 -nodes: - - name: OpticalMultiplexer - namespace: Dcim - description: >- - An OADM (Optical Add Drop Multiplexer) supporting various WDM - (Wavelength Division Multiplexing) technologies. - label: Optical Multiplexer - icon: mdi:transit-connection-variant - include_in_menu: true - inherit_from: - - DcimPhysicalDevice - human_friendly_id: - - name__value - order_by: - - name__value - display_label: name__value - attributes: - - name: name - kind: Text - unique: true - optional: false - order_weight: 1000 - - name: wdm_type - kind: Dropdown - default_value: dwdm - choices: - - name: cwdm - label: CWDM (Coarse Wavelength Division Multiplexing) - description: Supports multiple wavelengths for communication up to 70km. - color: "#0099cc" - - name: dwdm - label: DWDM (Dense Wavelength Division Multiplexing) - description: Supports dense wavelengths and amplification for long-distance communication. - color: "#9933cc" - optional: false - description: Type of WDM technology (e.g. CWDM, DWDM) - order_weight: 1300 - - name: description - kind: Text - optional: true - order_weight: 1100 - relationships: - - name: front_interfaces - peer: DcimOadmFrontInterface - kind: Component - cardinality: many - optional: true - identifier: optical_multiplexer__front_interfaces - order_weight: 1350 - - name: rear_interface - peer: DcimOadmRearInterface - kind: Component - cardinality: one - optional: true - identifier: optical_multiplexer__rear_interface - order_weight: 1450 - - - name: OadmFrontInterface - namespace: Dcim - description: Client-side interface of an optical add-drop multiplexer, carrying a single channel. - label: Optical Multiplexer Front Interfaces - include_in_menu: true - menu_placement: DcimGenericOadmInterface - inherit_from: - - DcimEndpoint - - DcimGenericOadmInterface - human_friendly_id: - - optical_multiplexer__name__value - - name__value - order_by: - - optical_multiplexer__name__value - - name__value - display_label: "{{ optical_multiplexer__name__value }} > {{ name__value }}" - uniqueness_constraints: - - [optical_multiplexer, name__value] - relationships: - - name: optical_multiplexer - peer: DcimOpticalMultiplexer - kind: Parent - cardinality: one - optional: false - identifier: optical_multiplexer__front_interfaces - order_weight: 900 - - name: channels - peer: DcimWdmChannel - kind: Attribute - cardinality: many - optional: true - identifier: oadm_interface__channels - order_weight: 1300 - - - name: OadmRearInterface - namespace: Dcim - description: Line-side interface of an optical add-drop multiplexer, carrying the multiplexed signal. - label: Optical Multiplexer Rear Interfaces - include_in_menu: true - menu_placement: DcimGenericOadmInterface - inherit_from: - - DcimEndpoint - - DcimGenericOadmInterface - human_friendly_id: - - optical_multiplexer__name__value - - name__value - order_by: - - optical_multiplexer__name__value - - name__value - display_label: "{{ optical_multiplexer__name__value }} > {{ name__value }}" - uniqueness_constraints: - - [optical_multiplexer, name__value] - relationships: - - name: optical_multiplexer - peer: DcimOpticalMultiplexer - kind: Parent - cardinality: one - optional: false - identifier: optical_multiplexer__rear_interface - order_weight: 900 - - - name: WdmChannel - namespace: Dcim - description: A WDM channel with its wavelength and frequency. - label: WDM Channel - icon: game-icons:laser-warning - include_in_menu: true - human_friendly_id: - - wdm_type__value - - channel__value - order_by: - - wdm_type__value - - channel__value - display_label: "{{ wdm_type__value }} Channel {{ channel__value }}" - uniqueness_constraints: - # Combination must be unique - - [frequency__value, wavelength__value, channel__value, wdm_type__value] - # For a given type channel number must be unique - - [channel__value, wdm_type__value] - # TODO: Maybe add some further validations - attributes: - - name: channel - kind: Number - optional: false - description: WDM channel number. - order_weight: 1000 - - name: wdm_type - kind: Dropdown - default_value: dwdm - choices: - - name: cwdm - label: CWDM (Coarse Wavelength Division Multiplexing) - description: Supports multiple wavelengths for communication up to 70km. - color: "#0099cc" - - name: dwdm - label: DWDM (Dense Wavelength Division Multiplexing) - description: Supports dense wavelengths and amplification for long-distance communication. - color: "#9933cc" - optional: false - description: Type of WDM technology (e.g. CWDM, DWDM) - order_weight: 1100 - - name: wavelength - kind: Text # Text until float possible in Number Kind - label: Wavelength (nm) - optional: false - description: Wavelength of the channel in nm. - order_weight: 1200 - - name: frequency - kind: Text # Text until float possible in Number Kind - label: Frequency (GHz) - optional: false - description: Frequency of the channel in GHz. - order_weight: 1300 - - - name: WdmTransceiver - namespace: Dcim - description: Transceiver tuned to a Wavelength Division Multiplexing channel. - label: WDM Transceiver - icon: mdi:laser-pointer - include_in_menu: true - menu_placement: DcimGenericTransceiver - inherit_from: - - DcimGenericTransceiver - attributes: - - name: wdm_type - kind: Dropdown - default_value: dwdm - choices: - - name: cwdm - label: CWDM (Coarse Wavelength Division Multiplexing) - description: Supports multiple wavelengths for communication up to 70km. - color: "#0099cc" - - name: dwdm - label: DWDM (Dense Wavelength Division Multiplexing) - description: Supports dense wavelengths and amplification for long-distance communication. - color: "#9933cc" - optional: false - description: Type of WDM technology (e.g. CWDM, DWDM) - order_weight: 1150 - relationships: - - name: wdm_channel - peer: DcimWdmChannel - label: WDM Channel - kind: Attribute - cardinality: one - optional: false - identifier: wdm_transceiver__channel - order_weight: 1250 diff --git a/extensions/otn/README.md b/extensions/otn/README.md new file mode 100644 index 00000000..f665a17a --- /dev/null +++ b/extensions/otn/README.md @@ -0,0 +1,3 @@ +# otn + +Please refer to the [reference page](https://docs.infrahub.app/schema-library/reference/otn) for the corresponding documentation. diff --git a/extensions/otn/otn.yml b/extensions/otn/otn.yml new file mode 100644 index 00000000..b9e8cf8b --- /dev/null +++ b/extensions/otn/otn.yml @@ -0,0 +1,3204 @@ +--- +# yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json +# --------------------------------------------------------------------------- +# This schema is a starting point for building with Infrahub, not a finished production model. +# Adapting it for your environment typically requires architectural review, see +# docs.infrahub.app, or reach out to OpsMill for help. +# --------------------------------------------------------------------------- +# Optical transport network. Ported from opsmill/infrahub-demo-otn at e98be9b. +# Devices here are optical roles; OtnGenericDevice.dcim_device links one to its +# DcimPhysicalDevice record. See the reference page for what is out of scope. +# A `cardinality: one` relationship earns an inverse only where the peer's own page +# is what the reverse list is for; otherwise use a server-side filter on the forward +# side. An inverse must reuse the forward identifier, or it reads an empty list. +# --------------------------------------------------------------------------- +version: "1.0" + +generics: + # Base generics. Generics cannot inherit generics, so a concrete node lists + # several rather than stacking them. + - name: GenericPort + namespace: Otn + description: Any port on any OTN device. The connection surface of the network. + label: Port + icon: mdi:ethernet + include_in_menu: false + human_friendly_id: + - device__name__value + - name__value + order_by: + - name__value + display_label: "{{ device__name__value }} {{ name__value }}" + uniqueness_constraints: + - ["device", "name__value"] + attributes: + - name: name + kind: Text + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._/-]+$" + optional: false + description: Port identifier as the vendor labels it, such as 1/1/1. + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: role + kind: Dropdown + default_value: spare + choices: + - name: client + label: Client + color: "#4caf50" + - name: line + label: Line + color: "#2196f3" + - name: add_drop + label: Add/drop + color: "#9c27b0" + - name: degree + label: Degree + color: "#673ab7" + - name: express + label: Express + description: A degree-to-degree pass-through. Wavelengths cross the node without adding or dropping. + color: "#00bcd4" + - name: booster + label: Booster + color: "#ff9800" + - name: preamp + label: Pre-amplifier + color: "#ffc107" + - name: tributary + label: Tributary + color: "#795548" + - name: spare + label: Spare + color: "#9e9e9e" + - name: monitor + label: Monitor + description: A monitoring interface, not a traffic-carrying port. + color: "#607d8b" + optional: false + order_weight: 1100 + - name: enabled + kind: Boolean + default_value: true + optional: false + order_weight: 1200 + - name: admin_state + kind: Dropdown + default_value: up + choices: + - name: up + label: Up + color: "#4caf50" + - name: down + label: Down + color: "#f44336" + - name: testing + label: Testing + color: "#ff9800" + optional: false + description: RFC 2863 ifAdminStatus. What the operator asked for. + order_weight: 1300 + - name: oper_state + kind: Dropdown + default_value: down + choices: + - name: up + label: Up + color: "#4caf50" + - name: down + label: Down + color: "#f44336" + - name: testing + label: Testing + color: "#ff9800" + - name: dormant + label: Dormant + color: "#2196f3" + - name: unknown + label: Unknown + color: "#9e9e9e" + optional: false + description: RFC 2863 ifOperStatus subset. What the port actually does. + order_weight: 1400 + relationships: + - name: device + peer: OtnGenericDevice + kind: Parent + cardinality: one + optional: false + identifier: otn_device__ports + order_weight: 800 + # The inverses of OtnPathHop.ingress_port and .egress_port. Together they let a + # ROADM's switching state be read from its ports, rather than only by walking + # every service's path. + - name: hops_ingress + peer: OtnPathHop + label: Hops entering here + kind: Attribute + cardinality: many + optional: true + identifier: otn_hop__ingress_port + order_weight: 910 + - name: hops_egress + peer: OtnPathHop + label: Hops leaving here + kind: Attribute + cardinality: many + optional: true + identifier: otn_hop__egress_port + order_weight: 920 + # No port-to-port adjacency attribute lives here. In the G.872 layering a + # section owns its adjacency and a port only terminates it, so intra-site + # jumpers are a DcimCable across the `connector` every port kind inherits from + # DcimEndpoint, inter-site plant is OtnFiberSpan.terminating_ports, and where + # the light goes is OtnOpticalPath. A `connected_to` edge here would be a + # fourth answer to a question those three already answer. + + - name: OpticalElement + namespace: Otn + description: Anything light passes through and loses power in. + label: Optical element + icon: mdi:blur-linear + include_in_menu: false + # No order_by and no human_friendly_id: both resolve against this generic's own + # attributes, and it declares none. Every member kind carries its own order_by. + attributes: + - name: insertion_loss_mdb + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 60000 + optional: false + description: Insertion loss in millidecibels, 0 to 60 dB. No Float kind exists. + order_weight: 1500 + - name: insertion_loss_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if insertion_loss_mdb__value is not none %}{{ insertion_loss_mdb__value / 1000 }} dB{% endif %} + optional: true + description: Insertion loss in dB. Read-only, derived from insertion_loss_mdb. + order_weight: 1510 + - name: vendor + kind: Text + parameters: + max_length: 64 + optional: true + order_weight: 1600 + - name: model + kind: Text + parameters: + max_length: 64 + optional: true + order_weight: 1700 + + # What an optical multiplex section is allowed to terminate on. A ROADM switches + # channels and a passive mux filters them, but either one bounds a section, so a + # fixed point-to-point DWDM system with no ROADM in it is still modellable. The + # generic stays a marker plus the two inverses; a device's own fields live on its + # kind. + - name: OmsEndpoint + namespace: Otn + description: A device that can terminate an optical multiplex section. + label: OMS endpoint + icon: mdi:ray-start-end + include_in_menu: false + relationships: + - name: sections_a + peer: OtnOpticalMultiplexSection + label: Sections (A end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__endpoint_a + order_weight: 960 + - name: sections_b + peer: OtnOpticalMultiplexSection + label: Sections (B end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__endpoint_b + order_weight: 970 + + - name: GenericDevice + namespace: Otn + description: Anything racked at a site. + label: Device + icon: mdi:server + # Carries the Devices entry in the sidebar. The ten device kinds nest under it. + include_in_menu: true + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: "#2196f3" + - name: provisioning + label: Provisioning + color: "#ff9800" + - name: active + label: Active + color: "#4caf50" + - name: maintenance + label: Maintenance + color: "#ffc107" + - name: decommissioned + label: Decommissioned + color: "#9e9e9e" + optional: false + order_weight: 1100 + - name: role + kind: Dropdown + choices: + - name: core + label: Core + color: "#3f51b5" + - name: edge + label: Edge + color: "#2196f3" + - name: access + label: Access + color: "#00bcd4" + - name: passive + label: Passive + color: "#9e9e9e" + optional: false + order_weight: 1200 + relationships: + # Not a Parent: Parent would force optional: false, and a device has to be + # creatable before its site record exists. + - name: site + peer: LocationSite + kind: Attribute + cardinality: one + optional: true + identifier: otn_site__devices + order_weight: 800 + # An OTN device names the optical role; DcimPhysicalDevice names the physical + # asset. This edge joins the two records for one box rather than duplicating + # it, and it is also the route to a rack elevation: the physical record carries + # `position`, `rack_face` and a `location` that may be a LocationRack. Optional, + # because a deployment with no Dcim inventory is equally valid. + - name: dcim_device + peer: DcimPhysicalDevice + label: Physical device record + kind: Attribute + cardinality: one + optional: true + identifier: otn_device__dcim_device + order_weight: 940 + - name: ports + peer: OtnGenericPort + kind: Component + cardinality: many + optional: true + identifier: otn_device__ports + on_delete: cascade + order_weight: 900 + + - name: OpticalPort + namespace: Otn + description: Optical-specific port properties. + label: Optical port + icon: mdi:lightbulb-on-outline + include_in_menu: false + attributes: + # Optional because a grey router port is not on the C-band grid. + - name: center_frequency_mhz + kind: Number + parameters: + min_value: 191350000 + max_value: 196100000 + optional: true + description: ITU-T G.694.1 centre frequency in MHz. No Float kind exists. + order_weight: 1600 + - name: center_frequency_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if center_frequency_mhz__value is not none %}{{ center_frequency_mhz__value / 1000000 }} THz{% endif %} + optional: true + description: Centre frequency in THz. Empty on a grey port, which has none. + order_weight: 1610 + - name: tx_power_mdbm + kind: Number + parameters: + min_value: -30000 + max_value: 30000 + optional: true + description: Transmit power in milli-dBm, -30 to +30 dBm. + order_weight: 1700 + - name: tx_power_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if tx_power_mdbm__value is not none %}{{ tx_power_mdbm__value / 1000 }} dBm{% endif %} + optional: true + description: Transmit power in dBm. Read-only, derived from tx_power_mdbm. + order_weight: 1710 + - name: rx_sensitivity_mdbm + kind: Number + parameters: + min_value: -40000 + max_value: 10000 + optional: true + description: Receiver sensitivity in milli-dBm, -40 to +10 dBm. + order_weight: 1800 + - name: rx_sensitivity_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if rx_sensitivity_mdbm__value is not none %}{{ rx_sensitivity_mdbm__value / 1000 }} dBm{% endif %} + optional: true + description: Receiver sensitivity in dBm. Derived from rx_sensitivity_mdbm. + order_weight: 1810 + # A Dropdown rather than an enum, so a connector carries a label, a colour and + # a sentence. The list is declared once here, and every kind inheriting this + # generic gets it. + - name: connector_type + kind: Dropdown + choices: + - name: LC + label: LC + description: Small-form duplex latch. What transponder and pluggable optics take. + color: "#2196f3" + - name: SC + label: SC + description: Push-pull square ferrule, common on older distribution frames. + color: "#4caf50" + - name: MPO-12 + label: MPO-12 + description: Twelve-fibre ribbon ferrule for parallel optics. + color: "#9c27b0" + - name: MPO-16 + label: MPO-16 + description: Sixteen-fibre ribbon ferrule for 400G parallel optics. + color: "#673ab7" + - name: FC + label: FC + description: Threaded ferrule. Still found on test sets and metro equipment. + color: "#ff9800" + - name: E2000 + label: E2000 + description: Shuttered push-pull connector, widespread on European carrier plant. + color: "#00bcd4" + - name: MU + label: MU + description: Miniature unibody connector, half the footprint of an SC. + color: "#8bc34a" + - name: CS + label: CS + description: Narrow-pitch duplex connector, used for QSFP-DD breakout. + color: "#e91e63" + - name: splice + label: Splice + description: Fusion splice rather than a mated pair. No connector loss and no polish. + color: "#9e9e9e" + optional: true + order_weight: 1900 + # Return loss is a polish property, not a connector property: an LC comes in + # all three. Optional, so ports loaded before it existed stay valid. + - name: polish + kind: Dropdown + choices: + - name: UPC + label: UPC + description: Ultra physical contact. Blue housing, about 50 dB return loss. + color: "#2196f3" + - name: APC + label: APC + description: Angled physical contact. Green housing, about 65 dB return loss. + color: "#4caf50" + - name: PC + label: PC + description: Physical contact. The oldest polish, about 35 dB return loss. + color: "#ff9800" + - name: none + label: None + description: No polished endface, such as a fusion splice. + color: "#9e9e9e" + optional: true + description: Endface polish. Mating an APC to a UPC costs about 0.5 dB and reflects. + order_weight: 1910 + + - name: CopperPort + namespace: Otn + description: Electrical port properties for G.703 tributaries. + label: Copper port + icon: mdi:cable-data + include_in_menu: false + attributes: + # kbps, not Mbps: as integer Mbps, E1 at 2.048 and T1 at 1.544 both round to 2. + - name: speed_kbps + kind: Number + default_value: 2048 + parameters: + min_value: 64 + max_value: 400000000 + optional: false + description: Line rate in kbps. E1 is 2048, T1 is 1544, STM-1 is 155520. + order_weight: 1600 + - name: impedance_ohm + kind: Number + default_value: 120 + parameters: + min_value: 50 + max_value: 600 + optional: false + description: Nominal impedance in ohms. 120 for E1 pair, 75 for coax. + order_weight: 1700 + - name: connector_type + kind: Dropdown + default_value: RJ48 + choices: + - name: BNC + label: BNC + description: Coaxial bayonet connector, used for 75 ohm E1 and STM-1. + color: "#ff9800" + - name: RJ48 + label: RJ48 + description: Eight-position jack for 120 ohm balanced E1 and T1 pairs. + color: "#2196f3" + - name: RJ45 + label: RJ45 + description: Eight-position jack for Ethernet management and console. + color: "#4caf50" + optional: false + order_weight: 1900 + +nodes: + # Ports. + - name: RouterPort + namespace: Otn + description: Grey optics on an IP router. Not on the C-band grid. + label: Router port + icon: mdi:ethernet + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + relationships: + # The module fitted in this port, and the inverse of the `otn_port` added to + # DcimGenericTransceiver below. Both ends are cardinality one, so a second + # module in one port is refused at write time. Declared only on the three + # concrete kinds that have a cage. + - name: transceiver + peer: DcimGenericTransceiver + label: Module fitted in this port + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 960 + + - name: ClientPort + namespace: Otn + description: Transponder client side. Where grey light arrives. + label: Client port + icon: mdi:lan-connect + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + relationships: + - name: transceiver + peer: DcimGenericTransceiver + label: Module fitted in this port + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 960 + + - name: LinePort + namespace: Otn + description: Transponder DWDM line side. Where coloured light leaves. + label: Line port + icon: mdi:transit-connection + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + relationships: + # The wavelength this port terminates. The deletion boundary stops here: a + # carrier is a spectrum allocation on a route, terminated at both of its ends, + # so cascading from one port would delete the containers and the customer + # services groomed into them. + - name: carrier + peer: OtnOpticalCarrier + label: Wavelength this port terminates + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__line_ports + order_weight: 850 + - name: transceiver + peer: DcimGenericTransceiver + label: Module fitted in this port + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 960 + + - name: RoadmAddDropPort + namespace: Otn + description: Local add and drop on a ROADM. + label: ROADM add/drop port + icon: mdi:call-split + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + + - name: RoadmDegreePort + namespace: Otn + description: Line-facing degree on a ROADM. One per direction. + label: ROADM degree port + icon: mdi:compass-outline + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + attributes: + - name: direction + kind: Dropdown + choices: + - name: north + label: North + color: "#2196f3" + - name: south + label: South + color: "#4caf50" + - name: east + label: East + color: "#ff9800" + - name: west + label: West + color: "#9c27b0" + - name: express + label: Express + description: Faces another degree rather than the outside world. Nothing adds or drops here. + color: "#00bcd4" + - name: local + label: Local + description: Faces add/drop equipment in the same building instead of a line route. + color: "#9e9e9e" + optional: true + description: How operators label this degree. Until now the port name was the only place to say it. + order_weight: 1500 + - name: wavelength_capacity + kind: Number + parameters: + min_value: 1 + max_value: 96 + optional: true + description: Nameplate wavelengths this degree is rated to pass, such as 40, 80 or 96. Not a count in use. + order_weight: 1520 + + - name: AmplifierPort + namespace: Otn + description: Amplifier input or output. + label: Amplifier port + icon: mdi:amplifier + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + + - name: SplitterPort + namespace: Otn + description: The common side of a splitter, or one of its output legs. + label: Splitter port + icon: mdi:call-split + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + attributes: + # Which side of the split this port is on. `role` on OtnGenericPort names what + # the port is for in the network; this names its place inside the device. + - name: leg + kind: Dropdown + default_value: output + choices: + - name: common + label: Common + description: The single side that carries the whole carrier. + color: "#2196f3" + - name: output + label: Output + description: One of the divided legs. + color: "#4caf50" + optional: false + description: Whether this port is the common side or an output leg. + order_weight: 1500 + + # One multiplexer channel and the common side it shares. Neither declares an + # insertion loss: that belongs to the device, so a per-port figure would double + # count. + - name: MuxClientPort + namespace: Otn + description: One channel of a multiplexer. The side facing the transponder or router that lights it. + label: Mux client port + icon: mdi:import + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + # A channel port should bind exactly one of these two edges. Infrahub has no + # cross-relationship constraint, so both neither and both are writable. + # Unenforced here. + relationships: + - name: dwdm_channel + peer: OtnFrequencyGrid + label: Dense channel this port carries + kind: Attribute + cardinality: one + optional: true + identifier: otn_frequency_grid__mux_client_ports + order_weight: 850 + - name: cwdm_channel + peer: OtnCwdmChannel + label: Coarse wavelength this port carries + kind: Attribute + cardinality: one + optional: true + identifier: otn_cwdm_channel__mux_client_ports + order_weight: 860 + + - name: MuxLinePort + namespace: Otn + description: The common side of a multiplexer, where the whole band leaves. + label: Mux line port + icon: mdi:export + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnOpticalPort + + - name: TributaryPort + namespace: Otn + description: E1 or T1 G.703 electrical tributary. The only copper port here. + label: Tributary port + icon: mdi:cable-data + include_in_menu: false + inherit_from: + - DcimEndpoint + - OtnGenericPort + - OtnCopperPort + + # The part catalog. The fitted unit is a DcimGenericTransceiver, extended below. + - name: TransceiverType + namespace: Otn + description: A pluggable optic part number and what it can be made to do. + label: Transceiver type + icon: mdi:chip + include_in_menu: true + menu_placement: OtnGenericDevice + human_friendly_id: + - part_number__value + order_by: + - part_number__value + display_label: part_number__value + attributes: + - name: part_number + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._/+-]+$" + optional: false + description: Vendor part number, such as QDD-400G-ZRP-S. + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1200 + - name: form_factor + kind: Dropdown + choices: + - name: QSFP-DD + label: QSFP-DD + description: Eight-lane double-density cage. What a coherent 400G pluggable takes. + color: "#2196f3" + - name: QSFP28 + label: QSFP28 + description: Four-lane cage, 100G grey optics. + color: "#4caf50" + - name: OSFP + label: OSFP + description: Eight-lane cage with a larger thermal budget than QSFP-DD. + color: "#9c27b0" + - name: CFP2-DCO + label: CFP2-DCO + description: Digital coherent optic. The DSP is in the module. + color: "#ff9800" + - name: CFP2-ACO + label: CFP2-ACO + description: Analogue coherent optic. The DSP is on the host card. + color: "#ffc107" + - name: SFP28 + label: SFP28 + description: Single-lane 25G cage. + color: "#00bcd4" + - name: SFP+ + label: SFP+ + description: Single-lane 10G cage. + color: "#9e9e9e" + optional: false + description: The cage this part fits. It decides which ports can hold it. + order_weight: 1300 + # A fixed-wavelength optic can only sit on the channel it was bought for. + - name: tunable + kind: Boolean + default_value: false + optional: false + description: Whether the laser can be tuned across the grid or is fixed at one wavelength. + order_weight: 1400 + relationships: + # Optional, so a part number can be recorded before the mode catalog is + # populated. Nothing compares this list against the mode a carrier actually + # runs, so a module can be fitted to a carrier it cannot support. + # Unenforced here. + - name: supported_modes + peer: OtnOpticalMode + label: Modes this part can run + kind: Attribute + cardinality: many + optional: true + identifier: otn_optical_mode__transceiver_types + order_weight: 900 + - name: manufacturer + peer: OrganizationManufacturer + kind: Attribute + cardinality: one + optional: true + identifier: otn_transceiver_type__manufacturer + order_weight: 1100 + + # Plant. + + - name: FiberType + namespace: Otn + description: Single-mode fiber family. Attenuation, dispersion and group index at 1550 nm. + label: Fiber type + icon: mdi:cable-data + include_in_menu: true + menu_placement: OtnFiberSpan + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 32 + regex: "^[A-Za-z0-9.-]+$" + optional: false + description: ITU-T designation, such as G.652.D. + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + # One coefficient per fibre family, measured at 1550 nm. That is right for the + # dense grid and understates the loss on a coarse wavelength. + - name: attenuation_coefficient_mdb_per_km + kind: Number + parameters: + min_value: 150 + max_value: 400 + optional: false + description: Attenuation at 1550 nm in millidecibels per kilometre. 0.20 dB/km is 200. Wrong for CWDM. + order_weight: 1500 + - name: attenuation_coefficient_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if attenuation_coefficient_mdb_per_km__value is not none %}{{ attenuation_coefficient_mdb_per_km__value + / 1000 }} dB/km{% endif %} + optional: true + description: Attenuation in dB/km. Read-only, derived from attenuation_coefficient_mdb_per_km. + order_weight: 1510 + - name: dispersion_fs_per_nm_km + kind: Number + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Chromatic dispersion at 1550 nm in femtoseconds per nm per km. 17 ps/nm/km is 17000. + order_weight: 1600 + - name: dispersion_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if dispersion_fs_per_nm_km__value is not none %}{{ dispersion_fs_per_nm_km__value + / 1000 }} ps/nm/km{% endif %} + optional: true + description: Dispersion in ps/nm/km. Read-only, derived from dispersion_fs_per_nm_km. + order_weight: 1610 + - name: group_index_milli + kind: Number + default_value: 1468 + parameters: + min_value: 1400 + max_value: 1500 + optional: false + description: Group index at 1550 nm in milli-units. 1.468 is 1468. Sets propagation delay. + order_weight: 1700 + relationships: + - name: spans + peer: OtnFiberSpan + kind: Attribute + cardinality: many + optional: true + identifier: otn_fiber_type__spans + order_weight: 900 + + - name: Conduit + namespace: Otn + description: Shared-risk link group. Two routes through one conduit are not diverse. + label: Conduit + icon: mdi:pipe + include_in_menu: true + menu_placement: OtnFiberSpan + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: owner + kind: Text + parameters: + max_length: 64 + optional: true + description: Who owns the trench. Often not the network operator. + order_weight: 1100 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1200 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: "#2196f3" + - name: active + label: Active + color: "#4caf50" + - name: standby + label: Standby + color: "#00bcd4" + - name: maintenance + label: Maintenance + color: "#ffc107" + - name: failed + label: Failed + color: "#ff5722" + - name: decommissioned + label: Decommissioned + color: "#9e9e9e" + optional: false + description: Lifecycle state of the duct itself, independent of the spans pulled through it. + order_weight: 1300 + relationships: + - name: spans + peer: OtnFiberSpan + kind: Attribute + cardinality: many + optional: true + identifier: otn_conduit__spans + order_weight: 900 + + - name: FiberSpan + namespace: Otn + description: One amplifier-to-amplifier fiber section. Lossy, but not racked and not a device. + label: Fiber span + icon: mdi:vector-line + include_in_menu: true + inherit_from: + - OtnOpticalElement + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + # The inherited insertion_loss_mdb stays at 0 on a span. A span's real loss is + # length x attenuation plus splices, connectors and aging margin. + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + # Not unique: a uniqueness constraint cannot reference an optional relationship, + # and oms stays optional so a span is creatable before its section exists. + - name: oms_sequence + kind: Number + parameters: + min_value: 1 + max_value: 50 + optional: true + description: Position of this span within its optical multiplex section, counting from the A end. + order_weight: 1200 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: "#2196f3" + - name: active + label: Active + color: "#4caf50" + - name: standby + label: Standby + color: "#00bcd4" + - name: maintenance + label: Maintenance + color: "#ffc107" + - name: failed + label: Failed + color: "#ff5722" + - name: decommissioned + label: Decommissioned + color: "#9e9e9e" + optional: false + description: Lifecycle state of the span. A planned span is designed but not yet spliced through. + order_weight: 1300 + # The extension's first DateTime. A commissioning or provisioning date is intended state, + # written once by a person; a measurement moves on its own and stays in the management system. + - name: commissioned_date + kind: DateTime + optional: true + description: When the span was accepted into service. A recorded fact, not a reading. + order_weight: 1400 + - name: length_m + kind: Number + parameters: + min_value: 0 + max_value: 500000 + optional: false + description: Route length in metres, not straight-line distance. 500 km is the practical ceiling. + order_weight: 1500 + - name: length_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if length_m__value is not none %}{{ length_m__value / 1000 }} km{% endif %} + optional: true + description: Route length in km. Read-only, derived from length_m. + order_weight: 1510 + - name: splice_count + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 500 + optional: false + description: Fusion splices along the span. Roughly one per drum of cable. + order_weight: 1600 + - name: splice_loss_mdb + kind: Number + default_value: 50 + parameters: + min_value: 0 + max_value: 1000 + optional: false + description: Loss per splice in millidecibels. 0.05 dB is 50. + order_weight: 1610 + - name: connector_count + kind: Number + default_value: 2 + parameters: + min_value: 0 + max_value: 20 + optional: false + description: Mated connector pairs on the span, normally one at each end. + order_weight: 1700 + - name: connector_loss_mdb + kind: Number + default_value: 300 + parameters: + min_value: 0 + max_value: 2000 + optional: false + description: Loss per mated connector pair in millidecibels. 0.3 dB is 300. + order_weight: 1710 + - name: aging_margin_mdb + kind: Number + default_value: 1500 + parameters: + min_value: 0 + max_value: 5000 + optional: false + description: Reserved margin for repairs and ageing, in millidecibels. 1.5 dB is 1500. + order_weight: 1720 + relationships: + - name: fiber_type + peer: OtnFiberType + kind: Attribute + cardinality: one + optional: false + identifier: otn_fiber_type__spans + order_weight: 800 + - name: site_a + peer: LocationSite + kind: Attribute + cardinality: one + optional: false + identifier: otn_span__site_a + order_weight: 810 + - name: site_b + peer: LocationSite + kind: Attribute + cardinality: one + optional: false + identifier: otn_span__site_b + order_weight: 820 + - name: conduit + peer: OtnConduit + kind: Attribute + cardinality: one + optional: true + identifier: otn_conduit__spans + order_weight: 830 + - name: oms + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: one + optional: true + identifier: otn_oms__spans + order_weight: 840 + # The inverse of OtnRamanPump.span, on the same identifier. A budget walks a + # section to its spans, so without this side no pump is visible on that walk. + - name: raman_pumps + peer: OtnRamanPump + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__raman_pumps + order_weight: 850 + # The ports at each end of the glass. Declared on the span alone: the inverse + # would put the field on every port kind and most ports terminate no span. + - name: terminating_ports + peer: OtnGenericPort + label: Ports at the ends of this span + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__terminating_ports + order_weight: 950 + + - name: OpticalMultiplexSection + namespace: Otn + description: Groups the ordered spans and inline amplifiers between two OMS endpoints. + label: Optical multiplex section + icon: mdi:ray-start-end + include_in_menu: true + menu_placement: OtnFiberSpan + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + # No cached total length, total loss, span_count or hop_count. + # Every reader sums them over the spans instead. + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: "#2196f3" + - name: active + label: Active + color: "#4caf50" + - name: standby + label: Standby + color: "#00bcd4" + - name: maintenance + label: Maintenance + color: "#ffc107" + - name: failed + label: Failed + color: "#ff5722" + - name: decommissioned + label: Decommissioned + color: "#9e9e9e" + optional: false + description: Lifecycle state of the section as a whole, not of the spans it groups. + order_weight: 1200 + relationships: + - name: endpoint_a + peer: OtnOmsEndpoint + kind: Attribute + cardinality: one + optional: false + identifier: otn_oms__endpoint_a + order_weight: 800 + - name: endpoint_b + peer: OtnOmsEndpoint + kind: Attribute + cardinality: one + optional: false + identifier: otn_oms__endpoint_b + order_weight: 810 + - name: spans + peer: OtnFiberSpan + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__spans + order_weight: 900 + # One relationship per direction of travel rather than one holding both chains, + # so which chain an amplifier is in is stored by the graph. Both stay optional. + - name: amplifiers_a2b + peer: OtnAmplifier + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__amplifiers_a2b + order_weight: 910 + - name: amplifiers_b2a + peer: OtnAmplifier + kind: Attribute + cardinality: many + optional: true + identifier: otn_oms__amplifiers_b2a + order_weight: 920 + + # Logical. + - name: FrequencyGrid + namespace: Otn + description: One ITU-T G.694.1 channel. 50 GHz fixed grid, 191.35 to 196.10 THz. + label: Frequency grid channel + icon: mdi:sine-wave + include_in_menu: true + menu_placement: OtnOpticalCarrier + human_friendly_id: + - center_frequency_mhz__value + order_by: + - center_frequency_mhz__value + display_label: "Ch{{ channel_number__value }}" + attributes: + # Derived, not stored. In G.694.1 the frequency is normative and the channel + # number is a naming convention over it, so storing both invites the two to + # disagree. Computed attributes are Text or URL only, which is why the + # frequency stays the stored Number and keeps its range filter. + - name: channel_number + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if center_frequency_mhz__value is not none -%} + {{ ((center_frequency_mhz__value - 191350000) // 50000) + 1 }} + {%- endif %} + optional: true + description: ITU channel number, 1 to 96. Channel 1 is 191.35 THz. Derived from the centre frequency. + order_weight: 1000 + # Stored rather than computed, so "which channel is 193.5 THz" is a range filter. + - name: center_frequency_mhz + kind: Number + unique: true + parameters: + min_value: 191350000 + max_value: 196100000 + optional: false + description: Centre frequency in MHz. Channel n is 191350000 + (n - 1) x 50000. + order_weight: 1500 + - name: center_frequency_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if center_frequency_mhz__value is not none %}{{ center_frequency_mhz__value / 1000000 }} THz{% endif %} + optional: true + description: Centre frequency in THz. Byte-identical to the optical-port rendering. + order_weight: 1510 + # Operators read the dense grid in nm as often as in THz. Derived from the + # frequency with c = 299792458 m/s, so the two can never disagree. + - name: center_wavelength_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if center_frequency_mhz__value is not none -%} + {{ (299792458000 / center_frequency_mhz__value) | round(2) }} nm + {%- endif %} + optional: true + description: Centre wavelength in nm, derived from the centre frequency. + order_weight: 1520 + # The inverse of OtnOpticalCarrier.channel, on the same identifier. + relationships: + - name: carriers + peer: OtnOpticalCarrier + label: Carriers on this channel + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__channel + order_weight: 900 + + # The coarse plan is a separate kind so that `OtnOpticalCarrier.channel`, which + # peers `OtnFrequencyGrid` alone, refuses a mispointed carrier at write time. + - name: CwdmChannel + namespace: Otn + description: One ITU-T G.694.2 coarse wavelength. 20 nm spacing, 1271 to 1611 nm. + label: CWDM wavelength + icon: mdi:palette-swatch-variant + include_in_menu: true + menu_placement: OtnOpticalCarrier + human_friendly_id: + - center_wavelength_nm__value + order_by: + - center_wavelength_nm__value + display_label: "{{ center_wavelength_nm__value }} nm" + attributes: + - name: center_wavelength_nm + kind: Number + unique: true + parameters: + min_value: 1271 + max_value: 1611 + optional: false + description: Nominal central wavelength in nm. Wavelength n is 1271 + (n - 1) x 20. + order_weight: 1000 + # Derived, not stored. The ITU bands are wavelength ranges, so the band a + # coarse wavelength sits in follows from the wavelength itself. + - name: band + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if center_wavelength_nm__value is not none -%} + {% if center_wavelength_nm__value < 1360 -%}O + {%- elif center_wavelength_nm__value < 1460 -%}E + {%- elif center_wavelength_nm__value < 1530 -%}S + {%- elif center_wavelength_nm__value < 1565 -%}C + {%- else -%}L + {%- endif %} + {%- endif %} + optional: true + description: ITU band, derived from the wavelength. Only the two C-band wavelengths sit in the erbium window. + order_weight: 1100 + + - name: OpticalMode + namespace: Otn + description: What a transponder or coherent pluggable can do. Reach and required OSNR are data, not assumptions. + label: Optical mode + icon: mdi:waveform + include_in_menu: true + menu_placement: OtnOpticalCarrier + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9 .+/_-]+$" + optional: false + order_weight: 1000 + - name: mode_class + kind: Dropdown + default_value: transponder + choices: + - name: transponder + label: Transponder + color: "#2196f3" + - name: pluggable + label: Coherent pluggable + color: "#4caf50" + optional: false + description: Two values, and the pluggable-reach report filters on it. + order_weight: 1100 + - name: modulation + kind: Dropdown + choices: + - name: DP-QPSK + label: DP-QPSK + description: Dual-polarisation QPSK. Four bits per symbol, the longest reach of the four. + color: "#2196f3" + - name: DP-8QAM + label: DP-8QAM + description: Dual-polarisation 8QAM. Six bits per symbol. + color: "#4caf50" + - name: DP-16QAM + label: DP-16QAM + description: Dual-polarisation 16QAM. Eight bits per symbol. + color: "#ff9800" + - name: DP-64QAM + label: DP-64QAM + description: Dual-polarisation 64QAM. Twelve bits per symbol, the shortest reach. + color: "#e91e63" + optional: false + order_weight: 1200 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1300 + - name: line_rate_gbps + kind: Number + parameters: + min_value: 1 + max_value: 1600 + optional: false + description: Client-side capacity in Gbps. Already a whole number in its natural unit. + order_weight: 1500 + - name: baud_mbaud + kind: Number + parameters: + min_value: 1000 + max_value: 200000 + optional: false + description: Symbol rate in megabaud. 59.84 GBd is 59840. Sets the spectral width. + order_weight: 1600 + - name: required_osnr_mdb + kind: Number + parameters: + min_value: 5000 + max_value: 40000 + optional: false + description: OSNR needed at the receiver, in millidecibels. 26 dB is 26000. + order_weight: 1700 + - name: required_osnr_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if required_osnr_mdb__value is not none %}{{ required_osnr_mdb__value / 1000 }} dB{% endif %} + optional: true + description: Required OSNR in dB. Read-only, derived from required_osnr_mdb. + order_weight: 1710 + - name: cd_tolerance_fs_per_nm + kind: Number + parameters: + min_value: 0 + max_value: 200000000 + optional: false + description: Chromatic dispersion the receiver compensates, in fs/nm. 100000 ps/nm is 100000000. + order_weight: 1800 + - name: nominal_reach_m + kind: Number + parameters: + min_value: 0 + max_value: 5000000 + optional: false + description: Vendor-quoted reach in metres. A starting point for the budget, not a guarantee. + order_weight: 1900 + - name: nominal_reach_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if nominal_reach_m__value is not none %}{{ nominal_reach_m__value / 1000 }} km{% endif %} + optional: true + description: Nominal reach in km. Read-only, derived from nominal_reach_m. + order_weight: 1910 + - name: fec_type + kind: Dropdown + default_value: SD-FEC + choices: + - name: none + label: None + description: No forward error correction. + color: "#9e9e9e" + - name: GFEC + label: GFEC + description: The G.709 Reed-Solomon code. Hard decision, about 7 percent overhead. + color: "#2196f3" + - name: SD-FEC + label: SD-FEC + description: Soft-decision FEC. More coding gain than a hard-decision code, at more latency. + color: "#4caf50" + - name: cFEC + label: cFEC + description: Concatenated FEC from OIF 400ZR. Less coding gain and less power than oFEC. + color: "#00bcd4" + - name: oFEC + label: oFEC + description: Open FEC from OpenROADM and OpenZR+. More coding gain, for longer reach. + color: "#9c27b0" + optional: false + order_weight: 1950 + - name: fec_latency_ns + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 100000 + optional: false + description: Encoder and decoder latency in nanoseconds. Small next to propagation, but not zero. + order_weight: 1960 + # The inverse of OtnOpticalCarrier.optical_mode, on the same identifier. + relationships: + - name: carriers + peer: OtnOpticalCarrier + label: Carriers using this mode + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__optical_mode + order_weight: 900 + + - name: ClientSignal + namespace: Otn + description: What a customer hands over, and the container it maps into. + label: Client signal + icon: mdi:import + include_in_menu: true + menu_placement: OtnService + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 32 + regex: "^[A-Za-z0-9./_-]+$" + optional: false + order_weight: 1000 + - name: alias + kind: Text + parameters: + max_length: 32 + optional: true + description: The SONET name where one exists. STM-16 is OC-48. + order_weight: 1100 + - name: layer + kind: Dropdown + choices: + - name: ethernet + label: Ethernet + color: "#2196f3" + - name: sdh + label: SDH / SONET + color: "#9c27b0" + - name: pdh + label: PDH + color: "#795548" + - name: fibre_channel + label: Fibre Channel + color: "#ff9800" + - name: infiniband + label: InfiniBand + color: "#673ab7" + optional: false + description: Grouping the catalog by layer is the first thing a reader does. + order_weight: 1200 + - name: auto_selectable + kind: Boolean + # Fails closed: a row added without a decision is unreachable by the + # automatic path until somebody writes true. + default_value: false + optional: false + description: May the rate rule pick this signal when a service states none. + order_weight: 1250 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1300 + - name: bit_rate_kbps + kind: Number + parameters: + min_value: 64 + max_value: 1600000000 + optional: false + description: Nominal line rate in kbps. E1 is 2048, 100GBASE-LR4 is 103100000. + order_weight: 1500 + - name: bit_rate_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if bit_rate_kbps__value is none %}{% elif bit_rate_kbps__value + >= 1000000 %}{{ bit_rate_kbps__value / 1000000 }} Gbps{% else %}{{ + bit_rate_kbps__value / 1000 }} Mbps{% endif %} + optional: true + description: Bit rate in Mbps below one gigabit, Gbps at or above it. + order_weight: 1510 + - name: default_container_type + kind: Dropdown + choices: + - name: ODU0 + label: ODU0 + description: About 1.25 Gbps. Sized for a gigabit Ethernet client. + color: "#2196f3" + - name: ODU1 + label: ODU1 + description: About 2.5 Gbps, the original G.709 tributary rate. + color: "#2196f3" + - name: ODU2 + label: ODU2 + description: About 10 Gbps. Takes 10G Ethernet at its WAN rate. + color: "#2196f3" + - name: ODU2e + label: ODU2e + description: About 10.4 Gbps, sized for the 10GBASE-R LAN rate. + color: "#2196f3" + - name: ODU3 + label: ODU3 + description: About 40 Gbps. + color: "#2196f3" + - name: ODU4 + label: ODU4 + description: About 100 Gbps. Takes 100G Ethernet. + color: "#2196f3" + - name: ODUC1 + label: ODUC1 + description: ODUCn at n=1. About 100 Gbps. + color: "#673ab7" + - name: ODUC2 + label: ODUC2 + description: ODUCn at n=2. About 200 Gbps. + color: "#673ab7" + - name: ODUC3 + label: ODUC3 + description: ODUCn at n=3. About 300 Gbps. + color: "#673ab7" + - name: ODUC4 + label: ODUC4 + description: ODUCn at n=4. About 400 Gbps. + color: "#673ab7" + - name: ODUflex + label: ODUflex + description: Sized to the client rather than to a fixed rate. + color: "#00bcd4" + - name: VC-12 + label: VC-12 + description: SDH virtual container carrying a 2 Mbps E1. + color: "#ff9800" + - name: VC-4 + label: VC-4 + description: SDH virtual container carrying the 140 Mbps STM-1 payload. + color: "#ff9800" + - name: STM-N + label: STM-N + description: A whole SDH aggregate carried transparently. + color: "#ff9800" + optional: false + description: The first step of the mapping chain, not the last. E1 maps into VC-12, not ODU1. + order_weight: 1600 + - name: default_mapping + kind: Dropdown + choices: + - name: GMP + label: GMP + description: Generic mapping procedure. Rate agnostic, and what a modern client uses. + color: "#2196f3" + - name: BMP + label: BMP + description: Bit-synchronous mapping procedure. Client and container clocks are locked. + color: "#4caf50" + - name: AMP + label: AMP + description: Asynchronous mapping procedure. Justification bytes absorb the clock offset. + color: "#ff9800" + optional: false + description: ITU-T G.709 mapping procedure. Generic, bit-synchronous or asynchronous. + order_weight: 1700 + relationships: + - name: containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_client_signal__containers + order_weight: 900 + # The inverse of OtnService.client_signal, on the same identifier. + - name: services + peer: OtnService + kind: Attribute + cardinality: many + optional: true + identifier: otn_service__client_signal + order_weight: 910 + + - name: Container + namespace: Otn + description: ODU or SDH virtual container. The digital adaptation layer between a client and a wavelength. + label: Container + icon: mdi:package-variant-closed + include_in_menu: true + menu_placement: OtnService + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + # OtnClientSignal.default_container_type's fourteen values plus ODUC6 and + # ODUC8, which are line containers no client maps directly into. + - name: odu_type + kind: Dropdown + choices: + - name: ODU0 + label: ODU0 + description: About 1.25 Gbps. Sized for a gigabit Ethernet client. + color: "#2196f3" + - name: ODU1 + label: ODU1 + description: About 2.5 Gbps, the original G.709 tributary rate. + color: "#2196f3" + - name: ODU2 + label: ODU2 + description: About 10 Gbps. Takes 10G Ethernet at its WAN rate. + color: "#2196f3" + - name: ODU2e + label: ODU2e + description: About 10.4 Gbps, sized for the 10GBASE-R LAN rate. + color: "#2196f3" + - name: ODU3 + label: ODU3 + description: About 40 Gbps. + color: "#2196f3" + - name: ODU4 + label: ODU4 + description: About 100 Gbps. Takes 100G Ethernet. + color: "#2196f3" + - name: ODUC1 + label: ODUC1 + description: ODUCn at n=1. About 100 Gbps. + color: "#673ab7" + - name: ODUC2 + label: ODUC2 + description: ODUCn at n=2. About 200 Gbps. + color: "#673ab7" + - name: ODUC3 + label: ODUC3 + description: ODUCn at n=3. About 300 Gbps. + color: "#673ab7" + - name: ODUC4 + label: ODUC4 + description: ODUCn at n=4. About 400 Gbps. + color: "#673ab7" + - name: ODUC6 + label: ODUC6 + description: ODUCn at n=6. About 600 Gbps. + color: "#673ab7" + - name: ODUC8 + label: ODUC8 + description: ODUCn at n=8. About 800 Gbps. + color: "#673ab7" + - name: ODUflex + label: ODUflex + description: Sized to the client rather than to a fixed rate. + color: "#00bcd4" + - name: VC-12 + label: VC-12 + description: SDH virtual container carrying a 2 Mbps E1. + color: "#ff9800" + - name: VC-4 + label: VC-4 + description: SDH virtual container carrying the 140 Mbps STM-1 payload. + color: "#ff9800" + - name: STM-N + label: STM-N + description: A whole SDH aggregate carried transparently. + color: "#ff9800" + optional: false + order_weight: 1100 + - name: mapping_mode + kind: Dropdown + default_value: GMP + choices: + - name: GMP + label: GMP + description: Generic mapping procedure. Rate agnostic, and what a modern client uses. + color: "#2196f3" + - name: BMP + label: BMP + description: Bit-synchronous mapping procedure. Client and container clocks are locked. + color: "#4caf50" + - name: AMP + label: AMP + description: Asynchronous mapping procedure. Justification bytes absorb the clock offset. + color: "#ff9800" + optional: false + order_weight: 1200 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1300 + # A circuit is its containers ordered by this, as its wavelengths are its + # paths ordered by OtnOpticalPath.segment_sequence. + - name: segment_sequence + kind: Number + default_value: 1 + parameters: + min_value: 1 + max_value: 50 + optional: false + description: Which segment of its circuit this container rides. 1 for a circuit that spans one wavelength. + order_weight: 1400 + - name: tributary_slots + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 640 + optional: false + description: Slots this container occupies in its parent. An ODU2 in an ODU4 takes 8. + order_weight: 1500 + - name: tributary_slot_capacity + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 640 + optional: false + description: Slots this container offers to its children. An ODU4 offers 80. + order_weight: 1600 + # The two `direction` keys are mandatory. Both sides default to bidirectional, + # which collides on a shared identifier and is rejected at load time. + relationships: + # Optional, because a container may be multiplexed into a parent that holds the + # carrier. + - name: carrier + peer: OtnOpticalCarrier + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__containers + order_weight: 790 + - name: client_signal + peer: OtnClientSignal + kind: Attribute + cardinality: one + optional: true + identifier: otn_client_signal__containers + order_weight: 800 + - name: parent_container + peer: OtnContainer + kind: Attribute + cardinality: one + optional: true + identifier: otn_container__children + direction: outbound + order_weight: 810 + # Only a client container carries one. A line container leaves it empty on + # purpose: it belongs to a wavelength that several services may share. + - name: service + # Stored, not derived. OtnOpticalCarrier.optical_path is cardinality many + # since grooming, so walking back through the carrier yields every service on + # the wavelength rather than the one that owns this container. + peer: OtnService + kind: Attribute + cardinality: one + optional: true + identifier: otn_service__containers + order_weight: 820 + - name: child_containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_container__children + direction: inbound + order_weight: 900 + + # Devices. + - name: Router + namespace: Otn + description: IP router. Light terminates here, so its insertion loss stays at the zero default. + label: Router + icon: mdi:router + include_in_menu: true + menu_placement: OtnGenericDevice + # An optical element, so an IPoDWDM path can hop through the routers on its own + # ends. It also picks up the vendor and model fields every other device kind has. + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + + - name: Transponder + namespace: Otn + description: Client to DWDM line adaptation. + label: Transponder + icon: mdi:transit-connection-variant + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + + - name: Roadm + namespace: Otn + description: Reconfigurable optical add/drop multiplexer. + label: ROADM + icon: mdi:call-split + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOmsEndpoint + - OtnOpticalElement + attributes: + - name: channel_capacity + kind: Number + parameters: + min_value: 1 + max_value: 96 + optional: true + description: Nameplate channels this ROADM is rated for, such as 40, 80 or 96. Not a count in use. + order_weight: 1300 + - name: colorless + kind: Boolean + optional: true + description: Any add/drop port can take any wavelength, so assignment is not fixed per port. + order_weight: 1320 + - name: directionless + kind: Boolean + optional: true + description: An added wavelength can leave by any degree, so assignment does not pick a degree. + order_weight: 1330 + - name: contentionless + kind: Boolean + optional: true + description: The same wavelength can be added twice toward different degrees without blocking. + order_weight: 1340 + - name: technology + kind: Dropdown + choices: + - name: wss_lcos + label: WSS (LCoS) + color: "#673ab7" + - name: wss_mems + label: WSS (MEMS) + color: "#3f51b5" + - name: broadcast_select + label: Broadcast and select + color: "#607d8b" + optional: true + description: How the switch is built. Nameplate data, often unknown. + order_weight: 1350 + + - name: Amplifier + namespace: Otn + description: Inline, booster or pre-amplifier. + label: Amplifier + icon: mdi:amplifier + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + # oms_sequence is stored because Infrahub relationships carry no order, so a + # section hands back a set and a budget cannot be walked over one. + attributes: + - name: amplifier_type + kind: Dropdown + choices: + - name: edfa + label: EDFA + description: Erbium-doped fibre amplifier. The usual choice on a C band line system. + color: "#2196f3" + - name: soa + label: SOA + description: Semiconductor optical amplifier. Compact, noisier, found in access gear. + color: "#ff9800" + - name: hybrid + label: Hybrid + description: An erbium stage combined with distributed Raman gain in one box. + color: "#673ab7" + optional: true + description: Nameplate amplifier technology. A Raman-only pump is its own kind, OtnRamanPump. + order_weight: 1300 + # OtnGenericPort.role carries booster and preamp for ports. This is the device's own role in the chain. + - name: stage + kind: Dropdown + choices: + - name: booster + label: Booster + description: First stage after the transmitter, lifting power into the span. + color: "#ff9800" + - name: inline + label: Inline + description: A mid-route stage that recovers span loss and passes the light on. + color: "#4caf50" + - name: preamp + label: Pre-amplifier + description: Last stage before the receiver, raising power to its sensitivity. + color: "#ffc107" + optional: true + description: Nameplate stage this amplifier is built for, not a position derived from the plant. + order_weight: 1400 + # 3000 is the quantum-limited floor for an EDFA and 10000 is a bad one. + - name: noise_figure_mdb + kind: Number + default_value: 4000 + parameters: + min_value: 3000 + max_value: 10000 + optional: false + description: Noise figure in millidecibels. 4.0 dB is 4000. Sets the ASE this stage adds. + order_weight: 1520 + - name: noise_figure_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if noise_figure_mdb__value is not none %}{{ noise_figure_mdb__value / 1000 }} dB{% endif %} + optional: true + description: Noise figure in dB. Read-only, derived from noise_figure_mdb. + order_weight: 1530 + - name: gain_mdb + kind: Number + default_value: 22000 + parameters: + min_value: 0 + max_value: 40000 + optional: false + description: Gain in millidecibels. 22.0 dB is 22000. Must cover the loss ahead of the input. + order_weight: 1540 + - name: gain_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if gain_mdb__value is not none %}{{ gain_mdb__value / 1000 }} dB{% endif %} + optional: true + description: Gain in dB. Read-only, derived from gain_mdb. + order_weight: 1550 + # No direction attribute: which chain an amplifier is in is the relationship + # holding it, oms_a2b or oms_b2a. This orders that chain and fixes which member + # is which: position 1 is the booster and position N+1 the pre-amplifier. + - name: oms_sequence + kind: Number + parameters: + min_value: 1 + # 51, not 50: a section with N spans carries N+1 amplifiers per + # direction, and the span attribute caps N at 50. + max_value: 51 + # No default_value on purpose: a default of 1 would let a new amplifier take + # a silent position at the head of its chain and sort into a wrong answer. + # Optional for the same reason oms_sequence is optional on OtnFiberSpan: both + # oms_a2b and oms_b2a are optional, so an amplifier that sits in no chain yet + # should not have to claim a position in one. + optional: true + description: Position in this amplifier's own chain, counting along the direction it amplifies. + order_weight: 1560 + - name: max_total_output_power_mdbm + kind: Number + parameters: + min_value: 0 + max_value: 30000 + optional: true + description: Rated total output power in milli-dBm, 0 to +30 dBm. A nameplate ceiling, not a reading. + order_weight: 1570 + - name: max_total_output_power_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if max_total_output_power_mdbm__value is not none %}{{ + max_total_output_power_mdbm__value / 1000 }} dBm{% endif %} + optional: true + description: Rated total output power in dBm. Read-only, derived from max_total_output_power_mdbm. + order_weight: 1580 + # The two inverses of the section's two amplifier relationships, each on the + # matching identifier. Exactly one is set, and which one answers the direction. + relationships: + - name: oms_a2b + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: one + # Both optional, because an amplifier is creatable before its section exists. + optional: true + identifier: otn_oms__amplifiers_a2b + order_weight: 950 + - name: oms_b2a + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: one + optional: true + identifier: otn_oms__amplifiers_b2a + order_weight: 960 + + - name: MuxDemux + namespace: Otn + description: Passive multiplexer. A dense AWG on the core, a coarse thin-film filter on a tail. + label: Mux/demux + icon: mdi:call-merge + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOmsEndpoint + - OtnOpticalElement + attributes: + - name: channel_capacity + kind: Number + parameters: + min_value: 1 + max_value: 96 + optional: true + description: Nameplate channels this multiplexer is rated for, such as 8, 16, 40 or 96. Not a count in use. + order_weight: 1300 + # Which grid this multiplexer is built for. A carrier reaches a channel through + # OtnMuxClientPort, whose `dwdm_channel` and `cwdm_channel` are both optional; + # this states which of the two a given device is supposed to use. Unenforced + # here, since a schema cannot compare a relationship against an attribute. + - name: plan + kind: Dropdown + default_value: dwdm + choices: + - name: dwdm + label: DWDM + description: ITU-T G.694.1 dense grid. + color: "#2196f3" + - name: cwdm + label: CWDM + description: ITU-T G.694.2 coarse plan. + color: "#ff9800" + optional: false + description: Which wavelength plan this multiplexer multiplexes. + order_weight: 1310 + # Gives a fixed OADM a home. A ROADM is its own kind, because it is switched + # rather than filtered; everything passive lives here and differs by role. + - name: mux_role + kind: Dropdown + default_value: mux_demux + choices: + - name: mux + label: Multiplexer + description: Combines channels onto one common port. + color: "#4caf50" + - name: demux + label: Demultiplexer + description: Splits one common port into channels. + color: "#00bcd4" + - name: mux_demux + label: Mux/demux + description: Both directions in one device. + color: "#2196f3" + - name: oadm + label: Fixed OADM + description: Drops and adds a fixed subset, passing the rest through. + color: "#9c27b0" + optional: false + description: What this passive device does with the channels it carries. + order_weight: 1320 + - name: technology + kind: Dropdown + choices: + - name: thin_film_filter + label: Thin-film filter + color: "#795548" + - name: awg + label: AWG + color: "#607d8b" + - name: interleaver + label: Interleaver + color: "#009688" + optional: true + description: How the device separates wavelengths. Nameplate data, often unknown. + order_weight: 1330 + relationships: + # The wavelengths a coarse multiplexer lights are a property of the device + # rather than of the plan. + - name: cwdm_channels + peer: OtnCwdmChannel + kind: Attribute + cardinality: many + optional: true + identifier: otn_mux_demux__cwdm_channels + order_weight: 1900 + + # The optical side of a frame, so a panel can be a lossy hop on a path. The + # terminations belong on the physical side: extensions/patch_panel models the + # front and rear interfaces and the mapping between them, and `dcim_device` joins + # the two records. This kind ships no port kind of its own for that reason, so + # leave `ports` empty rather than filling it with ports labelled for other roles. + - name: PatchPanel + namespace: Otn + description: Optical distribution frame. Carries connector loss. + label: Patch panel + icon: mdi:view-grid-outline + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + + - name: RamanPump + namespace: Otn + description: Pump laser injecting Raman gain into one fiber span. + label: Raman pump + icon: mdi:laser-pointer + include_in_menu: true + menu_placement: OtnGenericDevice + # Two generics side by side: a kind that is both a racked device and something + # light passes through has to say so twice. No attribute stores which direction + # the pump amplifies; injection_end and propagation are what compute it. + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + # On-off gain is received signal power with the pump on against the pump off. + # It reduces the effective loss of its span rather than adding a stage. + - name: on_off_gain_mdb + kind: Number + default_value: 10000 + parameters: + min_value: 0 + max_value: 15000 + optional: false + description: Raman on-off gain in millidecibels. 10.0 dB is 10000. + order_weight: 1520 + - name: on_off_gain_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if on_off_gain_mdb__value is not none %}{{ on_off_gain_mdb__value / 1000 }} dB{% endif %} + optional: true + description: On-off gain in dB. Read-only, derived from on_off_gain_mdb. + order_weight: 1530 + - name: injection_end + kind: Dropdown + default_value: site_b + choices: + - name: site_a + label: Site A end + color: "#2196f3" + - name: site_b + label: Site B end + color: "#ff5722" + optional: false + description: Which end of its span the pump is injected at, named against the span's own site_a and site_b. + order_weight: 1540 + # Counter-propagating is the default: the pump fires against the signal, so pump + # noise is averaged over the span instead of landing on it at its weakest point. + # The direction a pump amplifies is (injection_end == site_a) == (propagation == co). + - name: propagation + kind: Dropdown + default_value: counter + choices: + - name: counter + label: Counter-propagating + color: "#3f51b5" + - name: co + label: Co-propagating + color: "#009688" + optional: false + description: Whether the pump fires against the signal or with it. + order_weight: 1550 + # Mandatory: a detached pump is gain no budget can find. + relationships: + - name: span + peer: OtnFiberSpan + kind: Attribute + cardinality: one + optional: false + identifier: otn_span__raman_pumps + order_weight: 850 + + - name: OduSwitch + namespace: Otn + description: O-E-O device. Terminates one wavelength, originates the next, as a regenerator or ODU cross-connect. + label: ODU switch + icon: mdi:swap-horizontal-variant + include_in_menu: true + menu_placement: OtnGenericDevice + # OtnOpticalElement is here because OtnPathHop.element peers that generic. The + # inherited insertion_loss_mdb applies to the incoming segment only: this device + # terminates the light, so the outgoing segment starts at a transmitter. + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + # `regenerator` is the default: it carries the whole payload across without + # looking inside it. `cross_connect` demultiplexes to containers and regroups + # them. + - name: switching_mode + kind: Dropdown + default_value: regenerator + choices: + - name: regenerator + label: Regenerator + color: "#3f51b5" + - name: cross_connect + label: ODU cross-connect + color: "#009688" + optional: false + description: Whether the device carries the whole payload through or demultiplexes and regroups containers. + order_weight: 1300 + # Nanoseconds, the unit fec_latency_ns already uses. No paired + # _display: the whole plausible range is hundreds of nanoseconds. + - name: framing_latency_ns + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 100000 + optional: false + description: Delay this device adds in nanoseconds, from framing and from the electrical crossing. + order_weight: 1520 + relationships: + # Attachment, not termination: a cross-connect is patched to wavelengths that + # terminate on transponders elsewhere. OtnLinePort.carrier is the termination + # answer. + - name: carriers + peer: OtnOpticalCarrier + label: Carriers patched to this shelf + kind: Attribute + cardinality: many + optional: true + identifier: otn_odu_switch__carriers + order_weight: 1900 + + # Two attenuator kinds rather than one carrying a type Dropdown and an optional + # range: a pad with a maximum is a field that should not exist. Neither declares + # ports; both inherit `ports` from OtnGenericDevice and hold none. + # A passive coupler, used to feed a working and a protect leg from one carrier in + # optical line protection, and to tap a small fraction off for monitoring. The + # split loss itself belongs in insertion_loss_mdb from OtnOpticalElement, since a + # ratio alone does not give it: an even two-way split costs about 3.5 dB. + - name: Splitter + namespace: Otn + description: Passive splitter or coupler. Divides one carrier across several legs. + label: Splitter + icon: mdi:call-split + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: split_type + kind: Dropdown + default_value: even + choices: + - name: even + label: Even + description: Every output leg receives the same share. + color: "#2196f3" + - name: tap + label: Tap + description: One leg takes a small share for monitoring, the rest passes on. + color: "#ff9800" + optional: false + description: How the input is divided across the output legs. + order_weight: 1900 + - name: output_count + kind: Number + default_value: 2 + parameters: + min_value: 2 + max_value: 64 + optional: false + description: Number of output legs, such as 2 for a 1:2 or 8 for a 1:8. + order_weight: 1910 + - name: tap_ratio_percent + kind: Number + parameters: + min_value: 1 + max_value: 50 + optional: true + description: Share taken by the tap leg, as a percentage. 10 is a 90/10 tap. Null on an even split. + order_weight: 1920 + + - name: FixedAttenuator + namespace: Otn + description: A pad. One fixed amount of loss, patched into a link that arrives too hot. + label: Fixed attenuator + icon: mdi:filter-outline + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: attenuation_mdb + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Attenuation the pad is set to, in millidecibels. 5.0 dB is 5000. + order_weight: 1900 + - name: attenuation_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if attenuation_mdb__value is not none %}{{ attenuation_mdb__value / 1000 }} dB{% endif %} + optional: true + description: Attenuation in dB. Read-only, derived from attenuation_mdb. + order_weight: 1910 + + - name: VariableAttenuator + namespace: Otn + description: A VOA. The same loss, dialled rather than fixed, within the range the hardware has. + label: Variable attenuator + icon: mdi:tune-variant + include_in_menu: true + menu_placement: OtnGenericDevice + inherit_from: + - OtnGenericDevice + - OtnOpticalElement + attributes: + - name: attenuation_mdb + kind: Number + default_value: 0 + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Attenuation the pad is set to, in millidecibels. 5.0 dB is 5000. + order_weight: 1900 + - name: attenuation_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if attenuation_mdb__value is not none %}{{ attenuation_mdb__value / 1000 }} dB{% endif %} + optional: true + description: Attenuation in dB. Read-only, derived from attenuation_mdb. + order_weight: 1910 + # The absolute ceiling is on the attribute, so the schema refuses a physically + # impossible figure at write time. It cannot refuse a setting past this maximum, + # because the setting is a sibling attribute's value. Unenforced here. + - name: max_attenuation_mdb + kind: Number + parameters: + min_value: 0 + max_value: 30000 + optional: false + description: Largest attenuation this device can be dialled to, in millidecibels. + order_weight: 1920 + - name: max_attenuation_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if max_attenuation_mdb__value is not none %}{{ max_attenuation_mdb__value / 1000 }} dB{% endif %} + optional: true + description: Maximum attenuation in dB. Read-only, derived from max_attenuation_mdb. + order_weight: 1930 + + # Carrier. + - name: OpticalCarrier + namespace: Otn + description: One provisioned wavelength. Occupies its channel on every section it crosses. + label: Optical carrier + icon: mdi:waves + include_in_menu: true + menu_placement: OtnService + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + # A carrier written on a branch stays `planned` until the change merges. + - name: status + kind: Dropdown + default_value: active + choices: + - name: planned + label: Planned + color: "#2196f3" + - name: reserved + label: Reserved + color: "#ff9800" + - name: active + label: Active + color: "#4caf50" + - name: decommissioned + label: Decommissioned + color: "#9e9e9e" + optional: false + order_weight: 1200 + - name: provisioned_date + kind: DateTime + optional: true + description: When the wavelength was turned up. A recorded fact, not a reading. + order_weight: 1300 + relationships: + - name: channel + peer: OtnFrequencyGrid + kind: Attribute + cardinality: one + optional: false + identifier: otn_carrier__channel + order_weight: 800 + - name: optical_mode + peer: OtnOpticalMode + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__optical_mode + order_weight: 810 + # Many, not one, because two services grooming into one line container both + # ride this carrier. Each service still has exactly one path of its own. The + # name stays singular although the cardinality is many; see the identifier below. + - name: optical_path + peer: OtnOpticalPath + kind: Attribute + cardinality: many + optional: true + # Not renamed to `optical_paths`: Infrahub reads the old and the new as two + # relationships on one identifier and refuses the load. + identifier: otn_carrier__optical_path + order_weight: 820 + # Unordered: occupancy is set membership. Ordering along a route is on the hops. + - name: sections + peer: OtnOpticalMultiplexSection + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__sections + order_weight: 900 + # What the wavelength carries, so "what dies with this carrier" is a read of it. + - name: containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__containers + order_weight: 910 + # The inverse of OtnOduSwitch.carriers, both sides writing the identifier by + # hand. Attachment, not termination: `line_ports` is the termination answer. + - name: odu_switches + peer: OtnOduSwitch + label: ODU switches this carrier is patched to + kind: Attribute + cardinality: many + optional: true + identifier: otn_odu_switch__carriers + order_weight: 920 + # The inverse of OtnLinePort.carrier, both sides writing the identifier by + # hand. Many, because a wavelength is terminated at each of its two ends. + # no-action: deleting a wavelength must not delete the ports that terminated it. + - name: line_ports + peer: OtnLinePort + label: Line ports terminating this wavelength + kind: Attribute + cardinality: many + optional: true + identifier: otn_carrier__line_ports + order_weight: 930 + + # Service. + - name: Service + namespace: Otn + description: Customer intent. Two endpoints, a rate, a profile and an optional latency budget. + label: Service + icon: mdi:file-document-outline + include_in_menu: true + inherit_from: + - CoreArtifactTarget + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + - name: external_circuit_id + kind: Text + parameters: + max_length: 64 + optional: true + description: The customer's or partner's own reference for this circuit, where `name` is ours. + order_weight: 1200 + # Customer intent, not a modulation format. The mode chosen to meet it lands on + # the carrier. + - name: rate_gbps + kind: Number + parameters: + min_value: 1 + max_value: 1600 + optional: false + description: Requested client capacity in Gbps. Already whole in its natural unit. + order_weight: 1300 + - name: sla + kind: Dropdown + default_value: silver + choices: + - name: gold + label: Gold + color: "#ffc107" + - name: silver + label: Silver + color: "#9e9e9e" + - name: bronze + label: Bronze + color: "#795548" + - name: best_effort + label: Best effort + color: "#607d8b" + optional: false + order_weight: 1400 + # `rejected` is what a refusal writes; without it a refusal looks like nothing + # ran at all. + - name: status + kind: Dropdown + default_value: planned + choices: + - name: planned + label: Planned + color: "#2196f3" + - name: provisioning + label: Provisioning + color: "#ff9800" + - name: active + label: Active + color: "#4caf50" + - name: maintenance + label: Maintenance + color: "#ffc107" + - name: failed + label: Failed + color: "#ff5722" + - name: rejected + label: Rejected + color: "#f44336" + - name: decommissioned + label: Decommissioned + color: "#9e9e9e" + optional: false + order_weight: 1500 + - name: provisioned_date + kind: DateTime + optional: true + description: When the circuit was handed to the customer. A recorded fact, not a reading. + order_weight: 1520 + # What is sold, not who buys it. A customer-intent taxonomy belongs in the + # deployment that has those customers; `sla` and `max_latency_ns` carry the + # commitments, and `client_signal` and `containers` carry the client layer. + - name: service_type + kind: Dropdown + default_value: wavelength + choices: + - name: wavelength + label: Wavelength + description: A whole optical carrier handed over to the customer. + color: "#2196f3" + - name: transport + label: Transport + description: A sub-carrier circuit, groomed into ODU containers. + color: "#673ab7" + - name: ip_transit + label: IP transit + description: IP handoff, with the transport kept internal. + color: "#4caf50" + optional: false + description: Which kind of service this is. + order_weight: 1600 + - name: max_latency_ns + kind: Number + parameters: + min_value: 0 + max_value: 1000000000 + optional: true + description: One-way latency budget in nanoseconds. Null when the service commits to none. + order_weight: 1700 + - name: max_latency_display + kind: Text + read_only: true + computed_attribute: + kind: Jinja2 + jinja2_template: >- + {% if max_latency_ns__value is not none %}{{ max_latency_ns__value / 1000 }} us{% endif %} + optional: true + description: Latency budget in microseconds. Read-only, derived from max_latency_ns. + order_weight: 1710 + relationships: + # Peered at the generic, not at OtnRouter, so a service can terminate on a + # transponder. One-sided: "which services land here" is a filter on this side. + - name: endpoint_a + peer: OtnGenericDevice + kind: Attribute + cardinality: one + optional: false + identifier: otn_service__endpoint_a + order_weight: 800 + - name: endpoint_z + peer: OtnGenericDevice + kind: Attribute + cardinality: one + optional: false + identifier: otn_service__endpoint_z + order_weight: 810 + # Many, not one, because a circuit regenerated at an intermediate site is one + # path per wavelength, each with its own budget. Order by segment_sequence. + # Component, with cascade: the path is owned by its service, so removing the + # service does not leave a mandatory link dangling. + - name: optical_path + peer: OtnOpticalPath + kind: Component + cardinality: many + optional: true + identifier: otn_service__optical_path + on_delete: cascade + order_weight: 900 + # Optional: a service naming no client signal is still provisionable from its + # rate alone. + - name: client_signal + peer: OtnClientSignal + kind: Attribute + cardinality: one + optional: true + identifier: otn_service__client_signal + order_weight: 910 + # Two services pointing at one group declare that their routes must not share a + # conduit. A relationship, not a string: an identifier either resolves or the + # write fails. Optional, so an exposure accepted deliberately stays accepted. + - name: diversity_group + peer: OtnDiversityGroup + kind: Attribute + cardinality: one + optional: true + identifier: otn_diversity_group__services + # A group and a service are independent: deleting the group ends the + # requirement. + order_weight: 915 + # The client containers this circuit owns, written from the container side. A + # deleted service leaves its containers behind, inert. + - name: containers + peer: OtnContainer + kind: Attribute + cardinality: many + optional: true + identifier: otn_service__containers + order_weight: 920 + # Peered at the generic, so a deployment can point at whatever organization + # kind it has, including OrganizationTenant from extensions/tenancy, without + # this extension depending on that one. + - name: customer + peer: OrganizationGeneric + label: Customer + kind: Attribute + cardinality: one + optional: false + identifier: otn_service__customer + order_weight: 1200 + + # A node, not a Text attribute and not a Dropdown. Small on purpose: everything + # about which routes are actually disjoint is computed from the spans. + - name: DiversityGroup + namespace: Otn + # Not a `Dropdown`: a Dropdown's choices are schema, so adding a group would be a + # migration, and a choice has nowhere to put what the group is for. + description: A declared diversity requirement. The services in one group must route over disjoint conduits. + label: Diversity group + icon: mdi:call-split + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + # Unique: the name is the identity an operator types and the human_friendly_id + # resolves. + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + # Why the group exists, in the operator's words: half of why this is a node. + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + relationships: + # The inverse side, sharing one explicit identifier with + # `OtnService.diversity_group`. Two diverging identifiers do not error, they + # split into two one-way edges that read empty from the other side. + - name: services + peer: OtnService + kind: Attribute + cardinality: many + optional: true + identifier: otn_diversity_group__services + order_weight: 800 + + - name: OpticalPath + namespace: Otn + description: The materialised chosen route for one service. + label: Optical path + icon: mdi:map-marker-path + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + # No two segments of one circuit carry the same sequence number; the server + # refuses the second write. The attribute half has to belong to the node the + # constraint sits on, which is why it cannot be declared on `OtnService`. + uniqueness_constraints: + # It refuses a repeat of segment 2 and is blind to the sequence 1, 2, 4. + # A service's protect path is a second OtnOpticalPath at the same segment_sequence + # with path_role protect, so the working and protect routes hang off one service. + - ["service", "segment_sequence__value", "path_role__value"] + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 64 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: description + kind: Text + parameters: + max_length: 256 + optional: true + order_weight: 1100 + # Not unique on its own: segment 1 exists once per circuit, so the pair with + # the service is the constraint above. + - name: segment_sequence + kind: Number + default_value: 1 + parameters: + min_value: 1 + # A sanity ceiling, not a derived bound: tying it to the plant would date it. + max_value: 50 + optional: false + description: Which segment of its circuit this path is. 1 for a circuit that spans one wavelength. + order_weight: 1200 + - name: path_role + kind: Dropdown + default_value: working + choices: + - name: working + label: Working + description: The route the service takes while nothing on it has failed. + color: "#4caf50" + - name: protect + label: Protect + description: The standby route the service switches to when its working one fails. + color: "#2196f3" + - name: express + label: Express + description: A route passing a site optically, with nothing added or dropped there. + color: "#9c27b0" + optional: false + description: Which role this path plays for its service, working, protect or express. + order_weight: 1300 + relationships: + # Mandatory. A path with no service has no meaning here: it is one wavelength's + # route chosen to answer one customer's request, and its figures come from that. + - name: service + peer: OtnService + kind: Parent + cardinality: one + # Also what the uniqueness constraint above needs: a constraint naming an + # optional relationship is rejected with "relationship must be mandatory". + optional: false + identifier: otn_service__optical_path + order_weight: 800 + - name: carrier + peer: OtnOpticalCarrier + kind: Attribute + cardinality: one + optional: true + identifier: otn_carrier__optical_path + order_weight: 810 + # `on_delete: cascade`, one of three in this file (with `OtnGenericDevice.ports` + # and `OtnService.optical_path`): a hop has no meaning apart from its path. + - name: hops + peer: OtnPathHop + kind: Component + cardinality: many + optional: true + identifier: otn_path__hops + on_delete: cascade + order_weight: 900 + + - name: PathHop + namespace: Otn + description: One ordered element on a path. + label: Path hop + icon: mdi:ray-vertex + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - sequence__value + display_label: name__value + uniqueness_constraints: + - ["path", "sequence__value"] + attributes: + - name: name + kind: Text + unique: true + parameters: + max_length: 96 + regex: "^[A-Za-z0-9._-]+$" + optional: false + order_weight: 1000 + - name: sequence + kind: Number + parameters: + min_value: 1 + max_value: 1000 + optional: false + description: Position along the path, counting from the endpoint A ROADM. + order_weight: 1100 + # What the element does to the carrier here. `add` and `drop` are the two a + # port pair alone cannot tell apart, since both cross an add/drop port and a + # degree; the direction of travel is what differs. Optional, because a span or + # an amplifier is simply crossed and a deployment may not track the rest. + - name: action + kind: Dropdown + choices: + - name: add + label: Add + description: The carrier joins the line system here. + color: "#4caf50" + - name: drop + label: Drop + description: The carrier leaves the line system here. + color: "#ff9800" + - name: express + label: Express + description: Switched degree to degree without reaching an add/drop port. + color: "#673ab7" + - name: through + label: Through + description: Crossed passively, as on a span, an amplifier or a panel. + color: "#607d8b" + - name: terminate + label: Terminate + description: The light ends here, on a transponder or a router. + color: "#f44336" + optional: true + description: What this element does to the carrier at this hop. + order_weight: 1200 + relationships: + - name: path + peer: OtnOpticalPath + kind: Parent + cardinality: one + optional: false + identifier: otn_path__hops + order_weight: 800 + # One relationship covers ROADMs, amplifiers and fiber spans. + - name: element + peer: OtnOpticalElement + kind: Attribute + cardinality: one + optional: false + identifier: otn_hop__element + order_weight: 810 + # The port pair the element carries the light across. On a ROADM this is the + # cross-connect: with `action` it states which degree or add/drop port the + # carrier entered on and which it left by. Both optional, so a hop through an + # element whose ports are not modelled still records the order of travel. + # Which ports belong to the hop's own element is unenforced here. + - name: ingress_port + peer: OtnGenericPort + kind: Attribute + cardinality: one + optional: true + identifier: otn_hop__ingress_port + order_weight: 820 + - name: egress_port + peer: OtnGenericPort + kind: Attribute + cardinality: one + optional: true + identifier: otn_hop__egress_port + order_weight: 830 + + # Location. + + # A facility on a site, as an edge rather than a suffix inside a tag name. An edge + # fails loudly: a renamed or mistyped tag dropped a facility and raised nothing. + - name: Facility + namespace: Otn + description: A supercomputing facility hosted at a PoP. + label: Facility + icon: ri:cpu-line + # Reached through the site it sits on. + include_in_menu: false + human_friendly_id: + - name__value + order_by: + - name__value + display_label: name__value + attributes: + # Lower case with hyphens, so `marenostrum-5` and never `MareNostrum 5`. + - name: name + kind: Text + unique: true + order_weight: 1000 + - name: description + kind: Text + optional: true + order_weight: 1200 + relationships: + - name: site + peer: LocationSite + kind: Attribute + cardinality: one + optional: true + identifier: otn_site__facility + order_weight: 900 + +# LocationSite carries the OTN site fields rather than a second site kind. Its +# `facility` relationship is renamed `otn_facility`, because LocationSite already +# has a `facility` Text attribute and a node cannot hold both under one name. Its +# `devices` relationship is renamed `otn_devices`, because LocationSite inherits a +# `devices` relationship from LocationHosting peering DcimPhysicalDevice. +extensions: + nodes: + - kind: LocationSite + attributes: + - name: latitude_microdeg + kind: Number + parameters: + min_value: -90000000 + max_value: 90000000 + optional: true + description: Latitude in millionths of a degree. No Float kind exists. + order_weight: 1600 + - name: longitude_microdeg + kind: Number + parameters: + min_value: -180000000 + max_value: 180000000 + optional: true + description: Longitude in millionths of a degree. No Float kind exists. + order_weight: 1700 + - name: site_type + kind: Dropdown + choices: + - name: pop + label: PoP + color: "#2196f3" + - name: customer + label: Customer site + color: "#ff9800" + optional: true + description: A PoP hosting OTN equipment, or a customer site handing traffic to one. + order_weight: 1800 + relationships: + - name: otn_devices + peer: OtnGenericDevice + kind: Generic + cardinality: many + optional: true + identifier: otn_site__devices + order_weight: 900 + - name: spans_a + peer: OtnFiberSpan + label: Fiber spans (A end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__site_a + order_weight: 910 + - name: spans_b + peer: OtnFiberSpan + label: Fiber spans (B end) + kind: Attribute + cardinality: many + optional: true + identifier: otn_span__site_b + order_weight: 920 + - name: otn_facility + peer: OtnFacility + kind: Attribute + cardinality: one + optional: true + identifier: otn_site__facility + order_weight: 930 + + # OTN records its pluggables on the library's transceiver kinds rather than a + # second inventory. `otn_port` is where the module is fitted, because `interface` + # peers InterfacePhysical and no OTN port is one. The part catalog stays on the + # OTN side, since OtnTransceiverType references optical modes. + - kind: DcimGenericTransceiver + relationships: + # Optional, so a spare or decommissioned unit stays modellable, and therefore + # carrying no uniqueness constraint: Infrahub refuses one on an optional + # relationship. The duplicate is refused by the inverse instead, since every + # `transceiver` on this identifier is cardinality one. This peers the generic, + # and a relationship to a generic cannot be filtered by peer kind, so a module + # written into an amplifier port is accepted. Unenforced here. + - name: otn_port + peer: OtnOpticalPort + label: OTN port this unit is fitted in + kind: Attribute + cardinality: one + optional: true + identifier: otn_optical_port__transceiver + order_weight: 1600 + - name: otn_type + peer: OtnTransceiverType + label: OTN part this unit is + kind: Attribute + cardinality: one + optional: true + identifier: otn_transceiver_type__units + order_weight: 1700 diff --git a/extensions/patch_panel/patch_panel.yml b/extensions/patch_panel/patch_panel.yml index 7d263771..3580dfc8 100644 --- a/extensions/patch_panel/patch_panel.yml +++ b/extensions/patch_panel/patch_panel.yml @@ -24,9 +24,8 @@ generics: kind: Text optional: true order_weight: 1100 - # NOTE: this choice list is duplicated in extensions/optical_multiplexer and the two must be - # kept in sync. Infrahub cannot share a choice list across extension files without a - # shared generic in a common ancestor, which is a base-tier change. + # NOTE: this connector choice list is now unique to this extension. It was previously + # duplicated in extensions/optical_multiplexer, which has been removed. - name: connector_type kind: Dropdown choices: diff --git a/extensions/transceiver/transceiver.yml b/extensions/transceiver/transceiver.yml index 0537b25e..d5783357 100644 --- a/extensions/transceiver/transceiver.yml +++ b/extensions/transceiver/transceiver.yml @@ -47,6 +47,10 @@ generics: label: LR4 (Long Range 4-lane) description: Long Range 4-lane transceiver, typically used for longer distances over parallel optics. color: "#336699" + - name: dr4 + label: DR4 (500m Range 4-lane) + description: 500 m 4-lane transceiver over parallel single mode fiber. + color: "#339966" - name: zr label: ZR (Extended Reach) description: Extended Reach transceiver, suitable for distances up to 80km. diff --git a/objects/extensions/mlag/mlag.yml b/objects/extensions/mlag/mlag.yml index e98fd2c1..99857226 100644 --- a/objects/extensions/mlag/mlag.yml +++ b/objects/extensions/mlag/mlag.yml @@ -25,7 +25,7 @@ # So a fixture that owns a relationship owns its endpoints too. This file # creates, and is the only file anywhere under objects/ that ever saves, # nyc1-rtr02 and nyc1-rtr03. It deliberately does not build the domain on -# nyc1-rtr01: objects/extensions/rack, device_psu_module, routing_ospf +# nyc1-rtr01: objects/extensions/rack, device_psu_module, dwdm, routing_ospf # and routing_pim all re-upsert that device after this file has run. # objects/extensions/routing_bgp and peering_ixp only reference nyc1-rtr02 by # human_friendly_id, which does not save it and so is safe. diff --git a/objects/extensions/optical_multiplexer/optical_multiplexer.yml b/objects/extensions/optical_multiplexer/optical_multiplexer.yml deleted file mode 100644 index 93d5098f..00000000 --- a/objects/extensions/optical_multiplexer/optical_multiplexer.yml +++ /dev/null @@ -1,170 +0,0 @@ -# --------------------------------------------------------------------------- -# Mock data for extensions/optical_multiplexer. -# Depends on: base, extensions/location_minimal (LocationSite: NYC1), -# extensions/rack (LocationRack: NYC1-RACK-01, DcimDevice: nyc1-rtr01), -# extensions/transceiver (DcimGenericTransceiver base + existing plugged/spare transceivers on -# GigabitEthernet0/0/0/0 and /1). -# -# DcimWdmChannel records are created first since both the OADM front -# interfaces and the WDM transceivers below reference them. DcimOpticalMultiplexer -# is created next, with its front/rear interfaces nested as Component -# children. A new interface (GigabitEthernet0/0/0/4) is added on nyc1-rtr01 -# for the plugged WDM transceiver demo, since GigabitEthernet0/0/0/0 through /3 are -# already occupied by other fixtures. -# --------------------------------------------------------------------------- ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: DcimWdmChannel - data: - - channel: 1 - wdm_type: dwdm - wavelength: "1550.12" - frequency: "193.10" - - - channel: 2 - wdm_type: dwdm - wavelength: "1550.92" - frequency: "193.20" - - - channel: 20 - wdm_type: cwdm - wavelength: "1611.00" - frequency: "186.00" - ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: DcimOpticalMultiplexer - data: - - name: NYC1-MUX01 - wdm_type: dwdm - description: Primary DWDM multiplexer for the NYC1 backbone ring. - position: 20 - rack_face: front - # `location` (from DcimPhysicalDevice) peer is LocationHosting, a - # Generic -- specify the concrete kind. Cardinality one, so `data` is - # a single mapping. This upserts against the existing rack. - location: - kind: LocationRack - data: - name: NYC1-RACK-01 - site: NYC1 - # front_interfaces is a Component relationship (cardinality many) -- - # nest the concrete kind with `data` as a list. The `optical_multiplexer` - # Parent relationship on each child is implied by this nesting. - front_interfaces: - kind: DcimOadmFrontInterface - data: - - name: "CH1" - connector_type: lc - # `channels` peer (DcimWdmChannel) is a CONCRETE kind whose - # human_friendly_id has two components ([wdm_type__value, - # channel__value]) and the relationship is cardinality many, so - # it's a plain list of HFID lists (same pattern as - # `bundle_members` in objects/extensions/lag/lag.yml). - channels: - - [dwdm, "1"] - - name: "CH2" - connector_type: lc - channels: - - [dwdm, "2"] - # rear_interface is a Component relationship of cardinality one -- - # nest the concrete kind with `data` as a single mapping. - rear_interface: - kind: DcimOadmRearInterface - data: - name: "COM" - connector_type: lc - - - name: NYC1-MUX02 - wdm_type: cwdm - description: Secondary CWDM multiplexer, spare capacity at NYC1. - position: 22 - rack_face: front - location: - kind: LocationRack - data: - name: NYC1-RACK-01 - site: NYC1 - front_interfaces: - kind: DcimOadmFrontInterface - data: - - name: "CH1" - connector_type: lc - channels: - - [cwdm, "20"] - rear_interface: - kind: DcimOadmRearInterface - data: - name: "COM" - connector_type: lc - ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: DcimDevice - data: - # Upsert the existing fixture device to add a free physical interface - # for the plugged WDM transceiver below (GigabitEthernet0/0/0/0 through /3 are - # already in use by other fixtures). - - name: nyc1-rtr01 - location: - kind: LocationRack - data: - name: NYC1-RACK-01 - site: NYC1 - interfaces: - kind: InterfacePhysical - data: - - name: GigabitEthernet0/0/0/4 - role: core - status: active - ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: DcimWdmTransceiver - data: - - transceiver_type: zr - form_factor: sfp_plus - status: plugged - wdm_type: dwdm - serial_number: "SFP-WDM-0001" - manufacturer: Cisco - # `interface` peer (InterfacePhysical) is a CONCRETE kind with a - # composite human_friendly_id ([device__name__value, name__value]). - interface: [nyc1-rtr01, GigabitEthernet0/0/0/4] - # `wdm_channel` peer (DcimWdmChannel) is a CONCRETE kind with a - # composite human_friendly_id ([wdm_type__value, channel__value]), - # cardinality one -- a plain list of the HFID parts. - wdm_channel: [dwdm, "1"] - - - transceiver_type: zr - form_factor: sfp_plus - status: spare - wdm_type: dwdm - serial_number: "SFP-WDM-0002" - manufacturer: Cisco - spare_location: - kind: LocationSite - data: - name: NYC1 - wdm_channel: [dwdm, "2"] - - - transceiver_type: zr - form_factor: qsfp28 - status: spare - wdm_type: cwdm - serial_number: "SFP-WDM-0003" - manufacturer: Cisco - spare_location: - kind: LocationRack - data: - name: NYC1-RACK-01 - site: NYC1 - wdm_channel: [cwdm, "20"] diff --git a/objects/extensions/otn/otn.yml b/objects/extensions/otn/otn.yml new file mode 100644 index 00000000..6758a8a2 --- /dev/null +++ b/objects/extensions/otn/otn.yml @@ -0,0 +1,958 @@ +# --------------------------------------------------------------------------- +# Mock data for extensions/otn. +# Depends on: base (OrganizationManufacturer: Cisco, OrganizationProvider: Lumen +# and Colt), extensions/location_minimal (LocationSite: NYC1, SJC1), +# extensions/transceiver (DcimStandardTransceiver, which records the fitted +# pluggable). LocationRack and DcimDeviceType are created here rather than +# declared as a dependency, which is what the other extensions' object files do. +# +# Two sites, three spans in two conduits, and one protected 400G transport service +# beside a passive coarse tail. Its payload is groomed two levels deep into ODU +# containers. Enough to walk the model from a service down to the ports it lands on, +# back up from a port to the ROADM switching it, and down again from a wavelength to +# the client signals inside it. Not a representative network. +# +# The line system is Ciena and the transponders sit on it, with a passive coarse +# pair from Adtran and a Cisco grey client pluggable. Real platform names, at +# platform granularity rather than invented card codes. +# +# References use each kind's human_friendly_id: a device by name, a port by +# device plus name. OtnFrequencyGrid is referenced with a nested kind/data +# block instead, because its hfid is a Number, the centre frequency in MHz. +# --------------------------------------------------------------------------- +--- +# The optical vendors this sample uses. base ships Cisco only, which stays on the +# grey client pluggable, where a third-party optic is ordinary. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OrganizationManufacturer + data: + - name: Ciena + description: Ciena Corporation. + - name: Adtran + description: Adtran Holdings, Inc., which now carries the ADVA FSP line. + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnFacility + data: + # Facility names are lower case with hyphens. + - name: nyc1-gpu-cluster + description: GPU training cluster handing 400G client traffic to the NYC1 PoP. + site: NYC1 + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnFiberType + data: + - name: smf-g652d + description: ITU-T G.652.D standard single mode fiber. + attenuation_coefficient_mdb_per_km: 190 + dispersion_fs_per_nm_km: 17000 + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnFrequencyGrid + data: + # ITU-T G.694.1, 192.1 THz. On the 50 GHz plan this extension models, that is + # channel 16, which `channel_number` derives rather than storing. + - center_frequency_mhz: 192100000 + +--- +# The client signals this network grooms. Rates are the nominal line rates from +# G.709 and G.707, in kbps, and `default_container_type` is the first step of the +# mapping chain rather than the last. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnClientSignal + data: + - name: 100GBASE-LR4 + description: 100 Gigabit Ethernet over four wavelengths, 10 km. + layer: ethernet + auto_selectable: true + bit_rate_kbps: 103100000 + default_container_type: ODU4 + default_mapping: GMP + - name: STM-64 + alias: OC-192 + description: SDH at 9.95 Gbit/s, still carried on plenty of transport networks. + layer: sdh + auto_selectable: true + bit_rate_kbps: 9953280 + default_container_type: ODU2 + default_mapping: BMP + +--- +# What the line side can do. The transponder mode is what generates the carrier on +# this network; the 400ZR mode belongs to a pluggable and is here so a coherent +# QSFP-DD has a mode to declare. Reach and required OSNR are vendor figures, a +# starting point for a budget rather than a guarantee. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnOpticalMode + data: + - name: wl5e-400g-dp16qam + description: Coherent 400G on the transponder line side, long haul. + mode_class: transponder + modulation: DP-16QAM + line_rate_gbps: 400 + baud_mbaud: 56000 + required_osnr_mdb: 25000 + cd_tolerance_fs_per_nm: 50000000 + nominal_reach_m: 1000000 + fec_type: SD-FEC + fec_latency_ns: 5000 + - name: 400zr-dp16qam + description: OIF 400ZR in a pluggable, for a metro or campus reach. + mode_class: pluggable + modulation: DP-16QAM + line_rate_gbps: 400 + baud_mbaud: 59840 + required_osnr_mdb: 26000 + cd_tolerance_fs_per_nm: 2400000 + nominal_reach_m: 120000 + fec_type: cFEC + fec_latency_ns: 100 + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnTransceiverType + data: + - part_number: QDD-400G-DR4 + manufacturer: Cisco + description: 400G QSFP-DD grey client optic, 500 m over parallel single mode fiber. + form_factor: QSFP-DD + tunable: false + # A coherent pluggable, so the catalogue carries something that names a mode. It + # is tunable, which is what lets it sit on the dense grid at all. + - part_number: QDD-400G-ZR + manufacturer: Cisco + description: 400ZR coherent QSFP-DD, tunable across the C band. + form_factor: QSFP-DD + tunable: true + supported_modes: + - 400zr-dp16qam + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnTransponder + data: + - name: nyc1-txp01 + status: active + role: edge + vendor: Ciena + model: Waveserver 5 + site: NYC1 + ports: + - kind: OtnClientPort + data: + name: client-1/0/0 + role: client + oper_state: up + connector_type: MPO-12 + polish: APC + - kind: OtnLinePort + data: + name: line-1/0/0 + role: line + oper_state: up + connector_type: LC + polish: UPC + center_frequency_mhz: 192100000 + tx_power_mdbm: 1000 + rx_sensitivity_mdbm: -25000 + + # The far end of the wavelength. OtnService.endpoint_z is mandatory, so the + # SJC1 end of the span needs a device of its own. + - name: sjc1-txp01 + status: active + role: edge + vendor: Ciena + model: Waveserver 5 + site: SJC1 + ports: + - kind: OtnLinePort + data: + name: line-1/0/0 + role: line + oper_state: up + connector_type: LC + polish: UPC + center_frequency_mhz: 192100000 + tx_power_mdbm: 1000 + rx_sensitivity_mdbm: -25000 + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: DcimStandardTransceiver + data: + # The fitted module. This loads after the transponder above, because + # DcimGenericTransceiver declares no hfid, so nothing can reference it by name: + # the transceiver has to claim its port rather than the port claiming it. + - serial_number: TRX-NYC1-0001 + transceiver_type: dr4 + form_factor: qsfp_dd + status: plugged + manufacturer: Cisco + otn_type: QDD-400G-DR4 + # `otn_port` peers the OtnOpticalPort generic, which has no hfid, so the port + # names its concrete kind and upserts by its uniqueness fields. + otn_port: + kind: OtnClientPort + data: + name: client-1/0/0 + role: client + device: nyc1-txp01 + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnRoadm + data: + - name: nyc1-rdm01 + status: active + role: core + vendor: Ciena + model: 6500-T12 + insertion_loss_mdb: 5500 + site: NYC1 + # The physical asset for the same box. `dcim_device` peers the + # DcimPhysicalDevice generic, which declares no hfid, so the record names its + # concrete kind. It is the route to a rack elevation and to a device type, which + # this extension reaches on the Dcim side rather than modelling natively: + # `position` and `rack_face` sit on the record and its `location` is a + # LocationRack. The name is shared with the OTN device on purpose, since both + # records describe one box. + dcim_device: + kind: DcimDevice + data: + name: nyc1-rdm01 + position: 14 + rack_face: front + device_type: + kind: DcimDeviceType + data: + name: 6500-T12 + manufacturer: Ciena + location: + kind: LocationRack + data: + name: NYC1-RACK-01 + site: + kind: LocationSite + data: + name: NYC1 + ports: + - kind: OtnRoadmAddDropPort + data: + name: add-drop-1/1 + role: add_drop + oper_state: up + connector_type: LC + polish: UPC + - kind: OtnRoadmDegreePort + data: + name: degree-1 + role: degree + oper_state: up + connector_type: LC + polish: UPC + direction: west + - kind: OtnRoadmDegreePort + data: + name: degree-2 + role: degree + oper_state: up + connector_type: LC + polish: UPC + direction: south + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnMuxDemux + data: + - name: nyc1-mux01 + status: active + role: passive + vendor: Ciena + model: 6500 CMD44 + insertion_loss_mdb: 3500 + channel_capacity: 44 + site: NYC1 + ports: + - kind: OtnMuxClientPort + data: + name: mux-client-1 + role: client + oper_state: up + connector_type: LC + polish: UPC + dwdm_channel: + kind: OtnFrequencyGrid + data: + center_frequency_mhz: 192100000 + - kind: OtnMuxLinePort + data: + name: mux-line-1 + role: line + oper_state: up + connector_type: LC + polish: UPC + +--- +# Two conduits on separate routes. Diversity is a property of the plant, so the +# protect path earns its name by riding a span in the other one. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnConduit + data: + - name: nyc1-sjc1-conduit-north + description: Northern duct route between NYC1 and SJC1. + owner: Lumen + - name: nyc1-sjc1-conduit-south + description: Southern duct route between NYC1 and SJC1. + owner: Colt + +--- +# The far-end ROADM. Without it the wavelength had nowhere to be dropped, and a +# section had only one end that could terminate it. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnRoadm + data: + - name: sjc1-rdm01 + status: active + role: core + vendor: Ciena + model: 6500-T12 + insertion_loss_mdb: 5500 + technology: wss_lcos + channel_capacity: 96 + colorless: true + directionless: true + contentionless: false + site: SJC1 + # The physical asset for the same box. `dcim_device` peers the + # DcimPhysicalDevice generic, which declares no hfid, so the record names its + # concrete kind. It is the route to a rack elevation and to a device type, which + # this extension reaches on the Dcim side rather than modelling natively: + # `position` and `rack_face` sit on the record and its `location` is a + # LocationRack. The name is shared with the OTN device on purpose, since both + # records describe one box. + dcim_device: + kind: DcimDevice + data: + name: sjc1-rdm01 + position: 14 + rack_face: front + device_type: + kind: DcimDeviceType + data: + name: 6500-T12 + manufacturer: Ciena + location: + kind: LocationRack + data: + name: SJC1-RACK-01 + site: + kind: LocationSite + data: + name: SJC1 + ports: + - kind: OtnRoadmAddDropPort + data: + name: add-drop-1/1 + role: add_drop + oper_state: up + connector_type: LC + polish: UPC + - kind: OtnRoadmDegreePort + data: + name: degree-1 + role: degree + oper_state: up + connector_type: LC + polish: UPC + direction: east + - kind: OtnRoadmDegreePort + data: + name: degree-2 + role: degree + oper_state: up + connector_type: LC + polish: UPC + direction: north + +--- +# A fixed coarse pair, with no ROADM at either end. The section between these two +# is what OtnOmsEndpoint exists for: before it, a passive point-to-point system +# could not carry a multiplex section at all. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnMuxDemux + data: + - name: nyc1-cwdm01 + status: active + role: passive + vendor: Adtran + model: FSP 3000 + insertion_loss_mdb: 2800 + plan: cwdm + mux_role: mux_demux + technology: thin_film_filter + channel_capacity: 8 + site: NYC1 + cwdm_channels: + kind: OtnCwdmChannel + data: + - center_wavelength_nm: 1471 + - center_wavelength_nm: 1491 + ports: + - kind: OtnMuxClientPort + data: + name: cwdm-client-1471 + role: client + oper_state: up + connector_type: LC + polish: UPC + cwdm_channel: + kind: OtnCwdmChannel + data: + center_wavelength_nm: 1471 + - kind: OtnMuxLinePort + data: + name: cwdm-line-1 + role: line + oper_state: up + connector_type: LC + polish: UPC + - name: sjc1-cwdm01 + status: active + role: passive + vendor: Adtran + model: FSP 3000 + insertion_loss_mdb: 2800 + plan: cwdm + mux_role: mux_demux + technology: thin_film_filter + channel_capacity: 8 + site: SJC1 + cwdm_channels: + kind: OtnCwdmChannel + data: + - center_wavelength_nm: 1471 + - center_wavelength_nm: 1491 + ports: + - kind: OtnMuxClientPort + data: + name: cwdm-client-1471 + role: client + oper_state: up + connector_type: LC + polish: UPC + cwdm_channel: + kind: OtnCwdmChannel + data: + center_wavelength_nm: 1471 + - kind: OtnMuxLinePort + data: + name: cwdm-line-1 + role: line + oper_state: up + connector_type: LC + polish: UPC + +--- +# The coupler that feeds the working and the protect leg. The scheme it serves, +# 1+1 or 1:1, is not modelled; see the not_covered note on protection mechanisms. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnSplitter + data: + - name: nyc1-olp01 + status: active + role: passive + vendor: Adtran + model: FSP 3000 + split_type: even + output_count: 2 + insertion_loss_mdb: 3500 + site: NYC1 + ports: + - kind: OtnSplitterPort + data: + name: common + leg: common + role: line + oper_state: up + connector_type: LC + polish: UPC + - kind: OtnSplitterPort + data: + name: out-1 + leg: output + role: line + oper_state: up + connector_type: LC + polish: UPC + - kind: OtnSplitterPort + data: + name: out-2 + leg: output + role: line + oper_state: up + connector_type: LC + polish: UPC + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnFiberSpan + data: + # A single 82 km span stands in for the NYC1 to SJC1 route, which in a real + # network is many spans with amplifiers between them. + - name: nyc1-sjc1-span-1 + description: Leased dark fiber between NYC1 and SJC1, north route. + length_m: 82000 + insertion_loss_mdb: 15580 + splice_count: 20 + fiber_type: smf-g652d + site_a: NYC1 + site_b: SJC1 + conduit: nyc1-sjc1-conduit-north + oms_sequence: 1 + terminating_ports: + - [nyc1-rdm01, degree-1] + - [sjc1-rdm01, degree-1] + # The diverse route the protect path takes. Longer, so its budget differs, and in + # a different conduit, which is what makes the two paths genuinely diverse. + - name: nyc1-sjc1-span-2 + description: Leased dark fiber between NYC1 and SJC1, south route. + length_m: 104000 + insertion_loss_mdb: 19760 + splice_count: 26 + fiber_type: smf-g652d + site_a: NYC1 + site_b: SJC1 + conduit: nyc1-sjc1-conduit-south + oms_sequence: 1 + terminating_ports: + - [nyc1-rdm01, degree-2] + - [sjc1-rdm01, degree-2] + # The passive CWDM tail. Its own span, because a span belongs to one section. + - name: nyc1-sjc1-span-3 + description: Dark fiber carrying the coarse tail between NYC1 and SJC1. + length_m: 41000 + insertion_loss_mdb: 8200 + splice_count: 9 + fiber_type: smf-g652d + site_a: NYC1 + site_b: SJC1 + oms_sequence: 1 + terminating_ports: + - [nyc1-cwdm01, cwdm-line-1] + - [sjc1-cwdm01, cwdm-line-1] + +--- +# Three sections. Two ROADM to ROADM on the diverse routes, and one between the +# passive coarse pair, which is only expressible because a section terminates on +# any OtnOmsEndpoint rather than on a ROADM. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnOpticalMultiplexSection + data: + # `endpoint_a` and `endpoint_b` peer the OtnOmsEndpoint generic, which declares + # no hfid, so each end names its concrete kind and upserts by its own fields. + - name: nyc1-sjc1-oms-north + description: North route section, amplified in the NYC1 to SJC1 direction. + endpoint_a: + kind: OtnRoadm + data: + name: nyc1-rdm01 + role: core + endpoint_b: + kind: OtnRoadm + data: + name: sjc1-rdm01 + role: core + spans: + - nyc1-sjc1-span-1 + - name: nyc1-sjc1-oms-south + description: South route section, unamplified. + endpoint_a: + kind: OtnRoadm + data: + name: nyc1-rdm01 + role: core + endpoint_b: + kind: OtnRoadm + data: + name: sjc1-rdm01 + role: core + spans: + - nyc1-sjc1-span-2 + - name: nyc1-sjc1-oms-cwdm + description: Coarse section between two passive multiplexers, no ROADM at either end. + endpoint_a: + kind: OtnMuxDemux + data: + name: nyc1-cwdm01 + role: passive + endpoint_b: + kind: OtnMuxDemux + data: + name: sjc1-cwdm01 + role: passive + spans: + - nyc1-sjc1-span-3 + +--- +# The amplifier chain on the north section, in the A to B direction only. Position 1 +# is the booster leaving NYC1 and position 2 the pre-amplifier arriving at SJC1, which +# is what oms_sequence orders. The return direction is left unamplified here. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnAmplifier + data: + - name: nyc1-amp01 + status: active + role: core + vendor: Ciena + model: 6500 SLA + amplifier_type: edfa + stage: booster + gain_mdb: 17000 + noise_figure_mdb: 5000 + max_total_output_power_mdbm: 23000 + site: NYC1 + oms_a2b: nyc1-sjc1-oms-north + oms_sequence: 1 + - name: sjc1-amp01 + status: active + role: core + vendor: Ciena + model: 6500 SLA + amplifier_type: edfa + stage: preamp + gain_mdb: 21000 + noise_figure_mdb: 4500 + max_total_output_power_mdbm: 20000 + site: SJC1 + oms_a2b: nyc1-sjc1-oms-north + oms_sequence: 2 + # The return direction. `oms_b2a` is a separate relationship from `oms_a2b`, so + # which chain an amplifier is in is stored by the graph rather than by a flag, + # and oms_sequence counts along the direction that chain amplifies. + - name: sjc1-amp02 + status: active + role: core + vendor: Ciena + model: 6500 SLA + amplifier_type: edfa + stage: booster + gain_mdb: 17000 + noise_figure_mdb: 5000 + max_total_output_power_mdbm: 23000 + site: SJC1 + oms_b2a: nyc1-sjc1-oms-north + oms_sequence: 1 + - name: nyc1-amp02 + status: active + role: core + vendor: Ciena + model: 6500 SLA + amplifier_type: edfa + stage: preamp + gain_mdb: 21000 + noise_figure_mdb: 4500 + max_total_output_power_mdbm: 20000 + site: NYC1 + oms_b2a: nyc1-sjc1-oms-north + oms_sequence: 2 + +--- +# Distributed Raman on the long south span, injected at the SJC1 end and firing +# back against the signal, which is what counter-propagating means. It pumps the +# fiber itself rather than sitting in line, so it points at the span. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnRamanPump + data: + - name: sjc1-raman01 + status: active + role: core + vendor: Ciena + model: 6500 SLA + on_off_gain_mdb: 9000 + injection_end: site_b + propagation: counter + site: SJC1 + span: nyc1-sjc1-span-2 + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnDiversityGroup + data: + - name: dg-lumen-east + description: Services that must not share plant with each other. + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnOpticalCarrier + data: + - name: nyc1-sjc1-ch16 + description: 400G wavelength on channel 16 between NYC1 and SJC1. + status: active + channel: + kind: OtnFrequencyGrid + data: + center_frequency_mhz: 192100000 + optical_mode: wl5e-400g-dp16qam + # Both sections, because the working and the protect path each cross one and + # the carrier is the same wavelength on either route. + sections: + - nyc1-sjc1-oms-north + - nyc1-sjc1-oms-south + line_ports: + - [nyc1-txp01, line-1/0/0] + - [sjc1-txp01, line-1/0/0] + +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnService + data: + - name: SVC-NYC1-SJC1-0001 + description: 400G transport sold to Lumen between NYC1 and SJC1, groomed into ODU containers. + rate_gbps: 400 + sla: gold + status: active + service_type: transport + client_signal: 100GBASE-LR4 + max_latency_ns: 500000 + endpoint_a: nyc1-txp01 + endpoint_z: sjc1-txp01 + customer: Lumen + diversity_group: dg-lumen-east + optical_path: + kind: OtnOpticalPath + data: + - name: nyc1-sjc1-path-1 + description: Working route, north, carrying the wavelength from NYC1 to SJC1. + segment_sequence: 1 + path_role: working + carrier: nyc1-sjc1-ch16 + hops: + kind: OtnPathHop + data: + # `element` peers with the OtnOpticalElement generic, which has + # no hfid, so each hop names the concrete kind and upserts + # against the object created above by its mandatory fields. + # The ROADM cross-connect: the carrier is added, entering on the + # add/drop port the transponder patches into and leaving by the + # degree that faces SJC1. + - name: nyc1-sjc1-hop-1 + sequence: 1 + action: add + element: + kind: OtnRoadm + data: + name: nyc1-rdm01 + role: core + ingress_port: [nyc1-rdm01, add-drop-1/1] + egress_port: [nyc1-rdm01, degree-1] + - name: nyc1-sjc1-hop-2 + sequence: 2 + action: through + element: + kind: OtnFiberSpan + data: + name: nyc1-sjc1-span-1 + length_m: 82000 + fiber_type: smf-g652d + site_a: NYC1 + site_b: SJC1 + # The far end of the working route, where the carrier leaves the line + # system. `drop` is the mirror of hop 1: same kind of port pair, other + # direction of travel, which is the distinction `action` records. + - name: nyc1-sjc1-hop-3 + sequence: 3 + action: drop + element: + kind: OtnRoadm + data: + name: sjc1-rdm01 + role: core + ingress_port: [sjc1-rdm01, degree-1] + egress_port: [sjc1-rdm01, add-drop-1/1] + # The protect route, south. It shares the service and the segment position + # with the working path and differs only in path_role, which is the third + # term of the uniqueness constraint that lets both exist. + - name: nyc1-sjc1-path-2 + description: Protect route, south, over the diverse conduit. + segment_sequence: 1 + path_role: protect + carrier: nyc1-sjc1-ch16 + hops: + kind: OtnPathHop + data: + - name: nyc1-sjc1-protect-hop-1 + sequence: 1 + action: add + element: + kind: OtnRoadm + data: + name: nyc1-rdm01 + role: core + ingress_port: [nyc1-rdm01, add-drop-1/1] + egress_port: [nyc1-rdm01, degree-2] + - name: nyc1-sjc1-protect-hop-2 + sequence: 2 + action: through + element: + kind: OtnFiberSpan + data: + name: nyc1-sjc1-span-2 + length_m: 104000 + fiber_type: smf-g652d + site_a: NYC1 + site_b: SJC1 + - name: nyc1-sjc1-protect-hop-3 + sequence: 3 + action: drop + element: + kind: OtnRoadm + data: + name: sjc1-rdm01 + role: core + ingress_port: [sjc1-rdm01, degree-2] + egress_port: [sjc1-rdm01, add-drop-1/1] + +--- +# The intra-site jumper from the transponder line port into the ROADM add/drop +# port. Every OTN port kind inherits DcimEndpoint, so extensions/cable records +# this run. `connected_endpoints` peers the DcimEndpoint generic, which has no +# hfid, so each end names its concrete kind and upserts against the port +# created above by device plus name. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: DcimCable + data: + - label: nyc1-txp01-line-1/0/0--nyc1-rdm01-add-drop-1/1 + status: connected + cable_type: smf_os2 + length: 3 + connected_endpoints: + - kind: OtnLinePort + data: + name: line-1/0/0 + device: nyc1-txp01 + - kind: OtnRoadmAddDropPort + data: + name: add-drop-1/1 + device: nyc1-rdm01 + +--- +# The ODU hierarchy riding the 400G wavelength. The ODUC4 is the whole line +# payload; it offers 320 tributary slots, four ODU4 worth. One ODU4 carries a +# 100GbE client directly by GMP. The other multiplexes a lower-order ODU2, which +# carries an STM-64 by BMP, so the parent and child edges are exercised two levels +# deep. Slot counts are the G.709 figures: an ODU4 takes 80 slots in an ODUC4 and +# offers 80 to its own children; an ODU2 takes 8 of those. +# +# The parent is first in the list on purpose, since each child names it. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnContainer + data: + - name: oduc4-nyc1-sjc1 + description: Line payload of the 400G wavelength. + odu_type: ODUC4 + mapping_mode: GMP + segment_sequence: 1 + tributary_slots: 0 + tributary_slot_capacity: 320 + carrier: nyc1-sjc1-ch16 + service: SVC-NYC1-SJC1-0001 + - name: odu4-nyc1-sjc1-1 + description: Carries the 100GbE client directly. + odu_type: ODU4 + mapping_mode: GMP + segment_sequence: 1 + tributary_slots: 80 + tributary_slot_capacity: 0 + parent_container: oduc4-nyc1-sjc1 + client_signal: 100GBASE-LR4 + service: SVC-NYC1-SJC1-0001 + - name: odu4-nyc1-sjc1-2 + description: Multiplexes lower-order containers rather than carrying a client. + odu_type: ODU4 + mapping_mode: GMP + segment_sequence: 1 + tributary_slots: 80 + tributary_slot_capacity: 80 + parent_container: oduc4-nyc1-sjc1 + service: SVC-NYC1-SJC1-0001 + - name: odu2-nyc1-sjc1-1 + description: Carries the STM-64 client, bit-synchronously mapped. + odu_type: ODU2 + mapping_mode: BMP + segment_sequence: 1 + tributary_slots: 8 + tributary_slot_capacity: 0 + parent_container: odu4-nyc1-sjc1-2 + client_signal: STM-64 + service: SVC-NYC1-SJC1-0001 + +--- +# An ODU cross-connect at the far end, which demultiplexes the line payload and +# regroups containers rather than passing the whole thing through. That is the +# difference `switching_mode` records. +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: OtnOduSwitch + data: + - name: sjc1-odusw01 + status: active + role: core + vendor: Ciena + model: 6500-T12 + switching_mode: cross_connect + framing_latency_ns: 12000 + site: SJC1 + carriers: + - nyc1-sjc1-ch16 diff --git a/objects/extensions/routing_pim/routing_pim.yml b/objects/extensions/routing_pim/routing_pim.yml index 78838eb9..46d6b295 100644 --- a/objects/extensions/routing_pim/routing_pim.yml +++ b/objects/extensions/routing_pim/routing_pim.yml @@ -33,7 +33,7 @@ # [pim, interface]. # # GigabitEthernet0/0/0/0 through /4 are already used by other extensions' -# mock data (rack, cable, vrrp, transceiver, optical_multiplexer) -- new interfaces +# mock data (rack, cable, vrrp, transceiver) -- new interfaces # (GigabitEthernet0/0/0/5 and /0/0/0/6) are added below instead of # double-using an occupied one. They are created first, as a Component # relationship on the existing nyc1-rtr01 device (this upserts the device and diff --git a/objects/extensions/transceiver/transceiver.yml b/objects/extensions/transceiver/transceiver.yml index 8dbb2b21..d400a3c0 100644 --- a/objects/extensions/transceiver/transceiver.yml +++ b/objects/extensions/transceiver/transceiver.yml @@ -4,9 +4,6 @@ # extensions/rack (LocationRack: NYC1-RACK-01, DcimDevice: nyc1-rtr01 with # interface GigabitEthernet0/0/0/0), extensions/organization (OrganizationManufacturer: # Cisco, Dell). -# -# extensions/optical_multiplexer builds on top of extensions/transceiver in a later wave -- this file -# stays self-contained and doesn't assume dwdm data exists. # --------------------------------------------------------------------------- --- apiVersion: infrahub.app/v1