Telecominfraproject / oopt-gnpy

Optical Route Planning Library, Based on a Gaussian Noise Model
http://telecominfraproject.com
BSD 3-Clause "New" or "Revised" License
204 stars 88 forks source link

RFC: YANG: taming the autodesign #442

Open jktjkt opened 2 years ago

jktjkt commented 2 years ago

Today, it might be difficult to represent a network as-is in GNPy, that is, to completely switch off any autodesign-driven transformations. Here's a YANG proposal which (I hope) will make this easier:

module: ietf-network
  +--rw networks
     +--rw network* [network-id]
        + ...
        +--rw node* [node-id]
        |  + ...
        |  +--rw (tip-topo:element)
        |     +--:(tip-topo:amplifier-placeholder)
        |     |  +--rw tip-topo:amplifier-placeholder    empty
        |     +--:(tip-topo:amplifier)
        |     |  +--rw tip-topo:amplifier
        |     |     +--rw tip-topo:model             -> /tip-pe:amplifier/tip-pe:type
        |     |     +--rw tip-topo:gain-target?      tip-pe:gain
        |     |     +--rw tip-topo:out-voa-target?   tip-pe:db-ratio
        |     |     +--rw tip-topo:tilt-target?      tip-pe:db-ratio
        |     |     +--rw tip-topo:delta-p?          tip-pe:db-ratio
        |     +--:(tip-topo:attenuator)
        |     |  +--rw tip-topo:attenuator
        |     |     +--rw tip-topo:attenuation?   tip-pe:db-ratio
        |     +--:(tip-topo:transceiver)
        |     |  +--rw tip-topo:transceiver
        |     |     +--rw tip-topo:model    -> /tip-pe:transceiver/tip-pe:type
        |     +--:(tip-topo:roadm)
        |        +--rw tip-topo:roadm
        |           +--rw tip-topo:model                              -> /tip-pe:roadm/tip-pe:type
        |           +--rw tip-topo:target-egress-per-channel-power?   tip-pe:power
        +--rw nt:link* [link-id]
           + ...
           +--rw nt:source
           |  +--rw nt:source-node?   -> ../../../nw:node/nw:node-id
           |  + ...
           +--rw nt:destination
           |  +--rw nt:dest-node?   -> ../../../nw:node/nw:node-id
           |  + ...
           +--rw (tip-topo:link-type)?
              +--:(tip-topo:tentative-link)
              |  +--rw tip-topo:tentative-link
              |     +--rw tip-topo:type      -> /tip-pe:fiber/tip-pe:type
              |     +--rw tip-topo:length    decimal64
              +--:(tip-topo:fiber)
              |  +--rw tip-topo:fiber
              |     +--rw tip-topo:type              -> /tip-pe:fiber/tip-pe:type
              |     +--rw tip-topo:length            decimal64
              |     +--rw tip-topo:loss-per-km?      decimal64
              |     +--rw tip-topo:attenuation-in?   tip-pe:db-ratio
              |     +--rw tip-topo:conn-att-in?      tip-pe:db-ratio
              |     +--rw tip-topo:conn-att-out?     tip-pe:db-ratio
              |     +--rw tip-topo:raman!
              |        +--rw tip-topo:temperature    uint16
              |        +--rw tip-topo:pump* [frequency]
              |           +--rw tip-topo:frequency    tip-pe:frequency-raman-pump
              |           +--rw tip-topo:power        tip-pe:power
              |           +--rw tip-topo:direction    enumeration
              +--:(tip-topo:patch)
                 +--rw tip-topo:patch
                    +--rw tip-topo:roadm-target-egress-per-channel-power?   tip-pe:power

As usual, the network consists of nodes and links. Unlike today's GNPy, though, some interesting "GNPy elements" are no longer represented as nodes, but they become links. A prime example is the Fiber element.

Some constructs are wroth a special attention. The fiber element now corresponds to a real-world fiber, i.e., something which is already known to exist. Its length and attenuation is already known, and GNPy won't be allowed to split this fiber into smaller chunks. If the automatic splitting is desirable, then there are two options:

Another difference compared to today's GNPy-JSON is fiber vs. patch. The features currently supported by the Fused GNPy element (which is a node in GNPy's internal network representation) will be handled either by the patch (as a graph edge, for joining, e.g., two ROADMs together), or by the the attenuator node.

This proposal does not require ports, but there are some hacks (such as the ROADM's per-degree options which are presently implemented inside a patch, which looks a bit ugly) which might warrant using ports. If we do that, though, we might as well introduce "bidirecitonal nodes" (i.e., a node which has both east-to-west and west-to-east EDFA).

Also, this will need a set of heuristics when opening a legacy-style JSON file. I'm trying to solve some ambiguities in the existing format, and that might make it rather hard to support a full legacy-JSON → YANG-JSON → legacy-JSON round trip.

Thoughts, opinions?

Cc: @sme791, @AndreaDAmico