RFC: YANG: taming the autodesign
jktjkt opened this issue · 0 comments
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:
- The
tentative-link
, where only the length is known, and amplifiers can be auto-inserted at will. Think of this as a "link intention": I know I want to connect these cities which are 5000km apart, but I have no clue how many amps I need for that. GNPy, please help me design my network. - The
amplifier-placeholder
, on the other hand, connects two physicalfiber
instances together (or afiber
andtentative-link
, or even twotentative-link
s; there's probably no need for an artificial limitation). Think of it as a hut along the fiber path; GNPy can either replace that by a specific amplifier, or it can use this location to splice the two fibers. That's done via theattenuator
node.
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