RFC 8795

YANG Data Model for Traffic Engineering (TE) Topologies

πŸ“… published August 2020, from ietf

RFC 8795: YANG Data Model for Traffic Engineering (TE) Topologies ✨

Part 1 of 36, more to come bestie 🫢

Okay, the title block is the tea β˜•. RFC 8795 is a Standards Track document from the IETF, with ISSN 2070-1721, dated August 2020. The authors are X. Liu (Volta Networks), I. Bryskin (Futurewei Technologies, Inc.), V. Beeram and T. Saad (both Juniper Networks), H. Shah (Ciena), and O. Gonzalez de Dios (Telefonica). The title block doesn't list anything it obsoletes or updates, so it's standing on its own πŸ’…

Abstract

This doc defines a YANG data model for representing, retrieving, and manipulating Traffic Engineering (TE) Topologies 🌸 The model is a base model, so other technology-specific TE topology models can augment it and build on top. Main character base model energy πŸ‘‘

Status of This Memo

Real talk, this is an Internet Standards Track document ✨

This document comes from the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community, received public review, and got approved for publication by the Internet Engineering Steering Group (IESG). If you want more on Internet Standards, check out Section 2 of RFC 7841 πŸ“š

For the current status, any errata, and where to send feedback, head to https://www.rfc-editor.org/info/rfc8795 πŸ¦‹

Copyright (c) 2020 IETF Trust and the persons identified as the document authors. All rights reserved. πŸ”’

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as they stand on the date of publication. Please actually read these, bestie, because they spell out your rights and restrictions for this document 🫢 Any Code Components pulled out of this document have to include Simplified BSD License text, as described in Section 4.e of the Trust Legal Provisions, and they come without warranty, as described in the Simplified BSD License.


Table of Contents πŸ—ΊοΈ

   1.  Introduction
     1.1.  Terminology
     1.2.  Tree Structure
     1.3.  Prefixes in Data Node Names
   2.  Characterizing TE Topologies
   3.  Modeling Abstractions and Transformations
     3.1.  TE Topology
     3.2.  TE Node
     3.3.  TE Link
     3.4.  Transitional TE Link for Multi-layer Topologies
     3.5.  TE Link Termination Point (LTP)
     3.6.  TE Tunnel Termination Point (TTP)
     3.7.  TE Node Connectivity Matrix
     3.8.  TTP Local Link Connectivity List (LLCL)
     3.9.  TE Path
     3.10. TE Inter-layer Lock
     3.11. Underlay TE Topology
     3.12. Overlay TE Topology
     3.13. Abstract TE Topology
   4.  Model Applicability
     4.1.  Native TE Topologies
     4.2.  Customized TE Topologies
     4.3.  Merging TE Topologies Provided by Multiple Providers
     4.4.  Dealing with Multiple Abstract TE Topologies Provided by
           the Same Provider
   5.  Modeling Considerations
     5.1.  Network Topology Building Blocks
     5.2.  Technology-Agnostic TE Topology Model
     5.3.  Model Structure
     5.4.  Topology Identifiers
     5.5.  Generic TE Link Attributes
     5.6.  Generic TE Node Attributes
     5.7.  TED Information Sources
     5.8.  Overlay/Underlay Relationship
     5.9.  Templates
     5.10. Scheduling Parameters
     5.11. Notifications
   6.  Guidance for Writing Technology-Specific TE Topology
           Augmentations
   7.  TE Topology YANG Module
   8.  Security Considerations
   9.  IANA Considerations
   10. References
     10.1.  Normative References
     10.2.  Informative References
   Appendix A.  Complete Model Tree Structure
   Appendix B.  Companion YANG Data Model for Non-NMDA-Compliant
           Implementations
     B.1.  TE Topology State YANG Module
   Appendix C.  Example: YANG Data Model for Technology-Specific
           Augmentations
   Acknowledgments
   Contributors
   Authors' Addresses

1. Introduction ✨

Okay so the Traffic Engineering Database (TED) is an essential piece of Traffic Engineered (TE) systems that are based on MPLS-TE [RFC2702] and GMPLS [RFC3945]. It's basically a collection of all the TE info about all the TE nodes and TE links in the network 🧠 A TE topology is the schematic arrangement of TE nodes and TE links sitting in a given TED. A single TE system can have one or more TE topologies, and a TE topology is the thing path computational algorithms actually run on to compute TE paths. Iconic ✨

This document defines a YANG data model [RFC7950] for representing, retrieving, and manipulating TE topologies. The model holds technology-agnostic TE topology building blocks, which other technology-specific TE topology models can augment and reuse πŸ¦‹

1.1. Terminology

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here πŸ’œ Those are the only capital-letter keywords with that special meaning, so keep an eye out for them.

We assume you already know the general body of work in currently available RFCs about Traffic Engineering. If you're newer to that, [RFC7926] is a good starting point 🌈

Some key terms used in this doc:

  • TED: The Traffic Engineering Database (TED) is a collection of all TE info about all TE nodes and TE links in a given network.
  • TE topology: The TE topology is a schematic arrangement of TE nodes and TE links in a given TED. It forms the basis for a graph suitable for TE path computations.
  • Native TE topology: A Native TE topology is a topology that is native to a given provider network. A Native TE topology could be discovered via various routing protocols and/or subscribe/publish techniques. This is the topology on which path computational algorithms are run to compute TE paths.
  • Customized TE topology: A Customized TE topology is a custom topology that a provider makes for a given client. It typically makes abstractions on the provider's Native TE topology and gets handed to the client. The client receives the Customized TE topology and merges it into the client's own Native TE topology. The client's path computational algorithms aren't typically run on the Customized TE topology. They run on the client's Native TE topology after the merge πŸŽ€

1.2. Tree Structure

Want a simplified picture of the data model? It's in Appendix A of this document 🌳 The tree format from [RFC8340] is used for the YANG data model tree representation.

1.3. Prefixes in Data Node Names

In this document, names of data nodes and other data model objects get a prefix from the standard prefix tied to the matching YANG imported modules, as shown in Table 1 πŸ“

             +==========+=======================+===========+
             | Prefix   | YANG Module           | Reference |
             +==========+=======================+===========+
             | yang     | ietf-yang-types       | [RFC6991] |
             +----------+-----------------------+-----------+
             | inet     | ietf-inet-types       | [RFC6991] |
             +----------+-----------------------+-----------+
             | nw       | ietf-network          | [RFC8345] |
             +----------+-----------------------+-----------+
             | nt       | ietf-network-topology | [RFC8345] |
             +----------+-----------------------+-----------+
             | te-types | ietf-te-types         | [RFC8776] |
             +----------+-----------------------+-----------+

             Table 1: Prefixes and Corresponding YANG Modules

2. Characterizing TE Topologies πŸ”

The data model in this doc takes these characteristics of TE topologies into account:

  • The TE topology is an abstract control-plane representation of the data-plane topology 🧚 So attributes specific to the data plane must make their way into the corresponding TE topology modeling. The TE topology is made of dynamic autodiscovered data and fairly static data tied to data-plane nodes and links. The dynamic stuff, like unreserved bandwidth available on data-plane links, can change a lot. The static stuff, like layer network identification, switching and adaptation capabilities and limitations, fate-sharing, and administrative colors, barely ever changes. A single TE topology can cover TE info at multiple switching layers, which is so iconic.
  • TE topologies are protocol independent 🫢 Info about topological elements may be learned via link-state protocols, but the topology can exist without depending on any particular protocol.
  • The TE topology may not be congruent with the routing topology in a given TE system. The routing topology is built from routing adjacencies, and there isn't always a one-to-one match between a TE link and a routing adjacency. For example, a TE link between a pair of nodes doesn't necessarily mean there's a routing adjacency between those nodes. To learn more, see [TEAS-TOPO] and [YANG-L3] πŸ™ˆ
  • Each TE topological element has at least one information source attached to it. In some scenarios, a given topological element could have more than one information source πŸ’…
  • TE topologies can be hierarchical πŸͺœ Each node and link of a given TE topology can be associated with a respective underlay topology. That means each node and link can be tied to an independent stack of supporting TE topologies.
  • TE topologies can be customized ✨ A network provider can present TE topologies of a given network to its client, customized on a per-client-request basis. The customization could be done by the provider, by the client, or through provider/client negotiation. The relationship between a customized topology and the provider's native topology could be captured as hierarchical (overlay/underlay), but otherwise the two topologies are decoupled from each other. The customized topology is what the client sees, while the provider's native topology is known in its entirety only to the provider itself πŸ‘‘

3. Modeling Abstractions and Transformations πŸ¦‹

3.1. TE Topology

A TE topology is a Traffic Engineering representation of one or more layers of network topologies 🌸 It's made up of TE nodes (TE graph vertices) connected via TE links (TE graph edges). A TE topology gets mapped to a TE graph, periodt πŸ’–

3.2. TE Node 🧚

okay so a TE node is an element of a TE topology, and it shows up as a vertex on a TE graph πŸ¦‹ It can stand in for one or several nodes, or even just a fraction of a node, and that node can be a switch or router that's physical or virtual. A TE node belongs to exactly one TE topology and is fully defined there. It gets a unique ID within the TE topology scope πŸ’… Its attributes cover the data-plane side of the associated node(s), like the connectivity matrix, plus configuration data like the TE node name. A given TE node can be reached on the TE graph over any of the TE links that terminate on it ✨

multi-layer TE nodes are the iconic example here πŸ‘‘ A single physical node that switches at multiple network layers can be split up into several logical TE nodes, each one a fraction of that physical node. Some of those logical TE nodes live in the client-layer TE topology, and the rest belong to the server-layer TE topology 🫢

In Figure 1, Node-1, Node-2, and Node-3 are TE nodes 🌸

                                | +---+          __
                                | |   | TE Node  \/ TTP  o LTP
                                | +---+
                                |
                                | ----- TE Link
                                | ***** Node Connectivity Matrix,
                                |       TTP Local Link Connectivity
                                | @@@@@ TE Tunnel
                                o----------------------------------

      Node-1                                            Node-3
   +------------+                                    +------------+
   |    TTP-1   |                                    |    TTP-1   |
   |LTP  __     |           TE-Tunnel-1              |     __     |
   |-6   \/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\/     |
   o    *  *    oLTP-1           Node-2         LTP-6o    *  *    o
   |   *    *   |           +------------+           |   *    *   |
   |  * TTP-2*  |           |            |           |  * TTP-2*  |
   | *   __   * |LTP-2 LTP-6|            |LTP-1 LTP-5| *   __   * |
   o*    \/    *o-----------o************o-----------o*    \/    *o
   |LTP *  *    | Link-12   |          * | Link-23   |    *  *    |
   |-5 *    *   |      LTP-5|        *   |LTP-2      |   *    *   |
   +--o------o--+           o************o           +--o------o--+
    LTP-4  LTP-3            | *   *    * |            LTP-4  LTP-3
                            |  **     *  |
                            +--o------o--+
                             LTP-4  LTP-3

   LTP: Link Termination Point
   TTP: Tunnel Termination Point

                Figure 1: TE Topology Modeling Abstractions

a TE link is an element of a TE topology, drawn as an edge on a TE graph πŸ’œ The arrows on an edge show one or both directions of the TE link. When you've got a pair of parallel links going in opposite directions, an edge without arrows gets used too ✨ A TE link can represent one or several (physical) links, or just a fraction of a link. Like TE nodes, it belongs to exactly one TE topology and is fully defined there, and it gets a unique ID within the TE topology scope 🧚 Its attributes include data-plane parameters tied to the associated link(s), such as unreserved bandwidth and resource maps / resource pools, plus configuration data like remote node IDs / link IDs, Shared Risk Link Groups (SRLGs), and administrative colors. A TE link connects to a TE node by terminating on it via exactly one TE Link Termination Point (LTP) 🫢

In Figure 1, Link-12 and Link-23 are TE links πŸ“

okay this one is giving multi-layer realness 🌈 Networks are usually built from multiple network layers, where one or more client-layer signals can be multiplexed and encapsulated into a server-layer signal [RFC5212] [G.805]. That server-layer signal can travel through the server-layer network across multiple nodes, until it gets terminated, and then the client-layer signals reappear at the node that terminates it. Examples of multi-layer networks include (1) IP over MPLS over Ethernet and (2) low-order Optical Data Unit-k (ODUk) signals multiplexed into a high-order ODUl (l>k) carried over an Optical Channel (OCh) signal in an Optical Transport Network (OTN), as defined in [G.872] and [G.709] πŸ’…

TE links from Section 3.3 can be used to represent links within a network layer. But in a multi-layer network, TE nodes and TE links only let you represent each network layer as a separate TE topology 😭 Each of those single-layer TE topologies would be isolated from its client and server-layer TE topologies, if those are present. The highest network layer and the lowest network layer in the hierarchy only have a single adjacent layer below or above, respectively. Multiplexing client-layer signals and encapsulating them into a server-layer signal requires a function that's provided inside a node (typically realized in hardware). This function is also called "layer transition" πŸ”₯

One of the key requirements for path computation is being able to calculate a path between two endpoints across a multi-layer network, based on the TE topology that represents that network. So an extra TE construct is needed to represent potential layer transitions in the multi-layer TE topology, connecting the TE topologies that represent each separate network layer πŸ‘‘ That's the transitional TE link! It represents the layer transition function inside a node that's decomposed into multiple logical nodes, which are represented as TE nodes (also see [G.8080] for the definition of a transitional link for the OTN). Basically, a transitional TE link connects a client-layer node with a server-layer node 🧚

Here's the tea: a TE link from Section 3.3 has LTPs of exactly the same kind on each link end. The transitional TE link is different. It has client-layer LTPs on the client side and, in most cases, a single server-layer LTP on the server side 🌸 It should be noted that transitional links are a helper construct in the multi-layer TE topology, and they only exist as long as they're not in use, since they represent potential connectivity πŸ™ˆ When the server-layer trail has been established between the server-layer LTP of two transitional links in the server-layer network, the resulting client-layer link in the data plane will be represented as a normal TE link in the client-layer topology ✨ The transitional TE links will reappear once that server-layer trail has been torn down πŸ’œ

                                |                 |
                                | +---+          ---
                                | |   | TE Node  \ / Transitional
                                | +---+           |  Link
                                |
                                | ----- Client-Layer Link
                                | ===== Server-Layer Link
                                | ***** Layer Boundary
                                o----------------------------------

      +-------------------+
      | +-------+         |                          +-------+
   -----|Client-|------+  |             Client- -----|Client-|
      | |Layer  |---+  |  |             Layer        |Layer  |
   -----|Switch |-+ |  |  |             Links   -----|Node   |
      | +------ + | |  |  |                          +-------+
      |           | |  |  | Client                    | |  |
      |           | | ---_| Layer                     --- ---
   ***|***********|*| \ /*|***************************\ /*\ /****
      |           ---  |  | Server       Transitional  |   |
      |    Layer  \ /  |  | Layer               Links  |   |
      |    Term.   |   |  |                            |   |
      |            |   |  |                            |   |
      |         +-------+ |                          +-------+
   =============|Server-|=====           Server- ====|Server-|====
      |         |Layer  | |              Layer       |Layer  |
   =============|Switch |=====           Links   ====|Node   |====
      |         +-------+ |                          +-------+
      +-------------------+

       Physical Node View                       TE Topology View

         Figure 2: Modeling a Multi-layer Node (Dual-layer Example)

A TE Link Termination Point (LTP) is a conceptual point of connection of a TE node to one of the TE links, terminated by the TE node πŸŽ€ The cardinality between an LTP and the associated TE link is 1:0..1.

In Figure 1, Node-2 has six LTPs: LTP-1 through LTP-6 πŸ“

3.6. TE Tunnel Termination Point (TTP) 🌈

A TE Tunnel Termination Point (TTP) is an element of a TE topology representing one or several potential transport service termination points (i.e., service client adaptation points, such as a WDM/OCh transponder) πŸ’– ("WDM" stands for "Wavelength Division Multiplexing".) A TTP is associated with (hosted by) exactly one TE node. It gets a unique ID within the TE node scope 🫢 Depending on the TE node's internal constraints, a given TTP hosted by the TE node could be accessed via one, several, or all of the TE links terminated by the TE node 🧚

In Figure 1, Node-1 has two TTPs: TTP-1 and TTP-2 🌸

3.7. TE Node Connectivity Matrix πŸ’…

A TE node connectivity matrix is a TE node's attribute describing the TE node's switching limitations, in the form of valid switching combinations of the TE node's LTPs (see below) πŸ”₯ From the point of view of a potential TE path arriving at the TE node at a given inbound LTP, the node's connectivity matrix describes the valid (permissible) outbound LTPs from which the TE path can leave the TE node πŸ‘‘

In Figure 1, the connectivity matrix on Node-2 is as follows:

{<LTP-6, LTP-1>, <LTP-5, LTP-2>, <LTP-5, LTP-4>, <LTP-4, LTP-1>,
<LTP-3, LTP-2>}

A TTP Local Link Connectivity List (LLCL) is a list of TE links terminated by the TE node hosting a TTP, to which the TTP could be connected 🌈 From the point of view of the potential TE path of a connection, an LLCL provides a list of valid TE links the TE path needs to start/stop on for the connection to be successfully terminated on a TTP πŸ’œ

In Figure 1, the LLCL on Node-1 is as follows:

{<TTP-1, LTP-5>, <TTP-1, LTP-2>, <TTP-2, LTP-3>, <TTP-2, LTP-4>}

3.9. TE Path πŸ’–

A TE path is an ordered list of TE links and/or TE nodes on the TE topology graph, and this path interconnects a pair of TTPs to be used by a potential connection πŸŽ€ For example, TE paths could be a product of successful path computation performed for a given transport service ✨

In Figure 1, the TE path for TE-Tunnel-1 is as follows:

{Node-1:TTP-1, Link-12, Node-2, Link-23, Node-3:TTP-1}

3.10. TE Inter-layer Lock ✨

okay so a TE inter-layer lock is the modeling concept that describes how the client layer and the server layer are connected by adaptation πŸ”— and why it matters for multi-layer Traffic Engineering πŸ’…. It's a group of M client-layer LTPs and N server-layer TTPs, and inside that group, data arriving at any of the client-layer LTPs could be adopted onto any of the server-layer TTPs πŸ¦‹. Each lock gets an inter-layer lock ID, and that ID is unique across all TE topologies from the same provider πŸŽ€. Every client-layer LTP and server-layer TTP in a given lock is tagged with the same inter-layer lock ID attribute, and that's the whole secret handshake 🀫

Figure 3 is giving main character energy πŸ‘‘. Inter-layer lock IL-1 links six client-layer LTPs (C-LTP-1 through C-LTP-6) to two server-layer TTPs (S-TTP-1 and S-TTP-2). They all carry the attribute TE inter-layer lock ID IL-1, and that tag is the only thing that shows they're connected 🌸

                                | +---+          __
                                | |   | TE Node  \/ TTP  o LTP
                                | +---+
                                |
                                | ----- TE Link
                                | ***** TTP Local Link Connectivity
                                o----------------------------------

             (IL-1) C-LTP-1 +------------+   C-LTP-2 (IL-1)
                    --------O   (IL-1)   O--------
             (IL-1) C-LTP-3 |   S-TTP-1  |   C-LTP-4 (IL-1)
                    --------O     __     0--------
             (IL-1) C-LTP-5 |    *\/*    |   C-LTP-6 (IL-1)
                    --------O   *    *   O--------
                            |  *(IL-1)*  |
                    S-LTP-3 | * S-TTP-2* |   S-LTP-4
                    --------o*    __    *o--------
                            |    *\/*    |
                            |   *    *   |
                            +--o------o--+
                       S-LTP-1 |      | S-LTP-2

               Figure 3: TE Inter-layer Lock ID Associations

Now the multi-ID stuff is where it gets spicy 🌢️ A given LTP can have zero, one, or more inter-layer lock IDs. If it has several, the data arriving there can be adopted onto any TTP tied to all of those locks 🧩 For example, C-LTP-1 could carry both IL-1 and IL-2. That means C-LTP-1 can use not just the TTPs in IL-1 (S-TTP-1 and S-TTP-2 in the figure) but also any TTP in IL-2 πŸ’–

On the flip side, a TTP can have one or more inter-layer lock IDs too. That means it can offer the adaptation service to any client-layer LTP whose inter-layer lock ID matches one of its own ✨ Each TTP also has an unreserved adaptation bandwidth attribute, which just announces how many adaptation resources it still has left to share between all the potential client-layer LTPs 🫢

LTPs and TTPs in the same lock can live on the same hybrid, multi-layer TE node, or on multiple TE nodes in the same or different TE topologies 🌈 The "different topologies" case is the big one, because TE topologies for different layer networks can be modeled as separate augmentations of the basic TE topology model that all layers share 🀯

3.11. Underlay TE Topology 🧱

An underlay TE topology is a TE topology that acts as the base for building overlay TE topologies. It's the foundation, bestie πŸ—οΈ

3.12. Overlay TE Topology πŸͺ„

An overlay TE topology is a TE topology built on top of one or more underlay TE topologies. Each TE node in the overlay stands for an arbitrary segment of an underlay TE topology, and each TE link in the overlay stands for an arbitrary TE path in one of the underlay TE topologies πŸ¦‹ The overlay and its underlays can be different layer networks (for example, OTN/ODUk and WDM/OCh, respectively) or the same layer network. Both are valid, no cap 🧁

3.13. Abstract TE Topology 🎭

An abstract TE topology is a topology made of abstract topological elements: nodes, links, and TTPs πŸ’… It's an overlay TE topology that a topology provider creates for its client. It's customized from one or more of the provider's Native TE topologies (underlay TE topologies), the provider's policies, and the client's preferences πŸ“ For instance, a first-level topology provider (like a domain controller) can build an abstract TE topology for its client (say, a multi-domain service coordinator) using some of its Native TE topologies, local policies or profiles, and the client's TE topology configuration requests 🌸

Figure 4 shows an example of an abstract TE topology πŸ‘€

                                | +---+
                                | |   | TE Node
                                | +---+
                                | ----- TE Link
                                o----------------------------------

     +---+              +---+
     |S3 |              |S5 |
     +---+\           / +---+
           \         /
            \       /
             \+---+/                +---+
             /|AN1|\----------------|S8 |
            / +---+ \               +---+
     +---+ /         \ +---+
     |S9 |             |S11|
     +---+             +---+
           Abstract TE Topology

            +---+                    +---+
            |S1 |--------------------|S2 |
            +---+                    +---+
             /                          \
            /                            \
     +---+ /                  +---+       \ +---+
     |S3 |--------------------|S4 |---------|S5 |
     +---+\                   +---+         +---+
           \                      \             \
            \                      \             \
             \+---+                 +---+         +---+
             /|S6 |\                |S7 |---------|S8 |
            / +---+ \               +---+\       /+---+
     +---+ /         \ +---+              +---+ /
     |S9 |-------------|S10|--------------|S11|/
     +---+             +---+              +---+
           Native TE Topology

                       Figure 4: Abstract TE Topology

4. Model Applicability πŸŽ€

4.1. Native TE Topologies 🌷

The model in this document can be used to represent and retrieve Native TE topologies on a given TE system πŸ’–

Check out Figure 5 πŸ” R1 through R9 are nodes that represent routers. An implementation MAY choose to build a Native TE topology using all of the nodes and links in the given TED, like in Figure 6. The data model defined in this document can be used to represent and retrieve that TE topology 🧚

                                | +---+
                                | |   | TE Node
                                | +---+
                                | ----- TE Link
                                o----------------------------------

     +---+       +---+        +---+         +---+         +---+
     | R1|-------| R2|--------| R3|---------| R4|---------| R5|
     +---+       +---+        +---+         +---+         +---+
       |                      /   \         /   \         /
       |                     /     \       /     \       /
       |                    /       \     /       \     /
       |                   /         \   /         \   /
       |                  /           \ /           \ /
     +---+             +---+         +---+         +---+
     | R6|-------------| R7|         | R8|---------| R9|
     +---+             +---+         +---+         +---+

                     Figure 5: Example Network Topology

          ---------------
          | Native      |                   |  [ ] TE Node
          | TE Topology |                   |  +++ TE Link
          ---------------                   o--------------

      [R1] ++++ [R2] ++++ [R3] ++++ [R4] ++++ [R5]
        +                +    +    +    +    +
        +               +      +  +      +  +
        +              +        ++        ++
      [R6] +++++++++ [R7]      [R8] ++++ [R9]

              Figure 6: Native TE Topology as Seen on Node R3

Now let's say the topology is split so that some nodes use OSPF-TE while others use ISIS-TE (Figure 7) πŸŒ— An implementation MAY choose to build separate TE topologies based on the information source. The Native TE topologies built using only the nodes and links learned from one specific information source are shown in Figure 8 🫧 The data model defined in this document can be used to represent and retrieve these TE topologies too πŸ’œ

                                     :
   TE Info Distributed via ISIS-TE   :  TE Info Distributed via OSPF-TE
                                     :
          +---+       +---+        +---+         +---+         +---+
          | R1|-------| R2|--------| R3|---------| R4|---------| R5|
          +---+       +---+        +---+         +---+         +---+
            |                      / : \         /   \         /
            |                     /  :  \       /     \       /
            |                    /   :   \     /       \     /
            |                   /    :    \   /         \   /
            |                  /     :     \ /           \ /
          +---+             +---+    :    +---+         +---+
          | R6|-------------| R7|    :    | R8|---------| R9|
          +---+             +---+    :    +---+         +---+
                                     :

                  Figure 7: Example Split Network Topology

           -----------------------   :  -----------------------
           |Native TE Topology   |   :  |Native TE Topology   |
           |Info-Source: ISIS-TE |   :  |Info-Source: OSPF-TE |
           -----------------------   :  -----------------------
                                     :
            [R1] ++++ [R2] ++++ [R3] : [R3'] ++++ [R4] ++++ [R5]
             +                +      :      +    +    +    +
             +               +       :       +  +      +  +
             +              +        :        ++        ++
            [R6] +++++++++ [R7]      :       [R8] ++++ [R9]

             Figure 8: Native TE Topologies as Seen on Node R3

Last but not least 🌈 the data model can also represent and retrieve a TE topology built using only the nodes and links that belong to one particular technology layer. The data model is flexible enough to handle lots of these Native TE topologies πŸ¦‹πŸ«Ά

4.2. Customized TE Topologies ✨

okay so a Customized TE topology is basically a topology the provider tweaked just for one client πŸ’… The provider does it to match that client's needs or preferences. This model can represent, retrieve, and manipulate Customized TE topologies, so the provider can show the network in abstract TE terms on a per-client basis πŸŽ€ These custom topologies have enough info for the client to compute and pick paths based on its own policies. Iconic, honestly 😭

Let's look at Figure 9 πŸ¦‹ This is a super typical packet optical transport setup: the WDM-layer network domain acts as a server network domain, giving transport connectivity to the packet-layer network domain (the client network domain). R1, R2, R3, and R4 are IP routers hooked up to an optical WDM transport network, and A, B, C, D, E, and F are the WDM nodes that make up the server network domain 🌈

                                  | +---+            /-\
                                  | |   | Router    (   ) WDM
                                  | +---+ Node       \-/  Node
                                  |
                                  o----------------------------

     +---+        /-\          /-\           /-\          +---+
     | R1|-------( A )--------( C )---------( E )---------| R3|
     +---+        \-/          \-/           \-/          +---+
                              /   \         /   \
                             /     \       /     \
                            /       \     /       \
                           /         \   /         \
                          /           \ /           \
         +---+          /-\           /-\           /-\          +---+
         | R2|---------( B )---------( D )---------( F )---------| R4|
         +---+          \-/           \-/           \-/          +---+

                 Figure 9: Example Packet Optical Topology

So the goal here is to beef up the client's TE topology with a Customized TE topology from the WDM network πŸ“ Given the paths A-E, B-F, and B-E (see Figure 10), the client gets a Customized TE topology like the one in Figure 11 ✨ That gets merged with the client's Native TE topology, and the end result is Figure 12. Main character energy for real πŸ‘‘

                                            | *****  B-F WDM Path
                                            | @@@@@  B-E WDM Path
                                            | $$$$$  A-E WDM Path
                                            o--------------------

     +---+        /-\ $$$$$$$$ /-\ $$$$$$$$$ /-\          +---+
     | R1|-------( A )--------( C )---------( E )---------| R3|
     +---+        \-/         @\-/ @@@@@@@@@ \-/          +---+
                             @/   \         /   \
                            @/     \       /     \
                           @/       \     /       \
                          @/         \   /         \
                         @/           \ /           \
         +---+          /-\ ********* /-\ ********* /-\          +---+
         | R2|---------( B )---------( D )---------( F )---------| R4|
         +---+          \-/           \-/           \-/          +---+

                Figure 10: Paths within the Provider Domain
                 ++++++++ [A] ++++++++++++++++++++ [E] +++++++++
                                              +++++
                                          ++++
                                      ++++
                                  ++++
                              ++++
                 ++++++++ [B] ++++++++++++++++++++ [F] +++++++++

          Figure 11: Customized TE Topology Provided to the Client
            [R1] ++++++++ [A] ++++++++++++++++++++ [E] +++++++++ [R3]
                                              +++++
                                          ++++
                                      ++++
                                  ++++
                              ++++
            [R2] ++++++++ [B] ++++++++++++++++++++ [F] +++++++++ [R4]

               Figure 12: Customized TE Topology Merged with
                      the Client's Native TE Topology

The data model in this document can be used to represent, retrieve, and manipulate the Customized TE topology shown in Figure 11 πŸ¦‹

Now, a Customized TE topology is not necessarily an abstract TE topology πŸ™ˆ The provider might make an abstract TE topology of some type (like a single-abstract-node-with-connectivity-matrix topology, or a border-nodes-connected-via-mesh-of-abstract-links topology, etc.) and expose it to all or some clients, expecting them to use it as-is without any customizing πŸ’œ On the other hand, a client can ask for a customized version of the provider's Native TE topology. For example, it could ask to remove TE links that belong to certain layers, are too slow, aren't protected, and/or have a certain affinity 🧚 Note that the resulting TE topology won't be abstract (since it won't contain abstract elements), but it will be customized, because it was modified based on the client's instructions ✨

The client ID field in the TE topology identifier (Section 5.4) tells you which client the TE topology is customized for 🫢 Here's the tea: an authorized client MAY receive a TE topology whose client ID field matches some other client, BUT the client can only customize TE topologies where the client ID field is either set to 0 or matches its own ID πŸ’€ And if the client starts reconfiguring a topology, its client ID gets automatically set in the topology ID field for all future configurations and updates on that topology. Lowkey genius 🌸

The provider can also set its own ID in the client ID field of the topology ID, and by doing that it MAY tell the client that a given TE topology cannot be renegotiated πŸ”’

Even though this data model lets you access TE topology information across clients, implementations MAY restrict access for particular clients to particular data fields πŸ“ The Network Configuration Access Control Model (NACM) [RFC8341] is one mechanism that provides exactly that. Iykyk, and now you do too πŸ’–

4.3. Merging TE Topologies Provided by Multiple Providers ✨

okay so a client can get TE topologies from multiple providers, and each provider runs its own piece of a multi-domain network 🧩. To actually use them, the client has to merge everything into one or more of its own Native TE topologies, and each merged one should show the whole multi-domain network in the same consistent way πŸ’…. That's what lets the client pick end-to-end TE paths for services that cross several domains πŸ¦‹

here's what merging involves πŸ‘€

  • Finding the neighboring domains and locking their topologies horizontally by connecting their inter-domain open-ended TE links πŸ”—
  • Renaming TE node IDs, link IDs, and SRLG IDs so they get IDs from a separate namespace 🏷️ this matters because every TE topology is basically independent, so TE node IDs, link IDs, or SRLG IDs can clash 😭
  • Locking TE topologies from different layer networks vertically, based on the topology inter-layer locks the providers gave, so inter-layer path computations work across several TE topologies from the same topology provider πŸŽ€

Figure 13 shows the client merging the TE topologies its providers handed over 🌈

     /---\      +---+    +---+      +---+    +---+      /---\
     |C11|------|S13|----|S15|------|S23|----|S25|------|C21|
     \---/      +---+\   +---+      +---+   /+---+      \---/
                      \                    /
                       \                  /
                        \+---+      +---+/   +---+      /---\
                         |S18|------|S24|    |S28|------|C22|
                         +---+      +---+\  /+---+      \---/
                                          \/
                                          /\
     /---\      +---+    +---+      +---+/  \+---+      /---\
     |C12|------|S19|----|S17|------|S29|----|S27|------|C23|
     \---/      +---+    +---+      +---+    +---+      \---/

        Domain 1 TE Topology             Domain 2 TE Topology

             +---+    +---+                  +---+    +---+
        -----|S13|----|S15|----          ----|S23|----|S25|----
             +---+\   +---+                  +---+   /+---+
                   \                                /
                    \                              /
                     \+---+                  +---+/   +---+
                      |S18|----          ----|S24|    |S28|----
                      +---+                  +---+\  /+---+
                                                   \/
                                                   /\
             +---+    +---+                  +---+/  \+---+
        -----|S19|----|S17|----          ----|S29|----|S27|----
             +---+    +---+                  +---+    +---+

            Figure 13: Merging Domain TE Topologies: An Example

in Figure 13, each of the two providers serves the client's (abstract or Native) TE topology, describing the part of the network it controls 🏰. The client looks at things like inter-domain plug IDs or remote TE node IDs / link IDs (as the TE topology model defines them) and can figure out two things πŸ•΅οΈβ€β™€οΈ

  1. the two domains are next to each other and linked by three inter-domain TE links, and
  2. each domain hooks up to a different customer site: the one on the left connects to customer devices C11 and C12, and the one on the right connects to C21, C22, and C23.

so the client connects the open-ended TE links, like the upper part of the figure shows 🫢

okay so there's a way to connect the open-ended inter-domain TE links of neighboring domains: the providers could be required to include a remote node ID / link ID attribute on their inter-domain TE links πŸ“. but ngl that's not very flexible πŸ™ƒ the providers might not even know those remote IDs, and it also doesn't let the client mix and match multiple topologies from the same providers (more on that below) 😀. the better option is to tag the links with the inter-domain plug ID attribute πŸ”Œ. the inter-domain plug ID is a number that's unique across the whole network and identifies the connection that supports a given inter-domain TE link ✨. instead of a remote node ID / link ID, an inter-domain TE link can carry a non-zero inter-domain plug ID πŸ’œ. two neighboring domain topologies from different providers should each have at least one open-ended inter-domain TE link whose plug ID matches one the neighbor provides 🀝. for example, the inter-domain TE link starting at node S15 in the Domain 1 TE topology (Figure 13) and the one coming from node S23 in the Domain 2 TE topology could both use the same plug ID (e.g., 175344) 🎯. this lets the client spot the adjacent nodes in the two neighboring TE topologies and tie their inter-domain TE links together, no matter what their node IDs / link IDs are (which, like we said, could come from totally separate namespaces) 🌸. plug IDs might be assigned and managed by a central network authority πŸ›οΈ. or they could be autodiscovered on the fly, for example with the Link Management Protocol (LMP) πŸ”

the client also renames the TE nodes, links, and SRLGs in the abstract TE topologies, giving them IDs from a separate namespace that the client manages itself 🏷️✨. this renaming is needed because the two abstract TE topologies can each have their own namespace, and those namespaces are generally independent, so overlaps are possible πŸ’€. for example, both TE topologies have a TE node called S7, and after renaming they show up in the merged TE topology as S17 and S27 πŸ™ˆ

once merging is done, the client can use the merged TE topology to compute paths across both domains, like finding a TE path from C11 to C23 πŸš€πŸ’–

4.4. Dealing with Multiple Abstract TE Topologies Provided by the Same Provider πŸ’…

depending on local configuration, templates, and/or policies the client pushed, a single provider might show the client more than one abstract TE topology 🌈. for instance, one could be optimized for lowest cost, another for the best possible delay metrics, and yet another for maximum bandwidth availability for the client's services πŸ’Έβš‘. the client can also ask some or all providers to expose extra abstract TE topologies, maybe of a different type and/or optimized in a different way from the ones already provided 🧠. either way, the client should be ready for a provider to offer more than one abstract TE topology 🫢

it's up to the client to decide how to mix and match the multiple abstract TE topologies from each provider (or some of them), and how to merge them into the client's Native TE topologies πŸ‘‘. this decision is based on the client's own local configuration and/or policies that its own clients passed along to it πŸ“‹. the client also decides how many merged TE topologies it needs to make and keep πŸŽ€. for example, on top of the merged TE topology in the upper part of Figure 13, the client might merge the abstract TE topologies from the two providers, as in Figure 14, into additional Native TE topologies, as in Figure 15 πŸ¦‹

     Domain 1 Abstract TE Topology 1  Domain 2 Abstract TE Topology 1

             +---+    +---+                  +---+    +---+
        -----|S13|----|S15|----          ----|S23|----|S25|----
             +---+\   +---+                  +---+   /+---+
                   \                                /
                    \                              /
                     \+---+                  +---+/   +---+
                      |S18|----          ----|S24|    |S28|----
                      +---+                  +---+\  /+---+
                                                   \/
                                                   /\
             +---+    +---+                  +---+/  \+---+
        -----|S19|----|S17|----          ----|S29|----|S27|----
             +---+    +---+                  +---+    +---+

        Domain 1 Abstract TE Topology 2  Domain 2 Abstract TE Topology 2

             +------------+                  +------------+
        -----|            |----          ----|            |----
             |            |                  |            |
             |    AN1     |----          ----|    AN1     |----
             |            |                  |            |
        -----|            |----          ----|            |----
             +------------+                  +------------+

          Figure 14: Merging Domain TE Topologies: Another Example

                Client's Merged TE Topology 2

     /---\      +------------+      +------------+      /---\
     |C11|------|            |------|            |------|C21|
     \---/      |            |      |            |      \---/
                |            |      |            |
                |            |      |            |
                |            |      |            |      /---\
                |    AN11    |------|    AN21    |------|C22|
                |            |      |            |      \---/
                |            |      |            |
                |            |      |            |
     /---\      |            |      |            |      /---\
     |C12|------|            |------|            |------|C23|
     \---/      +------------+      +------------+      \---/

                Client's Merged TE Topology 3

     /---\      +------------+      +---+    +---+      /---\
     |C11|------|            |------|S23|----|S25|------|C21|
     \---/      |            |      +---+   /+---+      \---/
                |            |             /
                |            |            /
                |            |      +---+/   +---+      /---\
                |    AN11    |------|S24|    |S28|------|C22|
                |            |      +---+\  /+---+      \---/
                |            |            \/
                |            |            /\
     /---\      |            |      +---+/  \+---+      /---\
     |C12|------|            |------|S29|----|S27|------|C23|
     \---/      +------------+      +---+    +---+      \---/

         Figure 15: Multiple Native (Merged) Client's TE Topologies

quick heads up πŸ‘€ letting the client mix and match several TE topologies only works if inter-domain plug IDs (not a remote node ID / link ID) are the way neighboring domains get identified and their inter-domain TE links get resolved πŸ”Œβœ¨

and it's important to know that each of the three Native (merged) TE topologies could be used by the client to compute TE paths for any of the multi-domain services 🌟. which one to pick for a given service depends on the service's parameters/requirements, the topology's style and optimization criteria, and the level of detail πŸ§πŸ’œ

5. Modeling Considerations πŸŽ€

5.1. Network Topology Building Blocks 🧱

okay so the building blocks for network topology are all explained over in [RFC8345]. this TE topology model is basically the sequel: it augments and uses the ietf-network-topology module from [RFC8345] ✨

                        +------------------------+
                        | Network Topology Model |
                        | (ietf-network-topology)|
                        +------------------------+
                                     |
                                     |
                                     |
                                     V
                        +------------------------+
                        |       TE Topology      |
                        |         Model          |
                        +------------------------+

Figure 16: Augmenting the Network Topology Model

5.2. Technology-Agnostic TE Topology Model 🌍

the TE topology model in this document is meant to be network technology agnostic πŸ’… other technology-specific TE topology models can augment and use the building blocks this model provides, like in Figure 17 πŸ¦‹

                   +-----------------------------+
                   |      TE Topology Model      |
                   +-----------------------------+
                                  |
             +-------------+-------------+-------------+
             |             |             |             |
             V             V             V             V
      +-------------+                            +-------------+
      | Technology- |                            | Technology- |
      |  Specific   |   ......................   |  Specific   |
      | TE Topology |                            | TE Topology |
      |   Model 1   |                            |   Model n   |
      +-------------+                            +-------------+

Figure 17: Augmenting the Technology-Agnostic TE Topology Model

5.3. Model Structure πŸ—οΈ

here's the big picture of how the high-level model is structured 🌸 check out the tree below:

   module: ietf-te-topology
     augment /nw:networks/nw:network/nw:network-types:
       +--rw te-topology!

     augment /nw:networks:
       +--rw te!
          +--rw templates
             +--rw node-template* [name] {template}?
             |  ............
             +--rw link-template* [name] {template}?
                ............

     augment /nw:networks/nw:network:
       +--rw te-topology-identifier
       |  +--rw provider-id?   te-global-id
       |  +--rw client-id?     te-global-id
       |  +--rw topology-id?   te-topology-id
       +--rw te!
          |  ............

     augment /nw:networks/nw:network/nw:node:
       +--rw te-node-id?   te-types:te-node-id
       +--rw te!
          |  ............
          +--rw tunnel-termination-point* [tunnel-tp-id]
             +--rw tunnel-tp-id    binary
             |  ............
             +--rw supporting-tunnel-termination-point*
                     [node-ref tunnel-tp-ref]
                |  ............

     augment /nw:networks/nw:network/nt:link:
       +--rw te!
          |  ..........

     augment /nw:networks/nw:network/nw:node/nt:termination-point:
       +--rw te-tp-id?   te-types:te-tp-id
       +--rw te!
          |  ............

5.4. Topology Identifiers πŸ”‘

every TE topology gets a unique key with three parts: topology-id, provider-id, and client-id πŸŽ€ the combo of provider-id and topology-id is what uniquely identifies a Native TE topology on a given provider. client-id only shows up when Customized TE topologies are in the picture, and Native TE topologies use a client-id value of 0 ✨

     augment /nw:networks/nw:network:
       +--rw te-topology-identifier
       |  +--rw provider-id?   te-global-id
       |  +--rw client-id?     te-global-id
       |  +--rw topology-id?   te-topology-id
       +--rw te!
          |  ............

the model covers the generic TE link attributes, aka the stuff like bandwidth, administrative groups, SRLGs, switching capabilities, TE metric extensions, etc. πŸ’œ

     +--rw te-link-attributes
        .....................
        +--rw admin-status?                     te-admin-status
        |  .....................
        +--rw link-index?                       uint64
        +--rw administrative-group?             te-types:admin-groups
        +--rw link-protection-type?             enumeration
        +--rw max-link-bandwidth?               te-bandwidth
        +--rw max-resv-link-bandwidth?          te-bandwidth
        +--rw unreserved-bandwidth* [priority]
        |  .....................
        +--rw te-default-metric?                uint32
        |  .....................
        +--rw te-srlgs
        +--rw te-nsrlgs {nsrlg}?        .....................

5.6. Generic TE Node Attributes 🌟

the model also covers the generic TE node attributes πŸ’– first up is how a generic connectivity matrix is defined:

     +--rw te-node-attributes
        ...........
        +--rw connectivity-matrices
        ...........
        |  +--rw connectivity-matrix* [id]
        |  |  +--rw id            uint32
        |  |  +--rw from
        |  |  |  +--rw tp-ref?        leafref
        |  |  |  +--rw label-restrictions
        |  |  +--rw to
        |  |  |  +--rw tp-ref?        leafref
        |  |  |  +--rw label-restrictions
        |  |  +--rw is-allowed?   boolean
        ...........
        |  |  +--rw underlay! {te-topology-hierarchy}?
        ...........
        |  |  +--rw path-constraints
        ...........
        |  |  +--rw optimizations
        ...........
        |  |  +--ro path-properties
        ...........

next up is the TTP Local Link Connectivity List πŸ¦„

     +--rw tunnel-termination-point* [tunnel-tp-id]
        +--rw tunnel-tp-id               binary
        +--rw admin-status?              te-types:te-admin-status
        +--rw name?                      string
        +--rw switching-capability?      identityref
        +--rw encoding?                  identityref
        +--rw inter-layer-lock-id*       uint32
        +--rw protection-type?           identityref
        +--rw client-layer-adaptation
        ...........
        +--rw local-link-connectivities
        ...........
        |  +--rw local-link-connectivity* [link-tp-ref]
        |     +--rw link-tp-ref                leafref
        |     +--rw label-restrictions
        ...........
        |     +--rw is-allowed?                 boolean
        |     +--rw underlay {te-topology-hierarchy}?
        ...........
        |     +--rw path-constraints
        ...........
        |     +--rw optimizations
        ...........
        |     +--ro path-properties
        ...........
        +--rw supporting-tunnel-termination-point*
                [node-ref tunnel-tp-ref]
           +--rw node-ref         inet:uri
           +--rw tunnel-tp-ref    binary

so here's the defaults situation πŸ™ˆ the attributes sitting directly under the connectivity-matrices container are the default attributes for every connectivity matrix entry, but only when that entry doesn't specify its own. when a per-entry attribute is specified, it wins and overrides the default πŸ‘‘ the exact same rule applies to the attributes directly under the local-link-connectivities container, bestie πŸ’…

each TTP MAY be supported by one or more supporting TTPs. if the TE node hosting the TTP refers to a supporting TE node, then the supporting TTPs are hosted by that supporting TE node. and if the TE node refers to an underlay TE topology, the supporting TTPs are hosted by one or more specified TE nodes of that underlay TE topology 🫢

5.7. TED Information Sources πŸ“š

each TE topological element can have multiple TE information sources, like OSPF-TE, ISIS-TE, Border Gateway Protocol - Link State (BGP-LS), user-configured, system-processed, or other 🌈 every info source comes with a credibility preference that shows its precedence. and when a Customized TE topology gets merged into a client's Native TE topology, the merged topological elements point to that Customized TE topology as their information source. iconic πŸ”₯

     augment /nw:networks/nw:network/nw:node:
       +--rw te!
          ...........
          +--ro information-source?            te-info-source
          +--ro information-source-instance?   string
          +--ro information-source-state
          |  +--ro credibility-preference?    uint16
          |  +--ro logical-network-element?   string
          |  +--ro network-instance?          string
          |  +--ro topology
          |     +--ro node-ref?      leafref
          |     +--ro network-ref?   leafref
          +--ro information-source-entry*
          |       [information-source information-source-instance]
          |  +--ro information-source             te-info-source
          |  +--ro information-source-instance    string
                ............

     augment /nw:networks/nw:network/nt:link:
       +--rw te!
          ...........
          +--ro information-source?            te-info-source
          +--ro information-source-instance?   string
          +--ro information-source-state
          |  +--ro credibility-preference?    uint16
          |  +--ro logical-network-element?   string
          |  +--ro network-instance?          string
          |  +--ro topology
          |     +--ro link-ref?      leafref
          |     +--ro network-ref?   leafref
          +--ro information-source-entry*
          |       [information-source information-source-instance]
          |  +--ro information-source                te-info-source
          |  +--ro information-source-instance       string
                ............

5.8. Overlay/Underlay Relationship 🧚

the model captures the overlay and underlay relationship for TE nodes and links πŸ¦‹ for example, in networks where multiple TE topologies are built hierarchically, you can start at a specific element in the topmost topology and traverse all the way down to the supporting elements in the bottommost one. it's giving layers 🍰

this relationship is captured with the underlay-topology field for nodes and the underlay field for links. using these fields is optional, and the functionality is tagged as a feature called te-topology-hierarchy πŸ’–

     augment /nw:networks/nw:network/nw:node:
       +--rw te-node-id?   te-types:te-node-id
       +--rw te!
          +--rw te-node-template*           leafref {template}?
          +--rw te-node-attributes
          |  +--rw admin-status?            te-types:te-admin-status
          |  |  ....................
          |  +--rw underlay-topology {te-topology-hierarchy}?
          |     +--rw network-ref?   leafref

     augment /nw:networks/nw:network/nt:link:
       +--rw te!
          +--rw te-link-attributes
          |  ....................
          |  +--rw underlay {te-topology-hierarchy}?
          |  |  +--rw enabled?                     boolean
          |  |  +--rw primary-path
          |  |  |  +--rw network-ref?    leafref
          |  |  |     ....................
          |  |  +--rw backup-path* [index]
          |  |  |  +--rw index           uint32
          |  |  |  +--rw network-ref?    leafref
          |  |  |     ....................
          |  |  +--rw protection-type?             identityref
          |  |  +--rw tunnel-termination-points
          |  |  |  +--rw source?        binary
          |  |  |  +--rw destination?   binary
          |  |  +--rw tunnels
          |  |  |  ....................

5.9. Templates πŸŽ€

Okay bestie, templates are giving organization πŸ’…. The data model lets you define templates and apply them to link and node configurations, so you don't have to retype the same stuff everywhere. Using the "template" configuration is totally optional ✨, and the whole thing is tagged as a template feature, so you can switch it on or leave it alone.

     augment /nw:networks/nw:network/nw:node:
       +--rw te-node-id?   te-types:te-node-id
       +--rw te!
          +--rw te-node-template*
          |       -> ../../../../te/templates/node-template/name
          |       {template}?

     augment /nw:networks/nw:network/nt:link:
       +--rw te!
          +--rw te-link-template*
          |       -> ../../../../te/templates/link-template/name
          |       {template}?

     augment /nw:networks:
       +--rw te!
          +--rw templates
             +--rw node-template* [name] {template}?
             |  +--rw name
             |  |       te-types:te-template-name
             |  +--rw priority?                  uint16
             |  +--rw reference-change-policy?   enumeration
             |  +--rw te-node-attributes
                ..........
             +--rw link-template* [name] {template}?
                +--rw name
                |       te-types:te-template-name
                +--rw priority?                  uint16
                +--rw reference-change-policy?   enumeration
                +--rw te-link-attributes
                ..........

Multiple templates can be stacked onto one configuration element 🌈. When two or more templates set a value for the same config field, the value from the template with the highest priority wins πŸ‘‘. Priority runs from 0 to 65535, and a lower number means a higher priority, so 0 is the main character energy πŸ’–.

The reference-change-policy decides what happens when a template changes on a config element that's pointing at it πŸ™ˆ. There are three choices: take no action, reject the change to the template, or apply the change to the corresponding configuration 🫢.

5.10. Scheduling Parameters ⏰

The model lets you attach time-scheduling parameters to each topological element or to the whole topology πŸ¦‹. This is how the provider can show the client different topological views in different time slots, which is honestly iconic πŸ”₯. Using time-scheduling parameters is optional too.

The YANG data model for configuration scheduling is defined in [YANG-CFG-SCHED]. It lets you specify configuration schedules without changing this data model at all, so no messy edits needed 🧚.

5.11. Notifications πŸ””

Notifications are a key component of any topology data model, no cap πŸ’œ.

[RFC8639] and [RFC8641] define a subscription mechanism and a push mechanism for YANG datastores 🌸. Right now, these mechanisms let you:

  • Subscribe to notifications on a per-client basis.
  • Specify subtree filters or XML Path Language (XPath) filters so that only the contents you care about get sent.
  • Specify either periodic or on-demand notifications.

6. Guidance for Writing Technology-Specific TE Topology Augmentations ✨

Okay so the TE topology model in this document is technology agnostic 🌈. That means it defines concepts, abstractions, and attributes that are shared across lots of different network technologies. The plan is for this base model to get used a LOT when people write technology-specific TE topology models for all sorts of layer networks πŸ’…. [YANG-WSON], [YANG-OTN], and [YANG-L3] are some examples of those technology-specific models, and they're bestie-approved 🫢.

Writers of these models are encouraged to augment the basic model's containers instead of inventing brand-new ones πŸŽ€. Those containers include the ones for TE topologies, TE nodes, TE links, Link Termination Points (LTPs), Tunnel Termination Points (TTPs), bandwidth, and labels. You just add your layer-specific attributes into them ✨.

Here's a technology-specific example-topology model to show you what I mean πŸ¦‹:

   module: example-topology
     augment /nw:networks/nw:network/nw:network-types/tet:te-topology:
       +--rw example-topology!
     augment /nw:networks/nw:network/tet:te:
       +--rw attributes
          +--rw attribute-1?   uint8
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes:
       +--rw attributes
          +--rw attribute-2?   uint8
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices:
       +--rw attributes
          +--rw attribute-3?   uint8
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix:
       +--rw attributes
          +--rw attribute-3?   uint8
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point:
       +--rw attributes
          +--rw attribute-4?   uint8
     augment /nw:networks/nw:network/nw:node/nt:termination-point
               /tet:te:
       +--rw attributes
          +--rw attribute-5?   uint8
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes:
       +--rw attributes
          +--rw attribute-6?   uint8

The technology-specific TE bandwidth for this example topology can be specified using the following augment statements πŸ’–:

     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes
               /tet:interface-switching-capability/tet:max-lsp-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes/tet:max-link-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes/tet:max-resv-link-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes/tet:unreserved-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:path-constraints/tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:path-constraints
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:path-constraints/tet:te-bandwidth/tet:technology:
       +--:(example)
          +--ro example
             +--ro bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:path-constraints
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--ro example
             +--ro bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point/tet:client-layer-adaptation
               /tet:switching-capability/tet:te-bandwidth
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities/tet:path-constraints
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities
               /tet:local-link-connectivity/tet:path-constraints
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes
               /tet:interface-switching-capability/tet:max-lsp-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes/tet:max-link-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes/tet:max-resv-link-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:information-source-entry
               /tet:interface-switching-capability/tet:max-lsp-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--ro example
             +--ro bandwidth-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:information-source-entry/tet:max-link-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--ro example
             +--ro bandwidth-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:information-source-entry/tet:max-resv-link-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--ro example
             +--ro bandwidth-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:information-source-entry/tet:unreserved-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--ro example
             +--ro bandwidth-1?   uint32
     augment /nw:networks/nw:network/nw:node/nt:termination-point/tet:te
               /tet:interface-switching-capability/tet:max-lsp-bandwidth
               /tet:te-bandwidth/tet:technology:
       +--:(example)
          +--rw example
             +--rw bandwidth-1?   uint32

The technology-specific TE label for this example topology can be specified using the following augment statements:

okay these augment blocks are giving YANG glam πŸ’… here's the next chunk of the example trees πŸ¦‹

     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes/tet:underlay/tet:primary-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes/tet:underlay/tet:backup-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/tet:te/tet:templates/tet:link-template
               /tet:te-link-attributes/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:label-restrictions/tet:label-restriction
               /tet:label-start/tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:label-restrictions/tet:label-restriction
               /tet:label-end/tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:underlay/tet:primary-path/tet:path-element/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:underlay/tet:backup-path/tet:path-element/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:path-properties/tet:path-route-objects
               /tet:path-route-object/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:from/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:from/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:to/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:to/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:underlay/tet:primary-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:underlay/tet:backup-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:te-node-attributes/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:path-properties
               /tet:path-route-objects/tet:path-route-object/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:label-restrictions/tet:label-restriction
               /tet:label-start/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:label-restrictions/tet:label-restriction
               /tet:label-end/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:underlay/tet:primary-path/tet:path-element/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:underlay/tet:backup-path/tet:path-element/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:path-properties/tet:path-route-objects
               /tet:path-route-object/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:from/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:from/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:to/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:to/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:underlay/tet:primary-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:underlay/tet:backup-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:information-source-entry/tet:connectivity-matrices
               /tet:connectivity-matrix/tet:path-properties
               /tet:path-route-objects/tet:path-route-object/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities/tet:underlay
               /tet:primary-path/tet:path-element/tet:type/tet:label
               /tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities/tet:underlay
               /tet:backup-path/tet:path-element/tet:type/tet:label
               /tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities/tet:path-properties
               /tet:path-route-objects/tet:path-route-object/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities
               /tet:local-link-connectivity/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities
               /tet:local-link-connectivity/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities
               /tet:local-link-connectivity/tet:underlay
               /tet:primary-path/tet:path-element/tet:type/tet:label
               /tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities
               /tet:local-link-connectivity/tet:underlay/tet:backup-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nw:node/tet:te
               /tet:tunnel-termination-point
               /tet:local-link-connectivities
               /tet:local-link-connectivity/tet:path-properties
               /tet:path-route-objects/tet:path-route-object/tet:type
               /tet:label/tet:label-hop/tet:te-label/tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes/tet:underlay/tet:primary-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:te-link-attributes/tet:underlay/tet:backup-path
               /tet:path-element/tet:type/tet:label/tet:label-hop
               /tet:te-label/tet:technology:
       +--:(example)
          +--rw example
             +--rw label-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:information-source-entry/tet:label-restrictions
               /tet:label-restriction/tet:label-start/tet:te-label
               /tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32
     augment /nw:networks/nw:network/nt:link/tet:te
               /tet:information-source-entry/tet:label-restrictions
               /tet:label-restriction/tet:label-end/tet:te-label
               /tet:technology:
       +--:(example)
          +--ro example
             +--ro label-1?   uint32

The example YANG module that implements the above example topology is provided in Appendix C πŸŽ€

7. TE Topology YANG Module ✨

This module references [RFC1195], [RFC3209], [RFC3272], [RFC3471], [RFC3630], [RFC3785], [RFC4201], [RFC4202], [RFC4203], [RFC4206], [RFC4872], [RFC5152], [RFC5212], [RFC5305], [RFC5316], [RFC5392], [RFC6001], [RFC6241], [RFC6991], [RFC7308], [RFC7471], [RFC7579], [RFC7752], [RFC8345], and [RFC8776]. πŸ’œ

<CODE BEGINS> file "ietf-te-topology@2020-08-06.yang"
module ietf-te-topology {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology";
  prefix tet;

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-te-types {
    prefix te-types;
    reference
      "RFC 8776: Common YANG Data Types for Traffic Engineering";
  }
  import ietf-network {
    prefix nw;
    reference
      "RFC 8345: A YANG Data Model for Network Topologies";
  }
  import ietf-network-topology {
    prefix nt;
    reference
      "RFC 8345: A YANG Data Model for Network Topologies";
  }

  organization
    "IETF Traffic Engineering Architecture and Signaling (TEAS)
     Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/teas/>
     WG List:  <mailto:teas@ietf.org>

     Editor:   Xufeng Liu
               <mailto:xufeng.liu.ietf@gmail.com>

     Editor:   Igor Bryskin
               <mailto:i_bryskin@yahoo.com>

     Editor:   Vishnu Pavan Beeram
               <mailto:vbeeram@juniper.net>

     Editor:   Tarek Saad
               <mailto:tsaad@juniper.net>

     Editor:   Himanshu Shah
               <mailto:hshah@ciena.com>

     Editor:   Oscar Gonzalez de Dios
               <mailto:oscar.gonzalezdedios@telefonica.com>";
  description
    "This YANG module defines a TE topology model for representing,
     retrieving, and manipulating technology-agnostic TE topologies.

     Copyright (c) 2020 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC 8795; see the
     RFC itself for full legal notices.";

  revision 2020-08-06 {
    description
      "Initial revision.";
    reference
      "RFC 8795: YANG Data Model for Traffic Engineering (TE)
       Topologies";
  }

  /*
   * Features
   */

  feature nsrlg {
    description
      "This feature indicates that the system supports NSRLGs
       (Non-Shared Risk Link Groups).";
  }

  feature te-topology-hierarchy {
    description
      "This feature indicates that the system allows an underlay
       and/or overlay TE topology hierarchy.";
  }

  feature template {
    description
      "This feature indicates that the system supports
       template configuration.";
  }

  /*
   * Typedefs
   */

  typedef geographic-coordinate-degree {
    type decimal64 {
      fraction-digits 8;
    }
    description
      "Decimal degree (DD) used to express latitude and longitude
       geographic coordinates.";
  }
  // geographic-coordinate-degree

  typedef te-info-source {
    type enumeration {
      enum unknown {
        description
          "The source is unknown.";
      }
      enum locally-configured {
        description
          "Configured entity.";
      }
      enum ospfv2 {
        description
          "OSPFv2.";
      }
      enum ospfv3 {
        description
          "OSPFv3.";
      }
      enum isis {
        description
          "IS-IS.";
      }
      enum bgp-ls {
        description
          "BGP-LS.";
        reference
          "RFC 7752: North-Bound Distribution of Link-State and
           Traffic Engineering (TE) Information Using BGP";
      }
      enum system-processed {
        description
          "System-processed entity.";
      }
      enum other {
        description
          "Other source.";
      }
    }
    description
      "Describes the type of source that has provided the
       related information, and the source's credibility.";
  }
  // te-info-source

  /*
   * Groupings
   */

  grouping connectivity-matrix-entry-path-attributes {
    description
      "Attributes of a connectivity matrix entry.";
    leaf is-allowed {
      type boolean;
      description
        "'true' - switching is allowed;
         'false' - switching is disallowed.";
    }
    container underlay {
      if-feature "te-topology-hierarchy";
      description
        "Attributes of the TE link underlay.";
      reference
        "RFC 4206: Label Switched Paths (LSP) Hierarchy with
         Generalized Multi-Protocol Label Switching (GMPLS)
         Traffic Engineering (TE)";
      uses te-link-underlay-attributes;
    }
    uses te-types:generic-path-constraints;
    uses te-types:generic-path-optimization;
    uses te-types:generic-path-properties;
  }
  // connectivity-matrix-entry-path-attributes

  grouping geolocation-container {
    description
      "Contains a GPS location.";
    container geolocation {
      config false;
      description
        "Contains a GPS location.";
      leaf altitude {
        type int64;
        units "millimeters";
        description
          "Distance above sea level.";
      }
      leaf latitude {
        type geographic-coordinate-degree {
          range "-90..90";
        }
        description
          "Relative position north or south on the Earth's surface.";
      }
      leaf longitude {
        type geographic-coordinate-degree {
          range "-180..180";
        }
        description
          "Angular distance east or west on the Earth's surface.";
      }
    }
    // geolocation
  }
  // geolocation-container

  grouping information-source-state-attributes {
    description
      "The attributes identifying the source that has provided the
       related information, and the source's credibility.";
    leaf credibility-preference {
      type uint16;
      description
        "The preference value for calculating the Traffic
         Engineering database credibility value used for
         tie-break selection between different information-source
         values.  A higher value is preferable.";
    }
    leaf logical-network-element {
      type string;
      description
        "When applicable, this is the name of a logical network
         element from which the information is learned.";
    }
    leaf network-instance {
      type string;
      description
        "When applicable, this is the name of a network instance
         from which the information is learned.";
    }
  }
  // information-source-state-attributes

Okay bestie, we're still in the YANG module, and this part is all about who's giving the info and how the link and node stats get counted πŸ“Šβœ¨ Here it is, exactly as the RFC has it πŸ’…

     grouping information-source-per-link-attributes {
       description
         "Per-node container of the attributes identifying the source
          that has provided the related information, and the source's
          credibility.";
       leaf information-source {
         type te-info-source;
         config false;
         description
           "Indicates the type of information source.";
       }
       leaf information-source-instance {
         type string;
         config false;
         description
           "The name indicating the instance of the information
            source.";
       }
       container information-source-state {
         config false;
         description
           "Contains state attributes related to the information
            source.";
         uses information-source-state-attributes;
         container topology {
           description
             "When the information is processed by the system,
              the attributes in this container indicate which topology
              is used to generate the result information.";
           uses nt:link-ref;
         }
       }
     }
     // information-source-per-link-attributes

     grouping information-source-per-node-attributes {
       description
         "Per-node container of the attributes identifying the source
          that has provided the related information, and the source's
          credibility.";
       leaf information-source {
         type te-info-source;
         config false;
         description
           "Indicates the type of information source.";
       }
       leaf information-source-instance {
         type string;
         config false;
         description
           "The name indicating the instance of the information
            source.";
       }
       container information-source-state {
         config false;
         description
           "Contains state attributes related to the information
            source.";
         uses information-source-state-attributes;
         container topology {
           description
             "When the information is processed by the system,
              the attributes in this container indicate which topology
              is used to generate the result information.";
           uses nw:node-ref;
         }
       }
     }
     // information-source-per-node-attributes

     grouping interface-switching-capability-list {
       description
         "List of Interface Switching Capability Descriptors (ISCDs).";
       list interface-switching-capability {
         key "switching-capability encoding";
         description
           "List of ISCDs for this link.";
         reference
           "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
            Signaling Functional Description
            RFC 4203: OSPF Extensions in Support of Generalized
            Multi-Protocol Label Switching (GMPLS)";
         leaf switching-capability {
           type identityref {
             base te-types:switching-capabilities;
           }
           description
             "Switching capability for this interface.";
         }
         leaf encoding {
           type identityref {
             base te-types:lsp-encoding-types;
           }
           description
             "Encoding supported by this interface.";
         }
         uses te-link-iscd-attributes;
       }
       // interface-switching-capability
     }
     // interface-switching-capability-list

     grouping statistics-per-link {
       description
         "Statistics attributes per TE link.";
       leaf discontinuity-time {
         type yang:date-and-time;
         description
           "The time of the most recent occasion at which any one or
            more of this interface's counters suffered a
            discontinuity.  If no such discontinuities have occurred
            since the last re-initialization of the local management
            subsystem, then this node contains the time the local
            management subsystem re-initialized itself.";
       }
       /* Administrative attributes */
       leaf disables {
         type yang:counter32;
         description
           "Number of times that a link was disabled.";
       }
       leaf enables {
         type yang:counter32;
         description
           "Number of times that a link was enabled.";
       }
       leaf maintenance-clears {
         type yang:counter32;
         description
           "Number of times that a link was taken out of maintenance.";
       }
       leaf maintenance-sets {
         type yang:counter32;
         description
           "Number of times that a link was put in maintenance.";
       }
       leaf modifies {
         type yang:counter32;
         description
           "Number of times that a link was modified.";
       }
       /* Operational attributes */
       leaf downs {
         type yang:counter32;
         description
           "Number of times that a link was set to an operational state
            of 'down'.";
       }
       leaf ups {
         type yang:counter32;
         description
           "Number of times that a link was set to an operational state
            of 'up'.";
       }
       /* Recovery attributes */
       leaf fault-clears {
         type yang:counter32;
         description
           "Number of times that a link experienced a fault-clear
            event.";
       }
       leaf fault-detects {
         type yang:counter32;
         description
           "Number of times that a link experienced fault detection.";
       }
       leaf protection-switches {
         type yang:counter32;
         description
           "Number of times that a link experienced protection
            switchover.";
       }
       leaf protection-reverts {
         type yang:counter32;
         description
           "Number of times that a link experienced protection
            reversion.";
       }
       leaf restoration-failures {
         type yang:counter32;
         description
           "Number of times that a link experienced restoration
            failure.";
       }
       leaf restoration-starts {
         type yang:counter32;
         description
           "Number of times that a link experienced restoration
            start.";
       }
       leaf restoration-successes {
         type yang:counter32;
         description
           "Number of times that a link experienced restoration
            success.";
       }
       leaf restoration-reversion-failures {
         type yang:counter32;
         description
           "Number of times that a link experienced restoration
            reversion failure.";
       }
       leaf restoration-reversion-starts {
         type yang:counter32;
         description
           "Number of times that a link experienced restoration
            reversion start.";
       }
       leaf restoration-reversion-successes {
         type yang:counter32;
         description
           "Number of times that a link experienced restoration
            reversion success.";
       }
     }
     // statistics-per-link

     grouping statistics-per-node {
       description
         "Statistics attributes per TE node.";
       leaf discontinuity-time {
         type yang:date-and-time;
         description
           "The time of the most recent occasion at which any one or
            more of this interface's counters suffered a
            discontinuity.  If no such discontinuities have occurred
            since the last re-initialization of the local management
            subsystem, then this node contains the time the local
            management subsystem re-initialized itself.";
       }
       container node {
         description
           "Contains statistics attributes at the TE node level.";
         leaf disables {
           type yang:counter32;
           description
             "Number of times that a node was disabled.";
         }
         leaf enables {
           type yang:counter32;
           description
             "Number of times that a node was enabled.";
         }
         leaf maintenance-sets {
           type yang:counter32;
           description
             "Number of times that a node was put in maintenance.";
         }
         leaf maintenance-clears {
           type yang:counter32;
           description
             "Number of times that a node was taken out of
              maintenance.";
         }
         leaf modifies {
           type yang:counter32;
           description
             "Number of times that a node was modified.";
         }
       }
       // node
       container connectivity-matrix-entry {
         description
           "Contains statistics attributes at the level of a
            connectivity matrix entry.";
         leaf creates {
           type yang:counter32;
           description
             "Number of times that a connectivity matrix entry was
              created.";
           reference
             "RFC 6241: Network Configuration Protocol (NETCONF),
                        Section 7.2, 'create' operation";
         }
         leaf deletes {
           type yang:counter32;
           description
             "Number of times that a connectivity matrix entry was
              deleted.";
           reference
             "RFC 6241: Network Configuration Protocol (NETCONF),
                        Section 7.2, 'delete' operation";
         }
         leaf disables {
           type yang:counter32;
           description
             "Number of times that a connectivity matrix entry was
              disabled.";
         }
         leaf enables {
           type yang:counter32;
           description
             "Number of times that a connectivity matrix entry was
              enabled.";
         }
         leaf modifies {
           type yang:counter32;
           description
             "Number of times that a connectivity matrix entry was
              modified.";
         }
       }
       // connectivity-matrix-entry
     }
     // statistics-per-node

okay so this next chunk is where the stats get extra πŸ’… we've got per-TTP counters, per-LLCL counters, and the link grouping that ties it all together πŸ¦‹

statistics-per-ttp is the grouping for all the TE TTP (Tunnel Termination Point) stats πŸ“Š it starts with a discontinuity-time leaf, then splits into two containers: one for TTP-level counters and one for LLCL (Local Link Connectivity List) counters πŸŽ€

     grouping statistics-per-ttp {
       description
         "Statistics attributes per TE TTP (Tunnel Termination Point).";
       leaf discontinuity-time {
         type yang:date-and-time;
         description
           "The time of the most recent occasion at which any one or
            more of this interface's counters suffered a
            discontinuity.  If no such discontinuities have occurred
            since the last re-initialization of the local management
            subsystem, then this node contains the time the local
            management subsystem re-initialized itself.";
       }
       container tunnel-termination-point {
         description
           "Contains statistics attributes at the TE TTP level.";
         /* Administrative attributes */
         leaf disables {
           type yang:counter32;
           description
             "Number of times that a TTP was disabled.";
         }
         leaf enables {
           type yang:counter32;
           description
             "Number of times that a TTP was enabled.";
         }
         leaf maintenance-clears {
           type yang:counter32;
           description
             "Number of times that a TTP was taken out of maintenance.";
         }
         leaf maintenance-sets {
           type yang:counter32;
           description
             "Number of times that a TTP was put in maintenance.";
         }
         leaf modifies {
           type yang:counter32;
           description
             "Number of times that a TTP was modified.";
         }
         /* Operational attributes */
         leaf downs {
           type yang:counter32;
           description
             "Number of times that a TTP was set to an operational state
              of 'down'.";
         }
         leaf ups {
           type yang:counter32;
           description
             "Number of times that a TTP was set to an operational state
              of 'up'.";
         }
         leaf in-service-clears {
           type yang:counter32;
           description
             "Number of times that a TTP was taken out of service
              (TE tunnel was released).";
         }
         leaf in-service-sets {
           type yang:counter32;
           description
             "Number of times that a TTP was put in service by a TE
              tunnel (TE tunnel was set up).";
         }
       }
       // tunnel-termination-point
       container local-link-connectivity {
         description
           "Contains statistics attributes at the TE LLCL (Local Link
            Connectivity List) level.";
         leaf creates {
           type yang:counter32;
           description
             "Number of times that an LLCL entry was created.";
           reference
             "RFC 6241: Network Configuration Protocol (NETCONF),
                        Section 7.2, 'create' operation";
         }
         leaf deletes {
           type yang:counter32;
           description
             "Number of times that an LLCL entry was deleted.";
           reference
             "RFC 6241: Network Configuration Protocol (NETCONF),
                        Section 7.2, 'delete' operation";
         }
         leaf disables {
           type yang:counter32;
           description
             "Number of times that an LLCL entry was disabled.";
         }
         leaf enables {
           type yang:counter32;
           description
             "Number of times that an LLCL entry was enabled.";
         }
         leaf modifies {
           type yang:counter32;
           description
             "Number of times that an LLCL entry was modified.";
         }
       }
       // local-link-connectivity
     }
     // statistics-per-ttp

te-link-augment is the grouping that glues a TE link together ✨ it pulls in the config, the derived state, and a read-only statistics container that uses the per-link stats grouping 🌸

     grouping te-link-augment {
       description
         "Augmentation for a TE link.";
       uses te-link-config;
       uses te-link-state-derived;
       container statistics {
         config false;
         description
           "Statistics data.";
         uses statistics-per-link;
       }
     }
     // te-link-augment

Next up is te-link-config, the config grouping for TE links πŸ¦‹ this is where it gets really detailed, because a TE link can either be split into bundled links or component links, and it's one or the other via a choice πŸ™ˆ

     grouping te-link-config {
       description
         "TE link configuration grouping.";
       choice bundle-stack-level {
         description
           "The TE link can be partitioned into bundled links or
            component links.";
         case bundle {
           container bundled-links {
             description
               "A set of bundled links.";
             reference
               "RFC 4201: Link Bundling in MPLS Traffic
                Engineering (TE)";
             list bundled-link {
               key "sequence";
               description
                 "Specifies a bundled interface that is
                  further partitioned.";
               leaf sequence {
                 type uint32;
                 description
                   "Identifies the sequence in the bundle.";
               }
             }
           }
         }
         case component {
           container component-links {
             description
               "A set of component links.";
             list component-link {
               key "sequence";
               description
                 "Specifies a component interface that is
                  sufficient to unambiguously identify the
                  appropriate resources.";
               leaf sequence {
                 type uint32;
                 description
                   "Identifies the sequence in the bundle.";
               }
               leaf src-interface-ref {
                 type string;
                 description
                   "Reference to a component link interface on the
                    source node.";
               }
               leaf des-interface-ref {
                 type string;
                 description
                   "Reference to a component link interface on the
                    destination node.";
               }
             }
           }
         }
       }
       // bundle-stack-level
       leaf-list te-link-template {
         if-feature "template";
         type leafref {
           path "../../../../te/templates/link-template/name";
         }
         description
           "The reference to a TE link template.";
       }
       uses te-link-config-attributes;
     }
     // te-link-config

Last bit for this part is te-link-config-attributes πŸ‘ it holds the link's access type, its external-domain info for inter-domain links, the abstract flag, the name, the underlay container, the admin status, and the info attributes πŸ’–

     grouping te-link-config-attributes {
       description
         "Link configuration attributes in a TE topology.";
       container te-link-attributes {
         description
           "Link attributes in a TE topology.";
         leaf access-type {
           type te-types:te-link-access-type;
           description
             "Link access type, which can be point-to-point or
              multi-access.";
         }
         container external-domain {
           description
             "For an inter-domain link, specifies the attributes of
              the remote end of the link, to facilitate the signaling at
              the local end.";
           uses nw:network-ref;
           leaf remote-te-node-id {
             type te-types:te-node-id;
             description
               "Remote TE node identifier, used together with
                'remote-te-link-tp-id' to identify the remote Link
                Termination Point (LTP) in a different domain.";
           }
           leaf remote-te-link-tp-id {
             type te-types:te-tp-id;
             description
               "Remote TE LTP identifier, used together with
                'remote-te-node-id' to identify the remote LTP in a
                different domain.";
           }
         }
         leaf is-abstract {
           type empty;
           description
             "Present if the link is abstract.";
         }
         leaf name {
           type string;
           description
             "Link name.";
         }
         container underlay {
           if-feature "te-topology-hierarchy";
           description
             "Attributes of the TE link underlay.";
           reference
             "RFC 4206: Label Switched Paths (LSP) Hierarchy with
              Generalized Multi-Protocol Label Switching (GMPLS)
              Traffic Engineering (TE)";
           uses te-link-underlay-attributes;
         }
         leaf admin-status {
           type te-types:te-admin-status;
           description
             "The administrative state of the link.";
         }
         uses te-link-info-attributes;
       }
       // te-link-attributes
     }
     // te-link-config-attributes

Okay bestie, we're deep in the YANG module now 🧚 Here's the link info grouping, the ISCD grouping, the link state stuff, and the underlay attributes, all in one go πŸ’…

     grouping te-link-info-attributes {
       description
         "Advertised TE information attributes.";
       leaf link-index {
         type uint64;
         description
           "The link identifier.  If OSPF is used, this object
            represents an ospfLsdbID.  If IS-IS is used, this object
            represents an isisLSPID.  If a locally configured link is
            used, this object represents a unique value, which is
            locally defined in a router.";
       }
       leaf administrative-group {
         type te-types:admin-groups;
         description
           "Administrative group or color of the link.
            This attribute covers both administrative groups (defined
            in RFCs 3630 and 5305) and Extended Administrative Groups
            (defined in RFC 7308).";
         reference
           "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
            Version 2
            RFC 5305: IS-IS Extensions for Traffic Engineering
            RFC 7308: Extended Administrative Groups in MPLS Traffic
            Engineering (MPLS-TE)";
       }
       uses interface-switching-capability-list;
       uses te-types:label-set-info;
       leaf link-protection-type {
         type identityref {
           base te-types:link-protection-type;
         }
         description
           "Link Protection Type desired for this link.";
         reference
           "RFC 4202: Routing Extensions in Support of
            Generalized Multi-Protocol Label Switching (GMPLS)";
       }
       container max-link-bandwidth {
         uses te-types:te-bandwidth;
         description
           "Maximum bandwidth that can be seen on this link in this
            direction.  Units are in bytes per second.";
         reference
           "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
            Version 2
            RFC 5305: IS-IS Extensions for Traffic Engineering";
       }
       container max-resv-link-bandwidth {
         uses te-types:te-bandwidth;
         description
           "Maximum amount of bandwidth that can be reserved in this
            direction in this link.  Units are in bytes per second.";
         reference
           "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
            Version 2
            RFC 5305: IS-IS Extensions for Traffic Engineering";
       }
       list unreserved-bandwidth {
         key "priority";
         max-elements 8;
         description
           "Unreserved bandwidth for priority levels 0-7.  Units are in
            bytes per second.";
         reference
           "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
            Version 2
            RFC 5305: IS-IS Extensions for Traffic Engineering";
         leaf priority {
           type uint8 {
             range "0..7";
           }
           description
             "Priority.";
         }
         uses te-types:te-bandwidth;
       }
       leaf te-default-metric {
         type uint32;
         description
           "Traffic Engineering metric.";
         reference
           "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
            Version 2
            RFC 5305: IS-IS Extensions for Traffic Engineering";
       }
       leaf te-delay-metric {
         type uint32;
         description
           "Traffic Engineering delay metric.";
         reference
           "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions";
       }
       leaf te-igp-metric {
         type uint32;
         description
           "IGP metric used for Traffic Engineering.";
         reference
           "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a
            second MPLS Traffic Engineering (TE) Metric";
       }
       container te-srlgs {
         description
           "Contains a list of SRLGs.";
         leaf-list value {
           type te-types:srlg;
           description
             "SRLG value.";
           reference
             "RFC 4202: Routing Extensions in Support of
              Generalized Multi-Protocol Label Switching (GMPLS)";
         }
       }
       container te-nsrlgs {
         if-feature "nsrlg";
         description
           "Contains a list of NSRLGs (Non-Shared Risk Link Groups).
            When an abstract TE link is configured, this list specifies
            the request that underlay TE paths need to be mutually
            disjoint with other TE links in the same groups.";
         leaf-list id {
           type uint32;
           description
             "NSRLG ID, uniquely configured within a topology.";
           reference
             "RFC 4872: RSVP-TE Extensions in Support of End-to-End
              Generalized Multi-Protocol Label Switching (GMPLS)
              Recovery";
         }
       }
     }
     // te-link-info-attributes

     grouping te-link-iscd-attributes {
       description
         "TE link ISCD attributes.";
       reference
         "RFC 4203: OSPF Extensions in Support of Generalized
          Multi-Protocol Label Switching (GMPLS), Section 1.4";
       list max-lsp-bandwidth {
         key "priority";
         max-elements 8;
         description
           "Maximum Label Switched Path (LSP) bandwidth at
            priorities 0-7.";
         leaf priority {
           type uint8 {
             range "0..7";
           }
           description
             "Priority.";
         }
         uses te-types:te-bandwidth;
       }
     }
     // te-link-iscd-attributes

     grouping te-link-state-derived {
       description
         "Link state attributes in a TE topology.";
       leaf oper-status {
         type te-types:te-oper-status;
         config false;
         description
           "The current operational state of the link.";
       }
       leaf is-transitional {
         type empty;
         config false;
         description
           "Present if the link is transitional; used as an
            alternative approach in lieu of 'inter-layer-lock-id'
            for path computation in a TE topology covering multiple
            layers or multiple regions.";
         reference
           "RFC 5212: Requirements for GMPLS-Based Multi-Region and
            Multi-Layer Networks (MRN/MLN)
            RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions
            for Multi-Layer and Multi-Region Networks (MLN/MRN)";
       }
       uses information-source-per-link-attributes;
       list information-source-entry {
         key "information-source information-source-instance";
         config false;
         description
           "A list of information sources learned, including the source
            that is used.";
         uses information-source-per-link-attributes;
         uses te-link-info-attributes;
       }
       container recovery {
         config false;
         description
           "Status of the recovery process.";
         leaf restoration-status {
           type te-types:te-recovery-status;
           description
             "Restoration status.";
         }
         leaf protection-status {
           type te-types:te-recovery-status;
           description
             "Protection status.";
         }
       }
       container underlay {
         if-feature "te-topology-hierarchy";
         config false;
         description
           "State attributes for the TE link underlay.";
         leaf dynamic {
           type boolean;
           description
             "'true' if the underlay is dynamically created.";
         }
         leaf committed {
           type boolean;
           description
             "'true' if the underlay is committed.";
         }
       }
     }
     // te-link-state-derived

     grouping te-link-underlay-attributes {
       description
         "Attributes for the TE link underlay.";
       reference
         "RFC 4206: Label Switched Paths (LSP) Hierarchy with
          Generalized Multi-Protocol Label Switching (GMPLS)
          Traffic Engineering (TE)";
       leaf enabled {
         type boolean;
         description
           "'true' if the underlay is enabled.
            'false' if the underlay is disabled.";
       }
       container primary-path {
         description
           "The service path on the underlay topology that
            supports this link.";
         uses nw:network-ref;
         list path-element {
           key "path-element-id";
           description
             "A list of path elements describing the service path.";
           leaf path-element-id {
             type uint32;
             description
               "To identify the element in a path.";
           }
           uses te-path-element;
         }
       }
       // primary-path
       list backup-path {
         key "index";
         description
           "A list of backup service paths on the underlay topology that
            protect the underlay primary path.  If the primary path is
            not protected, the list contains zero elements.  If the
            primary path is protected, the list contains one or more
            elements.";
         leaf index {
           type uint32;
           description
             "A sequence number to identify a backup path.";
         }
         uses nw:network-ref;
         list path-element {
           key "path-element-id";
           description
             "A list of path elements describing the backup service
              path.";
           leaf path-element-id {
             type uint32;
             description
               "To identify the element in a path.";
           }
           uses te-path-element;
         }
       }
       // backup-path
       leaf protection-type {
         type identityref {
           base te-types:lsp-protection-type;
         }
         description
           "Underlay protection type desired for this link.";
       }
       container tunnel-termination-points {
         description
           "Underlay TTPs desired for this link.";
         leaf source {
           type binary;
           description
             "Source TTP identifier.";
         }
         leaf destination {
           type binary;
           description
             "Destination TTP identifier.";
         }
       }
       container tunnels {
         description
           "Underlay TE tunnels supporting this TE link.";
         leaf sharing {
           type boolean;
           default "true";
           description
             "'true' if the underlay tunnel can be shared with other
              TE links;
              'false' if the underlay tunnel is dedicated to this
              TE link.
              This leaf is the default option for all TE tunnels
              and may be overridden by the per-TE-tunnel value.";
         }
         list tunnel {
           key "tunnel-name";
           description
             "Zero, one, or more underlay TE tunnels that support this
              TE link.";
           leaf tunnel-name {
             type string;
             description
               "A tunnel name uniquely identifies an underlay TE tunnel,
                used together with the 'source-node' value for this
                link.";
             reference
               "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels";
           }
           leaf sharing {
             type boolean;
             description
               "'true' if the underlay tunnel can be shared with other
                TE links;
                'false' if the underlay tunnel is dedicated to this
                TE link.";
           }
         }
         // tunnel
       }
       // tunnels
     }
     // te-link-underlay-attributes

Part 12 wrap-up! The link info, ISCD, link state and underlay groupings are all in, with the labels and comments exactly where they belong πŸŽ€βœ¨

grouping te-node-augment { description "Augmentation for a TE node."; uses te-node-config; uses te-node-state-derived; container statistics { config false; description "Statistics data."; uses statistics-per-node; } list tunnel-termination-point { key "tunnel-tp-id"; description "A termination point can terminate a tunnel."; leaf tunnel-tp-id { type binary; description "TTP identifier."; } uses te-node-tunnel-termination-point-config; leaf oper-status { type te-types:te-oper-status; config false; description "The current operational state of the TTP."; } uses geolocation-container; container statistics { config false; description "Statistics data."; uses statistics-per-ttp; } // Relationship to other TTPs list supporting-tunnel-termination-point { key "node-ref tunnel-tp-ref"; description "Identifies the TTPs on which this TTP depends."; leaf node-ref { type inet:uri; description "This leaf identifies the node in which the supporting TTP is present. This node is either the supporting node or a node in an underlay topology."; } leaf tunnel-tp-ref { type binary; description "Reference to a TTP that is in either the supporting node or a node in an underlay topology."; } } // supporting-tunnel-termination-point } // tunnel-termination-point } // te-node-augment

grouping te-node-config { description "TE node configuration grouping."; leaf-list te-node-template { if-feature "template"; type leafref { path "../../../../te/templates/node-template/name"; } description "The reference to a TE node template."; } uses te-node-config-attributes; } // te-node-config

grouping te-node-config-attributes { description "Configuration node attributes in a TE topology."; container te-node-attributes { description "Contains node attributes in a TE topology."; leaf admin-status { type te-types:te-admin-status; description "The administrative state of the link."; } uses te-node-connectivity-matrices; uses te-node-info-attributes; } } // te-node-config-attributes

grouping te-node-config-attributes-template { description "Configuration node attributes for a template in a TE topology."; container te-node-attributes { description "Contains node attributes in a TE topology."; leaf admin-status { type te-types:te-admin-status; description "The administrative state of the link."; } uses te-node-info-attributes; } } // te-node-config-attributes-template

grouping te-node-connectivity-matrices { description "Connectivity matrix on a TE node."; container connectivity-matrices { description "Contains a connectivity matrix on a TE node."; leaf number-of-entries { type uint16; description "The number of connectivity matrix entries. If this number is specified in the configuration request, the number is the requested number of entries, which may not all be listed in the list; if this number is reported in the state data, the number is the current number of operational entries."; } uses te-types:label-set-info; uses connectivity-matrix-entry-path-attributes; list connectivity-matrix { key "id"; description "Represents a node's switching limitations, i.e., limitations in the interconnecting network TE links across the node."; reference "RFC 7579: General Network Element Constraint Encoding for GMPLS-Controlled Networks"; leaf id { type uint32; description "Identifies the connectivity matrix entry."; } } // connectivity-matrix } // connectivity-matrices } // te-node-connectivity-matrices

grouping te-node-connectivity-matrix-attributes { description "Termination point references of a connectivity matrix entry."; container from { description "Reference to a source LTP."; leaf tp-ref { type leafref { path "../../../../../../nt:termination-point/nt:tp-id"; } description "Relative reference to a termination point."; } uses te-types:label-set-info; } container to { description "Reference to a destination LTP."; leaf tp-ref { type leafref { path "../../../../../../nt:termination-point/nt:tp-id"; } description "Relative reference to a termination point."; } uses te-types:label-set-info; } uses connectivity-matrix-entry-path-attributes; } // te-node-connectivity-matrix-attributes

grouping te-node-info-attributes { description "Advertised TE information attributes."; leaf domain-id { type uint32; description "Identifies the domain to which this node belongs. This attribute is used to support inter-domain links."; reference "RFC 5152: A Per-Domain Path Computation Method for Establishing Inter-Domain Traffic Engineering (TE) Label Switched Paths (LSPs) RFC 5316: ISIS Extensions in Support of Inter-Autonomous System (AS) MPLS and GMPLS Traffic Engineering RFC 5392: OSPF Extensions in Support of Inter-Autonomous System (AS) MPLS and GMPLS Traffic Engineering"; } leaf is-abstract { type empty; description "Present if the node is abstract; not present if the node is actual."; } leaf name { type string; description "Node name."; } leaf-list signaling-address { type inet:ip-address; description "The node's signaling address."; } container underlay-topology { if-feature "te-topology-hierarchy"; description "When an abstract node encapsulates a topology, the attributes in this container point to said topology."; uses nw:network-ref; } } // te-node-info-attributes

grouping te-node-state-derived { description "Node state attributes in a TE topology."; leaf oper-status { type te-types:te-oper-status; config false; description "The current operational state of the node."; } uses geolocation-container; leaf is-multi-access-dr { type empty; config false; description "The presence of this attribute indicates that this TE node is a pseudonode elected as a designated router."; reference "RFC 1195: Use of OSI IS-IS for Routing in TCP/IP and Dual Environments RFC 3630: Traffic Engineering (TE) Extensions to OSPF Version 2"; } uses information-source-per-node-attributes; list information-source-entry { key "information-source information-source-instance"; config false; description "A list of information sources learned, including the source that is used."; uses information-source-per-node-attributes; uses te-node-connectivity-matrices; uses te-node-info-attributes; } } // te-node-state-derived

grouping te-node-tunnel-termination-point-config { description "Termination capability of a TTP on a TE node."; uses te-node-tunnel-termination-point-config-attributes; container local-link-connectivities { description "Contains an LLCL for a TTP on a TE node."; leaf number-of-entries { type uint16; description "The number of LLCL entries. If this number is specified in the configuration request, the number is the requested number of entries, which may not all be listed in the list; if this number is reported in the state data, the number is the current number of operational entries."; } uses te-types:label-set-info; uses connectivity-matrix-entry-path-attributes; } } // te-node-tunnel-termination-point-config

okay bestie, we're deep in the groupings now and the termination point stuff is giving everything πŸ’…βœ¨

     grouping te-node-tunnel-termination-point-config-attributes {
       description
         "Configuration attributes of a TTP on a TE node.";
       leaf admin-status {
         type te-types:te-admin-status;
         description
           "The administrative state of the TTP.";
       }
       leaf name {
         type string;
         description
           "A descriptive name for the TTP.";
       }
       leaf switching-capability {
         type identityref {
           base te-types:switching-capabilities;
         }
         description
           "Switching capability for this interface.";
       }
       leaf encoding {
         type identityref {
           base te-types:lsp-encoding-types;
         }
         description
           "Encoding supported by this interface.";
       }
       leaf-list inter-layer-lock-id {
         type uint32;
         description
           "Inter-layer lock ID, used for path computation in a TE
            topology covering multiple layers or multiple regions.";
         reference
           "RFC 5212: Requirements for GMPLS-Based Multi-Region and
            Multi-Layer Networks (MRN/MLN)
            RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions
            for Multi-Layer and Multi-Region Networks (MLN/MRN)";
       }
       leaf protection-type {
         type identityref {
           base te-types:lsp-protection-type;
         }
         description
           "The protection type that this TTP is capable of.";
       }
       container client-layer-adaptation {
         description
           "Contains capability information to support a client-layer
            adaptation in a multi-layer topology.";
         list switching-capability {
           key "switching-capability encoding";
           description
             "List of supported switching capabilities.";
           reference
             "RFC 4202: Routing Extensions in Support of
              Generalized Multi-Protocol Label Switching (GMPLS)
              RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions
              for Multi-Layer and Multi-Region Networks (MLN/MRN)";
           leaf switching-capability {
             type identityref {
               base te-types:switching-capabilities;
             }
             description
               "Switching capability for the client-layer adaptation.";
           }
           leaf encoding {
             type identityref {
               base te-types:lsp-encoding-types;
             }
             description
               "Encoding supported by the client-layer adaptation.";
           }
           uses te-types:te-bandwidth;
         }
       }
     }
     // te-node-tunnel-termination-point-config-attributes

     grouping te-node-tunnel-termination-point-llc-list {
       description
         "LLCL of a TTP on a TE node.";
       list local-link-connectivity {
         key "link-tp-ref";
         description
           "The termination capabilities between the TTP and the LTP.
            This capability information can be used to compute
            the tunnel path.
            The Interface Adjustment Capability Descriptors (IACDs)
            (defined in RFC 6001) on each LTP can be derived from
            this list.";
         reference
           "RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions
            for Multi-Layer and Multi-Region Networks (MLN/MRN)";
         leaf link-tp-ref {
           type leafref {
             path "../../../../../nt:termination-point/nt:tp-id";
           }
           description
             "LTP.";
         }
         uses te-types:label-set-info;
         uses connectivity-matrix-entry-path-attributes;
       }
     }
     // te-node-tunnel-termination-point-llc-list

     grouping te-path-element {
       description
         "A group of attributes defining an element in a TE path,
          such as a TE node, TE link, TE atomic resource, or label.";
       uses te-types:explicit-route-hop;
     }
     // te-path-element

     grouping te-termination-point-augment {
       description
         "Augmentation for a TE termination point.";
       leaf te-tp-id {
         type te-types:te-tp-id;
         description
           "An identifier that uniquely identifies a TE termination
            point.";
       }
       container te {
         must '../te-tp-id';
         presence "TE support";
         description
           "Indicates TE support.";
         uses te-termination-point-config;
         leaf oper-status {
           type te-types:te-oper-status;
           config false;
           description
             "The current operational state of the LTP.";
         }
         uses geolocation-container;
       }
     }
     // te-termination-point-augment

     grouping te-termination-point-config {
       description
         "TE termination point configuration grouping.";
       leaf admin-status {
         type te-types:te-admin-status;
         description
           "The administrative state of the LTP.";
       }
       leaf name {
         type string;
         description
           "A descriptive name for the LTP.";
       }
       uses interface-switching-capability-list;
       leaf inter-domain-plug-id {
         type binary;
         description
           "A network-wide unique number that identifies on the
            network a connection that supports a given inter-domain
            TE link.  This is a more flexible alternative to specifying
            'remote-te-node-id' and 'remote-te-link-tp-id' on a TE link
            when the provider either does not know 'remote-te-node-id'
            and 'remote-te-link-tp-id' or needs to give the client the
            flexibility to mix and match multiple topologies.";
       }
       leaf-list inter-layer-lock-id {
         type uint32;
         description
           "Inter-layer lock ID, used for path computation in a TE
            topology covering multiple layers or multiple regions.";
         reference
           "RFC 5212: Requirements for GMPLS-Based Multi-Region and
            Multi-Layer Networks (MRN/MLN)
            RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions
            for Multi-Layer and Multi-Region Networks (MLN/MRN)";
       }
     }
     // te-termination-point-config

     grouping te-topologies-augment {
       description
         "Augmentation for TE topologies.";
       container te {
         presence "TE support";
         description
           "Indicates TE support.";
         container templates {
           description
             "Configuration parameters for templates used for a TE
              topology.";
           list node-template {
             if-feature "template";
             key "name";
             leaf name {
               type te-types:te-template-name;
               description
                 "The name to identify a TE node template.";
             }
             description
               "The list of TE node templates used to define sharable
                and reusable TE node attributes.";
             uses template-attributes;
             uses te-node-config-attributes-template;
           }
           // node-template
           list link-template {
             if-feature "template";
             key "name";
             leaf name {
               type te-types:te-template-name;
               description
                 "The name to identify a TE link template.";
             }
             description
               "The list of TE link templates used to define sharable
                and reusable TE link attributes.";
             uses template-attributes;
             uses te-link-config-attributes;
           }
           // link-template
         }
         // templates
       }
       // te
     }
     // te-topologies-augment

     grouping te-topology-augment {
       description
         "Augmentation for a TE topology.";
       uses te-types:te-topology-identifier;
       container te {
         must '../te-topology-identifier/provider-id'
            + ' and ../te-topology-identifier/client-id'
            + ' and ../te-topology-identifier/topology-id';
         presence "TE support";
         description
           "Indicates TE support.";
         uses te-topology-config;
         uses geolocation-container;
       }
     }
     // te-topology-augment

     grouping te-topology-config {
       description
         "TE topology configuration grouping.";
       leaf name {
         type string;
         description
           "Name of the TE topology.  This attribute is optional and can
            be specified by the operator to describe the TE topology,
            which can be useful when 'network-id' (RFC 8345) is not
            descriptive and not modifiable because of being generated
            by the system.";
         reference
           "RFC 8345: A YANG Data Model for Network Topologies";
       }
       leaf preference {
         type uint8 {
           range "1..255";
         }
         description
           "Specifies a preference for this topology.  A lower number
            indicates a higher preference.";
       }
       leaf optimization-criterion {
         type identityref {
           base te-types:objective-function-type;
         }
         description
           "Optimization criterion applied to this topology.";
         reference
           "RFC 3272: Overview and Principles of Internet Traffic
            Engineering";
       }
       list nsrlg {
         if-feature "nsrlg";
         key "id";
         description
           "List of NSRLGs (Non-Shared Risk Link Groups).";
         reference
           "RFC 4872: RSVP-TE Extensions in Support of End-to-End
            Generalized Multi-Protocol Label Switching (GMPLS)
            Recovery";
         leaf id {
           type uint32;
           description
             "Identifies the NSRLG entry.";
         }
         leaf disjointness {
           type te-types:te-path-disjointness;
           description
             "The type of resource disjointness.";
         }
       }
       // nsrlg
     }
     // te-topology-config

     grouping template-attributes {
       description
         "Common attributes for all templates.";
       leaf priority {
         type uint16;
         description
           "The preference value for resolving conflicts between
            different templates.  When two or more templates specify
            values for one configuration attribute, the value from the
            template with the highest priority is used.
            A lower number indicates a higher priority.  The highest
            priority is 0.";
       }
       leaf reference-change-policy {
         type enumeration {
           enum no-action {
             description
               "When an attribute changes in this template, the
                configuration node referring to this template does
                not take any action.";
           }
           enum not-allowed {
             description
               "When any configuration object has a reference to this
                template, changing this template is not allowed.";
           }
           enum cascade {
             description
               "When an attribute changes in this template, the
                configuration object referring to this template applies
                the new attribute value to the corresponding
                configuration.";
           }
         }
         description
           "This attribute specifies the action taken for a
            configuration node that has a reference to this template.";
       }
     }
     // template-attributes

     /*
      * Data nodes
      */

the templates bit is clutch, the reference-change-policy has three flavours: no-action, not-allowed and cascade 🫢

     augment "/nw:networks/nw:network/nw:network-types" {
       description
         "Introduces a new network type for a TE topology.";
       container te-topology {
         presence "Indicates a TE topology";
         description
           "Its presence identifies the TE topology type.";
       }
     }

     augment "/nw:networks" {
       description
         "Augmentation parameters for TE topologies.";
       uses te-topologies-augment;
     }

     augment "/nw:networks/nw:network" {
       when 'nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Configuration parameters for a TE topology.";
       uses te-topology-augment;
     }

     augment "/nw:networks/nw:network/nw:node" {
       when '../nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Configuration parameters for TE at the node level.";
       leaf te-node-id {
         type te-types:te-node-id;
         description
           "The identifier of a node in the TE topology.
            A node is specific to a topology to which it belongs.";
       }
       container te {
         must '../te-node-id' {
           description
             "'te-node-id' is mandatory.";
         }
         must 'count(../nw:supporting-node)<=1' {
           description
             "For a node in a TE topology, there cannot be more
              than one supporting node.  If multiple nodes are
              abstracted, the 'underlay-topology' field is used.";
         }
         presence "TE support";
         description
           "Indicates TE support.";
         uses te-node-augment;
       }
     }

     augment "/nw:networks/nw:network/nt:link" {
       when '../nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Configuration parameters for TE at the link level.";
       container te {
         must 'count(../nt:supporting-link)<=1' {
           description
             "For a link in a TE topology, there cannot be more
              than one supporting link.  If one or more link paths are
              abstracted, the underlay is used.";
         }
         presence "TE support";
         description
           "Indicates TE support.";
         uses te-link-augment;
       }
     }

     augment "/nw:networks/nw:network/nw:node/"
           + "nt:termination-point" {
       when '../../nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Configuration parameters for TE at the termination point
          level.";
       uses te-termination-point-augment;
     }

     augment "/nw:networks/nw:network/nt:link/te/bundle-stack-level/"
           + "bundle/bundled-links/bundled-link" {
       when '../../../../nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Augmentation for a TE bundled link.";
       leaf src-tp-ref {
         type leafref {
           path "../../../../../nw:node[nw:node-id = "
              + "current()/../../../../nt:source/"
              + "nt:source-node]/"
              + "nt:termination-point/nt:tp-id";
           require-instance true;
         }
         description
           "Reference to another TE termination point on the
            same source node.";
       }
       leaf des-tp-ref {
         type leafref {
           path "../../../../../nw:node[nw:node-id = "
              + "current()/../../../../nt:destination/"
              + "nt:dest-node]/"
              + "nt:termination-point/nt:tp-id";
           require-instance true;
         }
         description
           "Reference to another TE termination point on the
            same destination node.";
       }
     }

     augment "/nw:networks/nw:network/nw:node/te/"
           + "information-source-entry/connectivity-matrices/"
           + "connectivity-matrix" {
       when '../../../../../nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Augmentation for the TE node connectivity matrix.";
       uses te-node-connectivity-matrix-attributes;
     }

     augment "/nw:networks/nw:network/nw:node/te/te-node-attributes/"
           + "connectivity-matrices/connectivity-matrix" {
       when '../../../../../nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Augmentation for the TE node connectivity matrix.";
       uses te-node-connectivity-matrix-attributes;
     }

     augment "/nw:networks/nw:network/nw:node/te/"
           + "tunnel-termination-point/local-link-connectivities" {
       when '../../../../nw:network-types/tet:te-topology' {
         description
           "Augmentation parameters apply only for networks with a
            TE topology type.";
       }
       description
         "Augmentation for TE node TTP LLCs (Local Link
          Connectivities).";
       uses te-node-tunnel-termination-point-llc-list;
     }
   }
   <CODE ENDS>

8. Security Considerations ✨

okay bestie, this part is SERIOUS, so let's be real 🫢 The YANG module in this doc defines a schema for data that's meant to be reached through network management protocols like NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer is the secure transport layer, and the mandatory-to-implement secure transport there is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer is HTTPS, and the mandatory-to-implement secure transport there is TLS [RFC8446]. πŸ”

The Network Configuration Access Control Model (NACM) [RFC8341] is how you restrict access for particular NETCONF or RESTCONF users, so they only get a preconfigured subset of the available protocol operations and content. It's giving gatekeeper energy πŸ’…

Now, there are a bunch of data nodes in this module that are writable, creatable, and deletable (that's config true, which is the default). These can be sensitive or vulnerable depending on the network environment 😬 Writing to them without proper protection (like an edit-config) can seriously mess with network operations. Here are the subtrees and why they're sensitive:

  • /nw:networks/nw:network/nw:network-types/tet:te-topology

This subtree specifies the TE topology type. Changing the configuration can make the TE topology type invalid. If someone does that on purpose, a malicious attacker could disable the TE capabilities on the related networks and cause traffic to be disrupted or misrouted. πŸ’€

  • /nw:networks/tet:te

This subtree specifies the TE node templates and TE link templates. Changing the configuration here changes future TE configurations. A malicious attacker could alter TE capabilities scheduled for a later time, causing traffic to be disrupted or misrouted. πŸ™ˆ

  • /nw:networks/nw:network

This subtree specifies the topology-wide configurations, including the TE topology ID and topology-wide policies. Changing the configuration here can add, remove, or modify TE topologies. A malicious attacker who adds a TE topology could create an unauthorized traffic network. Removing or modifying a TE topology could cause traffic to be disabled or misrouted in that topology, and those traffic changes can also hit the connected TE topologies. 🌈

  • /nw:networks/nw:network/nw:node

This subtree specifies the configurations for TE nodes. Changing the configuration here can add, remove, or modify TE nodes. A malicious attacker who adds a TE node could create an unauthorized traffic path. Removing or modifying a TE node could cause traffic to be disabled or misrouted at that node. These traffic changes can also affect the surrounding TE nodes and TE links in this TE topology and the connected TE topologies. 🚨

  • /nw:networks/nw:network/nt:link/tet:te

This subtree specifies the configurations for TE links. Changing the configuration here can add, remove, or modify TE links. A malicious attacker who adds a TE link could create an unauthorized traffic path. Removing or modifying a TE link could cause traffic to be disabled or misrouted on that link. These traffic changes can also affect the surrounding TE nodes and TE links in this TE topology and the connected TE topologies. ⚑

  • /nw:networks/nw:network/nw:node/nt:termination-point

This subtree specifies the configurations of TE LTPs. Changing the configuration here can add, remove, or modify TE LTPs. A malicious attacker who adds a TE LTP could create an unauthorized traffic path. Removing or modifying a TE LTP could cause traffic to be disabled or misrouted on that LTP. These traffic changes can also affect the surrounding TE nodes and TE links in this TE topology and the connected TE topologies. πŸ¦‹

Some of the readable data nodes in this module can also be sensitive or vulnerable depending on the environment, so it's important to control read access to them (for example, via get, get-config, or notification) πŸ‘€ Here are the subtrees and why they matter:

  • /nw:networks/nw:network/nw:network-types/tet:te-topology

Unauthorized access to this subtree can disclose the TE topology type.

  • /nw:networks/tet:te

Unauthorized access to this subtree can disclose the TE node templates and TE link templates.

  • /nw:networks/nw:network

Unauthorized access to this subtree can disclose the topology-wide configurations, including the TE topology ID, the topology-wide policies, and the topology geolocation. 🌍

  • /nw:networks/nw:network/nw:node

Unauthorized access to this subtree can disclose the operational state information of TE nodes.

  • /nw:networks/nw:network/nt:link/tet:te

Unauthorized access to this subtree can disclose the operational state information of TE links.

  • /nw:networks/nw:network/nw:node/nt:termination-point

Unauthorized access to this subtree can disclose the operational state information of TE LTPs.

Locking down who can read AND write these subtrees is non-negotiable, bestie. Treat it like your diary with a very strong lock πŸ”₯

9. IANA Considerations ✨

okay so IANA is the registry keeper πŸ’… and this part is literally them saying "we got you, bestie." IANA has registered the following URIs in the "ns" subregistry within the "IETF XML Registry" [RFC3688] πŸŽ€

URI:  urn:ietf:params:xml:ns:yang:ietf-te-topology
Registrant Contact:  The IESG.
XML:  N/A; the requested URI is an XML namespace.

URI:  urn:ietf:params:xml:ns:yang:ietf-te-topology-state
Registrant Contact:  The IESG.
XML:  N/A; the requested URI is an XML namespace.

the two namespace URIs are registered under the IESG, so they're officially on the list now πŸ¦‹

IANA has also registered the following YANG modules in the "YANG Module Names" subregistry [RFC6020] within the "YANG Parameters" registry. The module pair is giving "matching set" energy 🧚

Name:  ietf-te-topology
Namespace:  urn:ietf:params:xml:ns:yang:ietf-te-topology
Prefix:  tet
Reference:  RFC 8795

Name:  ietf-te-topology-state
Namespace:  urn:ietf:params:xml:ns:yang:ietf-te-topology-state
Prefix:  tet-s
Reference:  RFC 8795

10. References πŸ“š

10.1. Normative References

ngl this list is the whole squad of docs we lean on to make this work 🫢 here they are, every single one, exactly as they're written πŸ’œ

[RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
           Requirement Levels", BCP 14, RFC 2119,
           DOI 10.17487/RFC2119, March 1997,
           <https://www.rfc-editor.org/info/rfc2119>.

[RFC3688]  Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
           DOI 10.17487/RFC3688, January 2004,
           <https://www.rfc-editor.org/info/rfc3688>.

[RFC3945]  Mannie, E., Ed., "Generalized Multi-Protocol Label
           Switching (GMPLS) Architecture", RFC 3945,
           DOI 10.17487/RFC3945, October 2004,
           <https://www.rfc-editor.org/info/rfc3945>.

[RFC6020]  Bjorklund, M., Ed., "YANG - A Data Modeling Language for
           the Network Configuration Protocol (NETCONF)", RFC 6020,
           DOI 10.17487/RFC6020, October 2010,
           <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241]  Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed.,
           and A. Bierman, Ed., "Network Configuration Protocol
           (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011,
           <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242]  Wasserman, M., "Using the NETCONF Protocol over Secure
           Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011,
           <https://www.rfc-editor.org/info/rfc6242>.

[RFC6991]  Schoenwaelder, J., Ed., "Common YANG Data Types",
           RFC 6991, DOI 10.17487/RFC6991, July 2013,
           <https://www.rfc-editor.org/info/rfc6991>.

[RFC7926]  Farrel, A., Ed., Drake, J., Bitar, N., Swallow, G.,
           Ceccarelli, D., and X. Zhang, "Problem Statement and
           Architecture for Information Exchange between
           Interconnected Traffic-Engineered Networks", BCP 206,
           RFC 7926, DOI 10.17487/RFC7926, July 2016,
           <https://www.rfc-editor.org/info/rfc7926>.

[RFC7950]  Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
           RFC 7950, DOI 10.17487/RFC7950, August 2016,
           <https://www.rfc-editor.org/info/rfc7950>.

[RFC8040]  Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF
           Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017,
           <https://www.rfc-editor.org/info/rfc8040>.

[RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
           2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
           May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8341]  Bierman, A. and M. Bjorklund, "Network Configuration
           Access Control Model", STD 91, RFC 8341,
           DOI 10.17487/RFC8341, March 2018,
           <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342]  Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K.,
           and R. Wilton, "Network Management Datastore Architecture
           (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018,
           <https://www.rfc-editor.org/info/rfc8342>.

[RFC8345]  Clemm, A., Medved, J., Varga, R., Bahadur, N.,
           Ananthakrishnan, H., and X. Liu, "A YANG Data Model for
           Network Topologies", RFC 8345, DOI 10.17487/RFC8345, March
           2018, <https://www.rfc-editor.org/info/rfc8345>.

[RFC8446]  Rescorla, E., "The Transport Layer Security (TLS) Protocol
           Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
           <https://www.rfc-editor.org/info/rfc8446>.

[RFC8776]  Saad, T., Gandhi, R., Liu, X., Beeram, V., and I. Bryskin,
           "Common YANG Data Types for Traffic Engineering",
           RFC 8776, DOI 10.17487/RFC8776, June 2020,
           <https://www.rfc-editor.org/info/rfc8776>.

10.2. Informative References ✨

okay bestie, here's the reading list πŸ“š these are the extra docs behind the spec, so you can go deeper whenever you want πŸ’…


Appendix A. Complete Model Tree Structure 🌈

module: ietf-te-topology augment /nw:networks/nw:network/nw:network-types: +--rw te-topology! augment /nw:networks: +--rw te! +--rw templates +--rw node-template* [name] {template}?

+--rw name
te-types:te-template-name
+--rw priority? uint16
+--rw reference-change-policy? enumeration
+--rw te-node-attributes
+--rw admin-status? te-types:te-admin-status
+--rw domain-id? uint32
+--rw is-abstract? empty
+--rw name? string
+--rw signaling-address* inet:ip-address
+--rw underlay-topology {te-topology-hierarchy}?
+--rw network-ref?
-> /nw:networks/network/network-id

+--rw link-template* [name] {template}? +--rw name

te-types:te-template-name

+--rw priority? uint16 +--rw reference-change-policy? enumeration +--rw te-link-attributes +--rw access-type?

te-types:te-link-access-type

+--rw external-domain

+--rw network-ref?
-> /nw:networks/network/network-id
+--rw remote-te-node-id? te-types:te-node-id
+--rw remote-te-link-tp-id? te-types:te-tp-id

+--rw is-abstract? empty +--rw name? string +--rw underlay {te-topology-hierarchy}?

+--rw enabled? boolean
+--rw primary-path
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-direction
+--rw backup-path* [index]
+--rw index uint32
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-direction
+--rw protection-type? identityref
+--rw tunnel-termination-points
+--rw source? binary
+--rw destination? binary
+--rw tunnels
+--rw sharing? boolean
+--rw tunnel* [tunnel-name]
+--rw tunnel-name string
+--rw sharing? boolean

+--rw admin-status?

te-types:te-admin-status

+--rw link-index? uint64 +--rw administrative-group?

te-types:admin-groups

+--rw interface-switching-capability*

[switching-capability encoding]
+--rw switching-capability identityref
+--rw encoding identityref
+--rw max-lsp-bandwidth* [priority]
+--rw priority uint8
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth

+--rw label-restrictions

+--rw label-restriction* [index]
+--rw restriction? enumeration
+--rw index uint32
+--rw label-start
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label
+--rw direction? te-label-direction
+--rw label-end
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label
+--rw direction? te-label-direction
+--rw label-step
+--rw (technology)?
+--:(generic)
+--rw generic? int32
+--rw range-bitmap? yang:hex-string

+--rw link-protection-type? identityref +--rw max-link-bandwidth

+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth

+--rw max-resv-link-bandwidth

+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth

+--rw unreserved-bandwidth* [priority]

+--rw priority uint8
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth

+--rw te-default-metric? uint32 +--rw te-delay-metric? uint32 +--rw te-igp-metric? uint32 +--rw te-srlgs

+--rw value* te-types:srlg

+--rw te-nsrlgs {nsrlg}? +--rw id* uint32 augment /nw:networks/nw:network: +--rw te-topology-identifier

+--rw provider-id? te-global-id
+--rw client-id? te-global-id
+--rw topology-id? te-topology-id

+--rw te! +--rw name? string +--rw preference? uint8 +--rw optimization-criterion? identityref +--rw nsrlg* [id] {nsrlg}?

+--rw id uint32
+--rw disjointness? te-types:te-path-disjointness

+--ro geolocation +--ro altitude? int64 +--ro latitude? geographic-coordinate-degree +--ro longitude? geographic-coordinate-degree augment /nw:networks/nw:network/nw:node: +--rw te-node-id? te-types:te-node-id +--rw te! +--rw te-node-template*

-> ../../../../te/templates/node-template/name
{template}?

+--rw te-node-attributes

+--rw admin-status? te-types:te-admin-status
+--rw connectivity-matrices
+--rw number-of-entries? uint16
+--rw label-restrictions
+--rw label-restriction* [index]
+--rw restriction? enumeration
+--rw index uint32
+--rw label-start
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label
+--rw direction? te-label-direction
+--rw label-end
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label

okay the tree is literally giving 🌳✨ here's the next chunk, no cap

          |  |  |     |     +--rw direction?       te-label-direction
          |  |  |     +--rw label-step
          |  |  |     |  +--rw (technology)?
          |  |  |     |     +--:(generic)
          |  |  |     |        +--rw generic?   int32
          |  |  |     +--rw range-bitmap?   yang:hex-string
          |  |  +--rw is-allowed?            boolean
          |  |  +--rw underlay {te-topology-hierarchy}?
          |  |  |  +--rw enabled?                     boolean
          |  |  |  +--rw primary-path
          |  |  |  |  +--rw network-ref?
          |  |  |  |  |       -> /nw:networks/network/network-id
          |  |  |  |  +--rw path-element* [path-element-id]
          |  |  |  |     +--rw path-element-id              uint32
          |  |  |  |     +--rw (type)?
          |  |  |  |        +--:(numbered-node-hop)
          |  |  |  |        |  +--rw numbered-node-hop
          |  |  |  |        |     +--rw node-id     te-node-id
          |  |  |  |        |     +--rw hop-type?   te-hop-type
          |  |  |  |        +--:(numbered-link-hop)
          |  |  |  |        |  +--rw numbered-link-hop
          |  |  |  |        |     +--rw link-tp-id    te-tp-id
          |  |  |  |        |     +--rw hop-type?     te-hop-type
          |  |  |  |        |     +--rw direction?    te-link-direction
          |  |  |  |        +--:(unnumbered-link-hop)
          |  |  |  |        |  +--rw unnumbered-link-hop
          |  |  |  |        |     +--rw link-tp-id    te-tp-id
          |  |  |  |        |     +--rw node-id       te-node-id
          |  |  |  |        |     +--rw hop-type?     te-hop-type
          |  |  |  |        |     +--rw direction?    te-link-direction
          |  |  |  |        +--:(as-number)
          |  |  |  |        |  +--rw as-number-hop
          |  |  |  |        |     +--rw as-number    inet:as-number
          |  |  |  |        |     +--rw hop-type?    te-hop-type
          |  |  |  |        +--:(label)
          |  |  |  |           +--rw label-hop
          |  |  |  |              +--rw te-label
          |  |  |  |                 +--rw (technology)?
          |  |  |  |                 |  +--:(generic)
          |  |  |  |                 |     +--rw generic?
          |  |  |  |                 |             rt-types:generalized-
   label
          |  |  |  |                 +--rw direction?
          |  |  |  |                         te-label-direction
          |  |  |  +--rw backup-path* [index]
          |  |  |  |  +--rw index           uint32
          |  |  |  |  +--rw network-ref?
          |  |  |  |  |       -> /nw:networks/network/network-id
          |  |  |  |  +--rw path-element* [path-element-id]
          |  |  |  |     +--rw path-element-id              uint32
          |  |  |  |     +--rw (type)?
          |  |  |  |        +--:(numbered-node-hop)
          |  |  |  |        |  +--rw numbered-node-hop
          |  |  |  |        |     +--rw node-id     te-node-id
          |  |  |  |        |     +--rw hop-type?   te-hop-type
          |  |  |  |        +--:(numbered-link-hop)
          |  |  |  |        |  +--rw numbered-link-hop
          |  |  |  |        |     +--rw link-tp-id    te-tp-id
          |  |  |  |        |     +--rw hop-type?     te-hop-type
          |  |  |  |        |     +--rw direction?    te-link-direction
          |  |  |  |        +--:(unnumbered-link-hop)
          |  |  |  |        |  +--rw unnumbered-link-hop
          |  |  |  |        |     +--rw link-tp-id    te-tp-id
          |  |  |  |        |     +--rw node-id       te-node-id
          |  |  |  |        |     +--rw hop-type?     te-hop-type
          |  |  |  |        |     +--rw direction?    te-link-direction
          |  |  |  |        +--:(as-number)
          |  |  |  |        |  +--rw as-number-hop
          |  |  |  |        |     +--rw as-number    inet:as-number
          |  |  |  |        |     +--rw hop-type?    te-hop-type
          |  |  |  |        +--:(label)
          |  |  |  |           +--rw label-hop
          |  |  |  |              +--rw te-label
          |  |  |  |                 +--rw (technology)?
          |  |  |  |                 |  +--:(generic)
          |  |  |  |                 |     +--rw generic?
          |  |  |  |                 |             rt-types:generalized-
   label
          |  |  |  |                 +--rw direction?
          |  |  |  |                         te-label-direction
          |  |  |  +--rw protection-type?             identityref
          |  |  |  +--rw tunnel-termination-points
          |  |  |  |  +--rw source?        binary
          |  |  |  |  +--rw destination?   binary
          |  |  |  +--rw tunnels
          |  |  |     +--rw sharing?   boolean
          |  |  |     +--rw tunnel* [tunnel-name]
          |  |  |        +--rw tunnel-name    string
          |  |  |        +--rw sharing?       boolean
          |  |  +--rw path-constraints
          |  |  |  +--rw te-bandwidth
          |  |  |  |  +--rw (technology)?
          |  |  |  |     +--:(generic)
          |  |  |  |        +--rw generic?   te-bandwidth
          |  |  |  +--rw link-protection?          identityref
          |  |  |  +--rw setup-priority?           uint8
          |  |  |  +--rw hold-priority?            uint8
          |  |  |  +--rw signaling-type?           identityref
          |  |  |  +--rw path-metric-bounds
          |  |  |  |  +--rw path-metric-bound* [metric-type]
          |  |  |  |     +--rw metric-type    identityref
          |  |  |  |     +--rw upper-bound?   uint64
          |  |  |  +--rw path-affinities-values
          |  |  |  |  +--rw path-affinities-value* [usage]
          |  |  |  |     +--rw usage    identityref
          |  |  |  |     +--rw value?   admin-groups
          |  |  |  +--rw path-affinity-names
          |  |  |  |  +--rw path-affinity-name* [usage]
          |  |  |  |     +--rw usage            identityref
          |  |  |  |     +--rw affinity-name* [name]
          |  |  |  |        +--rw name    string
          |  |  |  +--rw path-srlgs-lists
          |  |  |  |  +--rw path-srlgs-list* [usage]
          |  |  |  |     +--rw usage     identityref
          |  |  |  |     +--rw values*   srlg
          |  |  |  +--rw path-srlgs-names
          |  |  |  |  +--rw path-srlgs-name* [usage]
          |  |  |  |     +--rw usage    identityref
          |  |  |  |     +--rw names*   string
          |  |  |  +--rw disjointness?             te-path-disjointness
          |  |  +--rw optimizations
          |  |  |  +--rw (algorithm)?
          |  |  |     +--:(metric) {path-optimization-metric}?
          |  |  |     |  +--rw optimization-metric* [metric-type]
          |  |  |     |  |  +--rw metric-type
          |  |  |     |  |  |       identityref
          |  |  |     |  |  +--rw weight?
          |  |  |     |  |  |       uint8
          |  |  |     |  |  +--rw explicit-route-exclude-objects
          |  |  |     |  |  |  +--rw route-object-exclude-object*
          |  |  |     |  |  |          [index]
          |  |  |     |  |  |     +--rw index
          |  |  |     |  |  |     |       uint32
          |  |  |     |  |  |     +--rw (type)?
          |  |  |     |  |  |        +--:(numbered-node-hop)
          |  |  |     |  |  |        |  +--rw numbered-node-hop
          |  |  |     |  |  |        |     +--rw node-id     te-node-id
          |  |  |     |  |  |        |     +--rw hop-type?   te-hop-type
          |  |  |     |  |  |        +--:(numbered-link-hop)
          |  |  |     |  |  |        |  +--rw numbered-link-hop
          |  |  |     |  |  |        |     +--rw link-tp-id    te-tp-id
          |  |  |     |  |  |        |     +--rw hop-type?
          |  |  |     |  |  |        |     |       te-hop-type
          |  |  |     |  |  |        |     +--rw direction?
          |  |  |     |  |  |        |             te-link-direction
          |  |  |     |  |  |        +--:(unnumbered-link-hop)
          |  |  |     |  |  |        |  +--rw unnumbered-link-hop
          |  |  |     |  |  |        |     +--rw link-tp-id    te-tp-id
          |  |  |     |  |  |        |     +--rw node-id
          |  |  |     |  |  |        |     |       te-node-id
          |  |  |     |  |  |        |     +--rw hop-type?
          |  |  |     |  |  |        |     |       te-hop-type
          |  |  |     |  |  |        |     +--rw direction?
          |  |  |     |  |  |        |             te-link-direction
          |  |  |     |  |  |        +--:(as-number)
          |  |  |     |  |  |        |  +--rw as-number-hop
          |  |  |     |  |  |        |     +--rw as-number
          |  |  |     |  |  |        |     |       inet:as-number
          |  |  |     |  |  |        |     +--rw hop-type?
          |  |  |     |  |  |        |             te-hop-type
          |  |  |     |  |  |        +--:(label)
          |  |  |     |  |  |        |  +--rw label-hop
          |  |  |     |  |  |        |     +--rw te-label
          |  |  |     |  |  |        |        +--rw (technology)?
          |  |  |     |  |  |        |        |  +--:(generic)
          |  |  |     |  |  |        |        |     +--rw generic?
          |  |  |     |  |  |        |        |             rt-
   types:generalized-label
          |  |  |     |  |  |        |        +--rw direction?
          |  |  |     |  |  |        |                te-label-direction
          |  |  |     |  |  |        +--:(srlg)
          |  |  |     |  |  |           +--rw srlg
          |  |  |     |  |  |              +--rw srlg?   uint32
          |  |  |     |  |  +--rw explicit-route-include-objects
          |  |  |     |  |     +--rw route-object-include-object*
          |  |  |     |  |             [index]
          |  |  |     |  |        +--rw index
          |  |  |     |  |        |       uint32
          |  |  |     |  |        +--rw (type)?
          |  |  |     |  |           +--:(numbered-node-hop)
          |  |  |     |  |           |  +--rw numbered-node-hop
          |  |  |     |  |           |     +--rw node-id     te-node-id
          |  |  |     |  |           |     +--rw hop-type?   te-hop-type
          |  |  |     |  |           +--:(numbered-link-hop)
          |  |  |     |  |           |  +--rw numbered-link-hop
          |  |  |     |  |           |     +--rw link-tp-id    te-tp-id
          |  |  |     |  |           |     +--rw hop-type?
          |  |  |     |  |           |     |       te-hop-type
          |  |  |     |  |           |     +--rw direction?
          |  |  |     |  |           |             te-link-direction
          |  |  |     |  |           +--:(unnumbered-link-hop)
          |  |  |     |  |           |  +--rw unnumbered-link-hop
          |  |  |     |  |           |     +--rw link-tp-id    te-tp-id
          |  |  |     |  |           |     +--rw node-id
          |  |  |     |  |           |     |       te-node-id
          |  |  |     |  |           |     +--rw hop-type?
          |  |  |     |  |           |     |       te-hop-type
          |  |  |     |  |           |     +--rw direction?
          |  |  |     |  |           |             te-link-direction
          |  |  |     |  |           +--:(as-number)
          |  |  |     |  |           |  +--rw as-number-hop
          |  |  |     |  |           |     +--rw as-number
          |  |  |     |  |           |     |       inet:as-number
          |  |  |     |  |           |     +--rw hop-type?
          |  |  |     |  |           |             te-hop-type
          |  |  |     |  |           +--:(label)
          |  |  |     |  |              +--rw label-hop
          |  |  |     |  |                 +--rw te-label
          |  |  |     |  |                    +--rw (technology)?
          |  |  |     |  |                    |  +--:(generic)
          |  |  |     |  |                    |     +--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-direction
+--rw tiebreakers
+--rw tiebreaker* [tiebreaker-type]
+--rw tiebreaker-type identityref
+--:(objective-function)
{path-optimization-objective-function}?
+--rw objective-function
+--rw objective-function-type? identityref
+--ro path-properties
+--ro path-metric* [metric-type]
+--ro metric-type identityref
+--ro accumulative-value? uint64
+--ro path-affinities-values
+--ro path-affinities-value* [usage]
+--ro usage identityref
+--ro value? admin-groups
+--ro path-affinity-names
+--ro path-affinity-name* [usage]
+--ro usage identityref
+--ro affinity-name* [name]
+--ro name string
+--ro path-srlgs-lists
+--ro path-srlgs-list* [usage]
+--ro usage identityref
+--ro values* srlg
+--ro path-srlgs-names
+--ro path-srlgs-name* [usage]
+--ro usage identityref
+--ro names* string
+--ro path-route-objects
+--ro path-route-object* [index]
+--ro index uint32
+--ro (type)?
+--:(numbered-node-hop)
+--ro numbered-node-hop
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--:(numbered-link-hop)
+--ro numbered-link-hop
+--ro link-tp-id te-tp-id
+--ro hop-type? te-hop-type
+--ro direction? te-link-direction
+--:(unnumbered-link-hop)
+--ro unnumbered-link-hop
+--ro link-tp-id te-tp-id
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--ro direction? te-link-direction
+--:(as-number)
+--ro as-number-hop
+--ro as-number inet:as-number
+--ro hop-type? te-hop-type
+--:(label)
+--ro label-hop
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-types:generalized-

label

+--ro direction?
te-label-direction
+--rw connectivity-matrix* [id]
+--rw id uint32
+--rw from
+--rw tp-ref? leafref
+--rw label-restrictions
+--rw label-restriction* [index]
+--rw restriction? enumeration
+--rw index uint32
+--rw label-start
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw label-end
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw label-step
+--rw (technology)?
+--:(generic)
+--rw generic? int32
+--rw range-bitmap? yang:hex-string
+--rw to
+--rw tp-ref? leafref
+--rw label-restrictions
+--rw label-restriction* [index]
+--rw restriction? enumeration
+--rw index uint32
+--rw label-start
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw label-end
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw label-step
+--rw (technology)?
+--:(generic)
+--rw generic? int32
+--rw range-bitmap? yang:hex-string
+--rw is-allowed? boolean
+--rw underlay {te-topology-hierarchy}?
+--rw enabled? boolean
+--rw primary-path
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-direction
+--rw backup-path* [index]
+--rw index uint32
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-direction
+--rw protection-type? identityref
+--rw tunnel-termination-points
+--rw source? binary
+--rw destination? binary
+--rw tunnels
+--rw sharing? boolean
+--rw tunnel* [tunnel-name]
+--rw tunnel-name string
+--rw sharing? boolean
+--rw path-constraints
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth
+--rw link-protection? identityref
+--rw setup-priority? uint8

Okay bestie, this part is the YANG tree getting deep 🌳✨ we're still inside the path-computation branches, with path metric bounds, affinities, SRLGs, tiebreakers, and the objective function all stacked together like a whole outfit πŸ’… and then the path-properties block shows up with its own read-only vibe 🧚

          |  |     |  +--rw hold-priority?            uint8
          |  |     |  +--rw signaling-type?           identityref
          |  |     |  +--rw path-metric-bounds
          |  |     |  |  +--rw path-metric-bound* [metric-type]
          |  |     |  |     +--rw metric-type    identityref
          |  |     |  |     +--rw upper-bound?   uint64
          |  |     |  +--rw path-affinities-values
          |  |     |  |  +--rw path-affinities-value* [usage]
          |  |     |  |     +--rw usage    identityref
          |  |     |  |     +--rw value?   admin-groups
          |  |     |  +--rw path-affinity-names
          |  |     |  |  +--rw path-affinity-name* [usage]
          |  |     |  |     +--rw usage            identityref
          |  |     |  |     +--rw affinity-name* [name]
          |  |     |  |        +--rw name    string
          |  |     |  +--rw path-srlgs-lists
          |  |     |  |  +--rw path-srlgs-list* [usage]
          |  |     |  |     +--rw usage     identityref
          |  |     |  |     +--rw values*   srlg
          |  |     |  +--rw path-srlgs-names
          |  |     |  |  +--rw path-srlgs-name* [usage]
          |  |     |  |     +--rw usage    identityref
          |  |     |  |     +--rw names*   string
          |  |     |  +--rw disjointness?
          |  |     |          te-path-disjointness
          |  |     +--rw optimizations
          |  |     |  +--rw (algorithm)?
          |  |     |     +--:(metric) {path-optimization-metric}?
          |  |     |     |  +--rw optimization-metric* [metric-type]
          |  |     |     |  |  +--rw metric-type
          |  |     |     |  |  |       identityref
          |  |     |     |  |  +--rw weight?
          |  |     |     |  |  |       uint8
          |  |     |     |  |  +--rw explicit-route-exclude-objects
          |  |     |     |  |  |  +--rw route-object-exclude-object*
          |  |     |     |  |  |          [index]
          |  |     |     |  |  |     +--rw index
          |  |     |     |  |  |     |       uint32
          |  |     |     |  |  |     +--rw (type)?
          |  |     |     |  |  |        +--:(numbered-node-hop)
          |  |     |     |  |  |        |  +--rw numbered-node-hop
          |  |     |     |  |  |        |     +--rw node-id
          |  |     |     |  |  |        |     |       te-node-id
          |  |     |     |  |  |        |     +--rw hop-type?
          |  |     |     |  |  |        |             te-hop-type
          |  |     |     |  |  |        +--:(numbered-link-hop)
          |  |     |     |  |  |        |  +--rw numbered-link-hop
          |  |     |     |  |  |        |     +--rw link-tp-id
          |  |     |     |  |  |        |     |       te-tp-id
          |  |     |     |  |  |        |     +--rw hop-type?
          |  |     |     |  |  |        |     |       te-hop-type
          |  |     |     |  |  |        |     +--rw direction?
          |  |     |     |  |  |        |             te-link-direction
          |  |     |     |  |  |        +--:(unnumbered-link-hop)
          |  |     |     |  |  |        |  +--rw unnumbered-link-hop
          |  |     |     |  |  |        |     +--rw link-tp-id
          |  |     |     |  |  |        |     |       te-tp-id
          |  |     |     |  |  |        |     +--rw node-id
          |  |     |     |  |  |        |     |       te-node-id
          |  |     |     |  |  |        |     +--rw hop-type?
          |  |     |     |  |  |        |     |       te-hop-type
          |  |     |     |  |  |        |     +--rw direction?
          |  |     |     |  |  |        |             te-link-direction
          |  |     |     |  |  |        +--:(as-number)
          |  |     |     |  |  |        |  +--rw as-number-hop
          |  |     |     |  |  |        |     +--rw as-number
          |  |     |     |  |  |        |     |       inet:as-number
          |  |     |     |  |  |        |     +--rw hop-type?
          |  |     |     |  |  |        |             te-hop-type
          |  |     |     |  |  |        +--:(label)
          |  |     |     |  |  |        |  +--rw label-hop
          |  |     |     |  |  |        |     +--rw te-label
          |  |     |     |  |  |        |        +--rw (technology)?
          |  |     |     |  |  |        |        |  +--:(generic)
          |  |     |     |  |  |        |        |     +--rw generic?
          |  |     |     |  |  |        |        |             rt-
   types:generalized-label
          |  |     |     |  |  |        |        +--rw direction?
          |  |     |     |  |  |        |                te-label-
   direction
          |  |     |     |  |  |        +--:(srlg)
          |  |     |     |  |  |           +--rw srlg
          |  |     |     |  |  |              +--rw srlg?   uint32
          |  |     |     |  |  +--rw explicit-route-include-objects
          |  |     |     |  |     +--rw route-object-include-object*
          |  |     |     |  |             [index]
          |  |     |     |  |        +--rw index
          |  |     |     |  |        |       uint32
          |  |     |     |  |        +--rw (type)?
          |  |     |     |  |           +--:(numbered-node-hop)
          |  |     |     |  |           |  +--rw numbered-node-hop
          |  |     |     |  |           |     +--rw node-id
          |  |     |     |  |           |     |       te-node-id
          |  |     |     |  |           |     +--rw hop-type?
          |  |     |     |  |           |             te-hop-type
          |  |     |     |  |           +--:(numbered-link-hop)
          |  |     |     |  |           |  +--rw numbered-link-hop
          |  |     |     |  |           |     +--rw link-tp-id
          |  |     |     |  |           |     |       te-tp-id
          |  |     |     |  |           |     +--rw hop-type?
          |  |     |     |  |           |     |       te-hop-type
          |  |     |     |  |           |     +--rw direction?
          |  |     |     |  |           |             te-link-direction
          |  |     |     |  |           +--:(unnumbered-link-hop)
          |  |     |     |  |           |  +--rw unnumbered-link-hop
          |  |     |     |  |           |     +--rw link-tp-id
          |  |     |     |  |           |     |       te-tp-id
          |  |     |     |  |           |     +--rw node-id
          |  |     |     |  |           |     |       te-node-id
          |  |     |     |  |           |     +--rw hop-type?
          |  |     |     |  |           |     |       te-hop-type
          |  |     |     |  |           |     +--rw direction?
          |  |     |     |  |           |             te-link-direction
          |  |     |     |  |           +--:(as-number)
          |  |     |     |  |           |  +--rw as-number-hop
          |  |     |     |  |           |     +--rw as-number
          |  |     |     |  |           |     |       inet:as-number
          |  |     |     |  |           |     +--rw hop-type?
          |  |     |     |  |           |             te-hop-type
          |  |     |     |  |           +--:(label)
          |  |     |     |  |              +--rw label-hop
          |  |     |     |  |                 +--rw te-label
          |  |     |     |  |                    +--rw (technology)?
          |  |     |     |  |                    |  +--:(generic)
          |  |     |     |  |                    |     +--rw generic?
          |  |     |     |  |                    |             rt-
   types:generalized-label
          |  |     |     |  |                    +--rw direction?
          |  |     |     |  |                            te-label-
   direction
          |  |     |     |  +--rw tiebreakers
          |  |     |     |     +--rw tiebreaker* [tiebreaker-type]
          |  |     |     |        +--rw tiebreaker-type    identityref
          |  |     |     +--:(objective-function)
          |  |     |              {path-optimization-objective-
   function}?
          |  |     |        +--rw objective-function
          |  |     |           +--rw objective-function-type?
          |  |     |                   identityref
          |  |     +--ro path-properties
          |  |        +--ro path-metric* [metric-type]
          |  |        |  +--ro metric-type           identityref
          |  |        |  +--ro accumulative-value?   uint64
          |  |        +--ro path-affinities-values
          |  |        |  +--ro path-affinities-value* [usage]
          |  |        |     +--ro usage    identityref
          |  |        |     +--ro value?   admin-groups
          |  |        +--ro path-affinity-names
          |  |        |  +--ro path-affinity-name* [usage]
          |  |        |     +--ro usage            identityref
          |  |        |     +--ro affinity-name* [name]
          |  |        |        +--ro name    string
          |  |        +--ro path-srlgs-lists
          |  |        |  +--ro path-srlgs-list* [usage]
          |  |        |     +--ro usage     identityref
          |  |        |     +--ro values*   srlg
          |  |        +--ro path-srlgs-names
          |  |        |  +--ro path-srlgs-name* [usage]
          |  |        |     +--ro usage    identityref
          |  |        |     +--ro names*   string
          |  |        +--ro path-route-objects
          |  |           +--ro path-route-object* [index]
          |  |              +--ro index                        uint32
          |  |              +--ro (type)?
          |  |                 +--:(numbered-node-hop)
          |  |                 |  +--ro numbered-node-hop
          |  |                 |     +--ro node-id     te-node-id
          |  |                 |     +--ro hop-type?   te-hop-type
          |  |                 +--:(numbered-link-hop)
          |  |                 |  +--ro numbered-link-hop
          |  |                 |     +--ro link-tp-id    te-tp-id
          |  |                 |     +--ro hop-type?     te-hop-type
          |  |                 |     +--ro direction?
          |  |                 |             te-link-direction
          |  |                 +--:(unnumbered-link-hop)
          |  |                 |  +--ro unnumbered-link-hop
          |  |                 |     +--ro link-tp-id    te-tp-id
          |  |                 |     +--ro node-id       te-node-id
          |  |                 |     +--ro hop-type?     te-hop-type
          |  |                 |     +--ro direction?
          |  |                 |             te-link-direction
          |  |                 +--:(as-number)
          |  |                 |  +--ro as-number-hop
          |  |                 |     +--ro as-number    inet:as-number
          |  |                 |     +--ro hop-type?    te-hop-type
          |  |                 +--:(label)
          |  |                    +--ro label-hop
          |  |                       +--ro te-label
          |  |                          +--ro (technology)?
          |  |                          |  +--:(generic)
          |  |                          |     +--ro generic?
          |  |                          |             rt-
   types:generalized-label
          |  |                          +--ro direction?
          |  |                                  te-label-direction
          |  +--rw domain-id?               uint32
          |  +--rw is-abstract?             empty
          |  +--rw name?                    string
          |  +--rw signaling-address*       inet:ip-address
          |  +--rw underlay-topology {te-topology-hierarchy}?
          |     +--rw network-ref?   -> /nw:networks/network/network-id
          +--ro oper-status?                   te-types:te-oper-status
          +--ro geolocation
          |  +--ro altitude?    int64
          |  +--ro latitude?    geographic-coordinate-degree
          |  +--ro longitude?   geographic-coordinate-degree

Okay so the tree is still unpacking, and the next bit is where we pick up the rest of the structure πŸ¦‹πŸ’œ

+--ro is-multi-access-dr? empty +--ro information-source? te-info-source +--ro information-source-instance? string +--ro information-source-state

+--ro credibility-preference? uint16
+--ro logical-network-element? string
+--ro network-instance? string
+--ro topology
+--ro node-ref? leafref
+--ro network-ref? -> /nw:networks/network/network-id

+--ro information-source-entry*

[information-source information-source-instance]
+--ro information-source te-info-source
+--ro information-source-instance string
+--ro information-source-state
+--ro credibility-preference? uint16
+--ro logical-network-element? string
+--ro network-instance? string
+--ro topology
+--ro node-ref? leafref
+--ro network-ref?
-> /nw:networks/network/network-id
+--ro connectivity-matrices
+--ro number-of-entries? uint16
+--ro label-restrictions
+--ro label-restriction* [index]
+--ro restriction? enumeration
+--ro index uint32
+--ro label-start
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-types:generalized-label
+--ro direction? te-label-direction
+--ro label-end
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-types:generalized-label
+--ro direction? te-label-direction
+--ro label-step
+--ro (technology)?
+--:(generic)
+--ro generic? int32
+--ro range-bitmap? yang:hex-string
+--ro is-allowed? boolean
+--ro underlay {te-topology-hierarchy}?
+--ro enabled? boolean
+--ro primary-path
+--ro network-ref?
-> /nw:networks/network/network-id
+--ro path-element* [path-element-id]
+--ro path-element-id uint32
+--ro (type)?
+--:(numbered-node-hop)
+--ro numbered-node-hop
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--:(numbered-link-hop)
+--ro numbered-link-hop
+--ro link-tp-id te-tp-id
+--ro hop-type? te-hop-type
+--ro direction? te-link-direction
+--:(unnumbered-link-hop)
+--ro unnumbered-link-hop
+--ro link-tp-id te-tp-id
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--ro direction? te-link-direction
+--:(as-number)
+--ro as-number-hop
+--ro as-number inet:as-number
+--ro hop-type? te-hop-type
+--:(label)
+--ro label-hop
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-types:generalized-

label

+--ro direction?
te-label-direction
+--ro backup-path* [index]
+--ro index uint32
+--ro network-ref?
-> /nw:networks/network/network-id
+--ro path-element* [path-element-id]
+--ro path-element-id uint32
+--ro (type)?
+--:(numbered-node-hop)
+--ro numbered-node-hop
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--:(numbered-link-hop)
+--ro numbered-link-hop
+--ro link-tp-id te-tp-id
+--ro hop-type? te-hop-type
+--ro direction? te-link-direction
+--:(unnumbered-link-hop)
+--ro unnumbered-link-hop
+--ro link-tp-id te-tp-id
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--ro direction? te-link-direction
+--:(as-number)
+--ro as-number-hop
+--ro as-number inet:as-number
+--ro hop-type? te-hop-type
+--:(label)
+--ro label-hop
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-types:generalized-

label

+--ro direction?
te-label-direction
+--ro protection-type? identityref
+--ro tunnel-termination-points
+--ro source? binary
+--ro destination? binary
+--ro tunnels
+--ro sharing? boolean
+--ro tunnel* [tunnel-name]
+--ro tunnel-name string
+--ro sharing? boolean
+--ro path-constraints
+--ro te-bandwidth
+--ro (technology)?
+--:(generic)
+--ro generic? te-bandwidth
+--ro link-protection? identityref
+--ro setup-priority? uint8
+--ro hold-priority? uint8
+--ro signaling-type? identityref
+--ro path-metric-bounds
+--ro path-metric-bound* [metric-type]
+--ro metric-type identityref
+--ro upper-bound? uint64
+--ro path-affinities-values
+--ro path-affinities-value* [usage]
+--ro usage identityref
+--ro value? admin-groups
+--ro path-affinity-names
+--ro path-affinity-name* [usage]
+--ro usage identityref
+--ro affinity-name* [name]
+--ro name string
+--ro path-srlgs-lists
+--ro path-srlgs-list* [usage]
+--ro usage identityref
+--ro values* srlg
+--ro path-srlgs-names
+--ro path-srlgs-name* [usage]
+--ro usage identityref
+--ro names* string
+--ro disjointness? te-path-disjointness
+--ro optimizations
+--ro (algorithm)?
+--:(metric) {path-optimization-metric}?
+--ro optimization-metric* [metric-type]
+--ro metric-type
identityref
+--ro weight?
uint8
+--ro explicit-route-exclude-objects
+--ro route-object-exclude-object*
[index]
+--ro index
uint32
+--ro (type)?
+--:(numbered-node-hop)
+--ro numbered-node-hop
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--:(numbered-link-hop)
+--ro numbered-link-hop
+--ro link-tp-id te-tp-id
+--ro hop-type?
te-hop-type
+--ro direction?
te-link-direction
+--:(unnumbered-link-hop)
+--ro unnumbered-link-hop
+--ro link-tp-id te-tp-id
+--ro node-id
te-node-id
+--ro hop-type?
te-hop-type
+--ro direction?
te-link-direction
+--:(as-number)
+--ro as-number-hop
+--ro as-number
inet:as-number
+--ro hop-type?
te-hop-type
+--:(label)
+--ro label-hop
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-

types:generalized-label

+--ro direction?
te-label-direction
+--:(srlg)
+--ro srlg
+--ro srlg? uint32
+--ro explicit-route-include-objects
+--ro route-object-include-object*
[index]
+--ro index
uint32

okay the tree keeps going, bestie πŸŒ³πŸ’…

          |  |  |     |  |        +--ro (type)?
          |  |  |     |  |           +--:(numbered-node-hop)
          |  |  |     |  |           |  +--ro numbered-node-hop
          |  |  |     |  |           |     +--ro node-id     te-node-id
          |  |  |     |  |           |     +--ro hop-type?   te-hop-type
          |  |  |     |  |           +--:(numbered-link-hop)
          |  |  |     |  |           |  +--ro numbered-link-hop
          |  |  |     |  |           |     +--ro link-tp-id    te-tp-id
          |  |  |     |  |           |     +--ro hop-type?
          |  |  |     |  |           |     |       te-hop-type
          |  |  |     |  |           |     +--ro direction?
          |  |  |     |  |           |             te-link-direction
          |  |  |     |  |           +--:(unnumbered-link-hop)
          |  |  |     |  |           |  +--ro unnumbered-link-hop
          |  |  |     |  |           |     +--ro link-tp-id    te-tp-id
          |  |  |     |  |           |     +--ro node-id
          |  |  |     |  |           |     |       te-node-id
          |  |  |     |  |           |     +--ro hop-type?
          |  |  |     |  |           |     |       te-hop-type
          |  |  |     |  |           |     +--ro direction?
          |  |  |     |  |           |             te-link-direction
          |  |  |     |  |           +--:(as-number)
          |  |  |     |  |           |  +--ro as-number-hop
          |  |  |     |  |           |     +--ro as-number
          |  |  |     |  |           |     |       inet:as-number
          |  |  |     |  |           |     +--ro hop-type?
          |  |  |     |  |           |             te-hop-type
          |  |  |     |  |           +--:(label)
          |  |  |     |  |              +--ro label-hop
          |  |  |     |  |                 +--ro te-label
          |  |  |     |  |                    +--ro (technology)?
          |  |  |     |  |                    |  +--:(generic)
          |  |  |     |  |                    |     +--ro generic?
          |  |  |     |  |                    |             rt-
   types:generalized-label
          |  |  |     |  |                    +--ro direction?
          |  |  |     |  |                            te-label-direction
          |  |  |     |  +--ro tiebreakers
          |  |  |     |     +--ro tiebreaker* [tiebreaker-type]
          |  |  |     |        +--ro tiebreaker-type    identityref
          |  |  |     +--:(objective-function)
          |  |  |              {path-optimization-objective-function}?
          |  |  |        +--ro objective-function
          |  |  |           +--ro objective-function-type?   identityref
          |  |  +--ro path-properties
          |  |  |  +--ro path-metric* [metric-type]
          |  |  |  |  +--ro metric-type           identityref
          |  |  |  |  +--ro accumulative-value?   uint64
          |  |  |  +--ro path-affinities-values
          |  |  |  |  +--ro path-affinities-value* [usage]
          |  |  |  |     +--ro usage    identityref
          |  |  |  |     +--ro value?   admin-groups
          |  |  |  +--ro path-affinity-names
          |  |  |  |  +--ro path-affinity-name* [usage]
          |  |  |  |     +--ro usage            identityref
          |  |  |  |     +--ro affinity-name* [name]
          |  |  |  |        +--ro name    string
          |  |  |  +--ro path-srlgs-lists
          |  |  |  |  +--ro path-srlgs-list* [usage]
          |  |  |  |     +--ro usage     identityref
          |  |  |  |     +--ro values*   srlg
          |  |  |  +--ro path-srlgs-names
          |  |  |  |  +--ro path-srlgs-name* [usage]
          |  |  |  |     +--ro usage    identityref
          |  |  |  |     +--ro names*   string
          |  |  |  +--ro path-route-objects
          |  |  |     +--ro path-route-object* [index]
          |  |  |        +--ro index                        uint32
          |  |  |        +--ro (type)?
          |  |  |           +--:(numbered-node-hop)
          |  |  |           |  +--ro numbered-node-hop
          |  |  |           |     +--ro node-id     te-node-id
          |  |  |           |     +--ro hop-type?   te-hop-type
          |  |  |           +--:(numbered-link-hop)
          |  |  |           |  +--ro numbered-link-hop
          |  |  |           |     +--ro link-tp-id    te-tp-id
          |  |  |           |     +--ro hop-type?     te-hop-type
          |  |  |           |     +--ro direction?    te-link-direction
          |  |  |           +--:(unnumbered-link-hop)
          |  |  |           |  +--ro unnumbered-link-hop
          |  |  |           |     +--ro link-tp-id    te-tp-id
          |  |  |           |     +--ro node-id       te-node-id
          |  |  |           |     +--ro hop-type?     te-hop-type
          |  |  |           |     +--ro direction?    te-link-direction
          |  |  |           +--:(as-number)
          |  |  |           |  +--ro as-number-hop
          |  |  |           |     +--ro as-number    inet:as-number
          |  |  |           |     +--ro hop-type?    te-hop-type
          |  |  |           +--:(label)
          |  |  |              +--ro label-hop
          |  |  |                 +--ro te-label
          |  |  |                    +--ro (technology)?
          |  |  |                    |  +--:(generic)
          |  |  |                    |     +--ro generic?
          |  |  |                    |             rt-types:generalized-
   label
          |  |  |                    +--ro direction?
          |  |  |                            te-label-direction
          |  |  +--ro connectivity-matrix* [id]
          |  |     +--ro id                  uint32
          |  |     +--ro from
          |  |     |  +--ro tp-ref?               leafref
          |  |     |  +--ro label-restrictions
          |  |     |     +--ro label-restriction* [index]
          |  |     |        +--ro restriction?    enumeration
          |  |     |        +--ro index           uint32
          |  |     |        +--ro label-start
          |  |     |        |  +--ro te-label
          |  |     |        |     +--ro (technology)?
          |  |     |        |     |  +--:(generic)
          |  |     |        |     |     +--ro generic?
          |  |     |        |     |             rt-types:generalized-
   label
          |  |     |        |     +--ro direction?
          |  |     |        |             te-label-direction
          |  |     |        +--ro label-end
          |  |     |        |  +--ro te-label
          |  |     |        |     +--ro (technology)?
          |  |     |        |     |  +--:(generic)
          |  |     |        |     |     +--ro generic?
          |  |     |        |     |             rt-types:generalized-
   label
          |  |     |        |     +--ro direction?
          |  |     |        |             te-label-direction
          |  |     |        +--ro label-step
          |  |     |        |  +--ro (technology)?
          |  |     |        |     +--:(generic)
          |  |     |        |        +--ro generic?   int32
          |  |     |        +--ro range-bitmap?   yang:hex-string
          |  |     +--ro to
          |  |     |  +--ro tp-ref?               leafref
          |  |     |  +--ro label-restrictions
          |  |     |     +--ro label-restriction* [index]
          |  |     |        +--ro restriction?    enumeration
          |  |     |        +--ro index           uint32
          |  |     |        +--ro label-start
          |  |     |        |  +--ro te-label
          |  |     |        |     +--ro (technology)?
          |  |     |        |     |  +--:(generic)
          |  |     |        |     |     +--ro generic?
          |  |     |        |     |             rt-types:generalized-
   label
          |  |     |        |     +--ro direction?
          |  |     |        |             te-label-direction
          |  |     |        +--ro label-end
          |  |     |        |  +--ro te-label
          |  |     |        |     +--ro (technology)?
          |  |     |        |     |  +--:(generic)
          |  |     |        |     |     +--ro generic?
          |  |     |        |     |             rt-types:generalized-
   label
          |  |     |        |     +--ro direction?
          |  |     |        |             te-label-direction
          |  |     |        +--ro label-step
          |  |     |        |  +--ro (technology)?
          |  |     |        |     +--:(generic)
          |  |     |        |        +--ro generic?   int32
          |  |     |        +--ro range-bitmap?   yang:hex-string
          |  |     +--ro is-allowed?         boolean
          |  |     +--ro underlay {te-topology-hierarchy}?
          |  |     |  +--ro enabled?                     boolean
          |  |     |  +--ro primary-path
          |  |     |  |  +--ro network-ref?
          |  |     |  |  |       -> /nw:networks/network/network-id
          |  |     |  |  +--ro path-element* [path-element-id]
          |  |     |  |     +--ro path-element-id              uint32
          |  |     |  |     +--ro (type)?
          |  |     |  |        +--:(numbered-node-hop)
          |  |     |  |        |  +--ro numbered-node-hop
          |  |     |  |        |     +--ro node-id     te-node-id
          |  |     |  |        |     +--ro hop-type?   te-hop-type
          |  |     |  |        +--:(numbered-link-hop)
          |  |     |  |        |  +--ro numbered-link-hop
          |  |     |  |        |     +--ro link-tp-id    te-tp-id
          |  |     |  |        |     +--ro hop-type?     te-hop-type
          |  |     |  |        |     +--ro direction?
          |  |     |  |        |             te-link-direction
          |  |     |  |        +--:(unnumbered-link-hop)
          |  |     |  |        |  +--ro unnumbered-link-hop
          |  |     |  |        |     +--ro link-tp-id    te-tp-id
          |  |     |  |        |     +--ro node-id       te-node-id
          |  |     |  |        |     +--ro hop-type?     te-hop-type
          |  |     |  |        |     +--ro direction?
          |  |     |  |        |             te-link-direction
          |  |     |  |        +--:(as-number)
          |  |     |  |        |  +--ro as-number-hop
          |  |     |  |        |     +--ro as-number    inet:as-number
          |  |     |  |        |     +--ro hop-type?    te-hop-type
          |  |     |  |        +--:(label)
          |  |     |  |           +--ro label-hop
          |  |     |  |              +--ro te-label
          |  |     |  |                 +--ro (technology)?
          |  |     |  |                 |  +--:(generic)
          |  |     |  |                 |     +--ro generic?
          |  |     |  |                 |             rt-
   types:generalized-label
          |  |     |  |                 +--ro direction?
          |  |     |  |                         te-label-direction
          |  |     |  +--ro backup-path* [index]
          |  |     |  |  +--ro index           uint32
          |  |     |  |  +--ro network-ref?
          |  |     |  |  |       -> /nw:networks/network/network-id
          |  |     |  |  +--ro path-element* [path-element-id]
          |  |     |  |     +--ro path-element-id              uint32
          |  |     |  |     +--ro (type)?
          |  |     |  |        +--:(numbered-node-hop)
          |  |     |  |        |  +--ro numbered-node-hop
          |  |     |  |        |     +--ro node-id     te-node-id
          |  |     |  |        |     +--ro hop-type?   te-hop-type
          |  |     |  |        +--:(numbered-link-hop)
          |  |     |  |        |  +--ro numbered-link-hop
          |  |     |  |        |     +--ro link-tp-id    te-tp-id
          |  |     |  |        |     +--ro hop-type?     te-hop-type
          |  |     |  |        |     +--ro direction?
          |  |     |  |        |             te-link-direction

okay the tree keeps branching and it's giving main character energy 🌳✨

          |  |     |  |        +--:(unnumbered-link-hop)
          |  |     |  |        |  +--ro unnumbered-link-hop
          |  |     |  |        |     +--ro link-tp-id    te-tp-id
          |  |     |  |        |     +--ro node-id       te-node-id
          |  |     |  |        |     +--ro hop-type?     te-hop-type
          |  |     |  |        |     +--ro direction?
          |  |     |  |        |             te-link-direction
          |  |     |  |        +--:(as-number)
          |  |     |  |        |  +--ro as-number-hop
          |  |     |  |        |     +--ro as-number    inet:as-number
          |  |     |  |        |     +--ro hop-type?    te-hop-type
          |  |     |  |        +--:(label)
          |  |     |  |           +--ro label-hop
          |  |     |  |              +--ro te-label
          |  |     |  |                 +--ro (technology)?
          |  |     |  |                 |  +--:(generic)
          |  |     |  |                 |     +--ro generic?
          |  |     |  |                 |             rt-
   types:generalized-label
          |  |     |  |                 +--ro direction?
          |  |     |  |                         te-label-direction
          |  |     |  +--ro protection-type?             identityref
          |  |     |  +--ro tunnel-termination-points
          |  |     |  |  +--ro source?        binary
          |  |     |  |  +--ro destination?   binary
          |  |     |  +--ro tunnels
          |  |     |     +--ro sharing?   boolean
          |  |     |     +--ro tunnel* [tunnel-name]
          |  |     |        +--ro tunnel-name    string
          |  |     |        +--ro sharing?       boolean
          |  |     +--ro path-constraints
          |  |     |  +--ro te-bandwidth
          |  |     |  |  +--ro (technology)?
          |  |     |  |     +--:(generic)
          |  |     |  |        +--ro generic?   te-bandwidth
          |  |     |  +--ro link-protection?          identityref
          |  |     |  +--ro setup-priority?           uint8
          |  |     |  +--ro hold-priority?            uint8
          |  |     |  +--ro signaling-type?           identityref
          |  |     |  +--ro path-metric-bounds
          |  |     |  |  +--ro path-metric-bound* [metric-type]
          |  |     |  |     +--ro metric-type    identityref
          |  |     |  |     +--ro upper-bound?   uint64
          |  |     |  +--ro path-affinities-values
          |  |     |  |  +--ro path-affinities-value* [usage]
          |  |     |  |     +--ro usage    identityref
          |  |     |  |     +--ro value?   admin-groups
          |  |     |  +--ro path-affinity-names
          |  |     |  |  +--ro path-affinity-name* [usage]
          |  |     |  |     +--ro usage            identityref
          |  |     |  |     +--ro affinity-name* [name]
          |  |     |  |        +--ro name    string
          |  |     |  +--ro path-srlgs-lists
          |  |     |  |  +--ro path-srlgs-list* [usage]
          |  |     |  |     +--ro usage     identityref
          |  |     |  |     +--ro values*   srlg
          |  |     |  +--ro path-srlgs-names
          |  |     |  |  +--ro path-srlgs-name* [usage]
          |  |     |  |     +--ro usage    identityref
          |  |     |  |     +--ro names*   string
          |  |     |  +--ro disjointness?
          |  |     |          te-path-disjointness
          |  |     +--ro optimizations
          |  |     |  +--ro (algorithm)?
          |  |     |     +--:(metric) {path-optimization-metric}?
          |  |     |     |  +--ro optimization-metric* [metric-type]
          |  |     |     |  |  +--ro metric-type
          |  |     |     |  |  |       identityref
          |  |     |     |  |  +--ro weight?
          |  |     |     |  |  |       uint8
          |  |     |     |  |  +--ro explicit-route-exclude-objects
          |  |     |     |  |  |  +--ro route-object-exclude-object*
          |  |     |     |  |  |          [index]
          |  |     |     |  |  |     +--ro index
          |  |     |     |  |  |     |       uint32
          |  |     |     |  |  |     +--ro (type)?
          |  |     |     |  |  |        +--:(numbered-node-hop)
          |  |     |     |  |  |        |  +--ro numbered-node-hop
          |  |     |     |  |  |        |     +--ro node-id
          |  |     |     |  |  |        |     |       te-node-id
          |  |     |     |  |  |        |     +--ro hop-type?
          |  |     |     |  |  |        |             te-hop-type
          |  |     |     |  |  |        +--:(numbered-link-hop)
          |  |     |     |  |  |        |  +--ro numbered-link-hop
          |  |     |     |  |  |        |     +--ro link-tp-id
          |  |     |     |  |  |        |     |       te-tp-id
          |  |     |     |  |  |        |     +--ro hop-type?
          |  |     |     |  |  |        |     |       te-hop-type
          |  |     |     |  |  |        |     +--ro direction?
          |  |     |     |  |  |        |             te-link-direction
          |  |     |     |  |  |        +--:(unnumbered-link-hop)
          |  |     |     |  |  |        |  +--ro unnumbered-link-hop
          |  |     |     |  |  |        |     +--ro link-tp-id
          |  |     |     |  |  |        |     |       te-tp-id
          |  |     |     |  |  |        |     +--ro node-id
          |  |     |     |  |  |        |     |       te-node-id
          |  |     |     |  |  |        |     +--ro hop-type?
          |  |     |     |  |  |        |     |       te-hop-type
          |  |     |     |  |  |        |     +--ro direction?
          |  |     |     |  |  |        |             te-link-direction
          |  |     |     |  |  |        +--:(as-number)
          |  |     |     |  |  |        |  +--ro as-number-hop
          |  |     |     |  |  |        |     +--ro as-number
          |  |     |     |  |  |        |     |       inet:as-number
          |  |     |     |  |  |        |     +--ro hop-type?
          |  |     |     |  |  |        |             te-hop-type
          |  |     |     |  |  |        +--:(label)
          |  |     |     |  |  |        |  +--ro label-hop
          |  |     |     |  |  |        |     +--ro te-label
          |  |     |     |  |  |        |        +--ro (technology)?
          |  |     |     |  |  |        |        |  +--:(generic)
          |  |     |     |  |  |        |        |     +--ro generic?
          |  |     |     |  |  |        |        |             rt-
   types:generalized-label
          |  |     |     |  |  |        |        +--ro direction?
          |  |     |     |  |  |        |                te-label-
   direction
          |  |     |     |  |  |        +--:(srlg)
          |  |     |     |  |  |           +--ro srlg
          |  |     |     |  |  |              +--ro srlg?   uint32
          |  |     |     |  |  +--ro explicit-route-include-objects
          |  |     |     |  |     +--ro route-object-include-object*
          |  |     |     |  |             [index]
          |  |     |     |  |        +--ro index
          |  |     |     |  |        |       uint32
          |  |     |     |  |        +--ro (type)?
          |  |     |     |  |           +--:(numbered-node-hop)
          |  |     |     |  |           |  +--ro numbered-node-hop
          |  |     |     |  |           |     +--ro node-id
          |  |     |     |  |           |     |       te-node-id
          |  |     |     |  |           |     +--ro hop-type?
          |  |     |     |  |           |             te-hop-type
          |  |     |     |  |           +--:(numbered-link-hop)
          |  |     |     |  |           |  +--ro numbered-link-hop
          |  |     |     |  |           |     +--ro link-tp-id
          |  |     |     |  |           |     |       te-tp-id
          |  |     |     |  |           |     +--ro hop-type?
          |  |     |     |  |           |     |       te-hop-type
          |  |     |     |  |           |     +--ro direction?
          |  |     |     |  |           |             te-link-direction
          |  |     |     |  |           +--:(unnumbered-link-hop)
          |  |     |     |  |           |  +--ro unnumbered-link-hop
          |  |     |     |  |           |     +--ro link-tp-id
          |  |     |     |  |           |     |       te-tp-id
          |  |     |     |  |           |     +--ro node-id
          |  |     |     |  |           |     |       te-node-id
          |  |     |     |  |           |     +--ro hop-type?
          |  |     |     |  |           |     |       te-hop-type
          |  |     |     |  |           |     +--ro direction?
          |  |     |     |  |           |             te-link-direction
          |  |     |     |  |           +--:(as-number)
          |  |     |     |  |           |  +--ro as-number-hop
          |  |     |     |  |           |     +--ro as-number
          |  |     |     |  |           |     |       inet:as-number
          |  |     |     |  |           |     +--ro hop-type?
          |  |     |     |  |           |             te-hop-type
          |  |     |     |  |           +--:(label)
          |  |     |     |  |              +--ro label-hop
          |  |     |     |  |                 +--ro te-label
          |  |     |     |  |                    +--ro (technology)?
          |  |     |     |  |                    |  +--:(generic)
          |  |     |     |  |                    |     +--ro generic?
          |  |     |     |  |                    |             rt-
   types:generalized-label
          |  |     |     |  |                    +--ro direction?
          |  |     |     |  |                            te-label-
   direction
          |  |     |     |  +--ro tiebreakers
          |  |     |     |     +--ro tiebreaker* [tiebreaker-type]
          |  |     |     |        +--ro tiebreaker-type    identityref
          |  |     |     +--:(objective-function)
          |  |     |              {path-optimization-objective-
   function}?
          |  |     |        +--ro objective-function
          |  |     |           +--ro objective-function-type?
          |  |     |                   identityref
          |  |     +--ro path-properties
          |  |        +--ro path-metric* [metric-type]
          |  |        |  +--ro metric-type           identityref
          |  |        |  +--ro accumulative-value?   uint64
          |  |        +--ro path-affinities-values
          |  |        |  +--ro path-affinities-value* [usage]
          |  |        |     +--ro usage    identityref
          |  |        |     +--ro value?   admin-groups
          |  |        +--ro path-affinity-names
          |  |        |  +--ro path-affinity-name* [usage]
          |  |        |     +--ro usage            identityref
          |  |        |     +--ro affinity-name* [name]
          |  |        |        +--ro name    string
          |  |        +--ro path-srlgs-lists
          |  |        |  +--ro path-srlgs-list* [usage]
          |  |        |     +--ro usage     identityref
          |  |        |     +--ro values*   srlg
          |  |        +--ro path-srlgs-names
          |  |        |  +--ro path-srlgs-name* [usage]
          |  |        |     +--ro usage    identityref
          |  |        |     +--ro names*   string
          |  |        +--ro path-route-objects
          |  |           +--ro path-route-object* [index]
          |  |              +--ro index                        uint32
          |  |              +--ro (type)?
          |  |                 +--:(numbered-node-hop)
          |  |                 |  +--ro numbered-node-hop
          |  |                 |     +--ro node-id     te-node-id
          |  |                 |     +--ro hop-type?   te-hop-type
          |  |                 +--:(numbered-link-hop)
          |  |                 |  +--ro numbered-link-hop

that's the tree for part 24, bestie πŸ’– keep your eyes peeled for the next chunk πŸ¦‹

+--ro link-tp-id te-tp-id
+--ro hop-type? te-hop-type
+--ro direction?
te-link-direction
+--:(unnumbered-link-hop)
+--ro unnumbered-link-hop
+--ro link-tp-id te-tp-id
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--ro direction?
te-link-direction
+--:(as-number)
+--ro as-number-hop
+--ro as-number inet:as-number
+--ro hop-type? te-hop-type
+--:(label)
+--ro label-hop
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-

types:generalized-label

+--ro direction?
te-label-direction
+--ro domain-id? uint32
+--ro is-abstract? empty
+--ro name? string
+--ro signaling-address* inet:ip-address
+--ro underlay-topology {te-topology-hierarchy}?
+--ro network-ref? -> /nw:networks/network/network-id

+--ro statistics

+--ro discontinuity-time? yang:date-and-time
+--ro node
+--ro disables? yang:counter32
+--ro enables? yang:counter32
+--ro maintenance-sets? yang:counter32
+--ro maintenance-clears? yang:counter32
+--ro modifies? yang:counter32
+--ro connectivity-matrix-entry
+--ro creates? yang:counter32
+--ro deletes? yang:counter32
+--ro disables? yang:counter32
+--ro enables? yang:counter32
+--ro modifies? yang:counter32

+--rw tunnel-termination-point* [tunnel-tp-id] +--rw tunnel-tp-id binary +--rw admin-status?

te-types:te-admin-status

+--rw name? string +--rw switching-capability? identityref +--rw encoding? identityref +--rw inter-layer-lock-id* uint32 +--rw protection-type? identityref +--rw client-layer-adaptation

+--rw switching-capability*
[switching-capability encoding]
+--rw switching-capability identityref
+--rw encoding identityref
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth

+--rw local-link-connectivities

+--rw number-of-entries? uint16
+--rw label-restrictions
+--rw label-restriction* [index]
+--rw restriction? enumeration
+--rw index uint32
+--rw label-start
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label
+--rw direction? te-label-direction
+--rw label-end
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label
+--rw direction? te-label-direction
+--rw label-step
+--rw (technology)?
+--:(generic)
+--rw generic? int32
+--rw range-bitmap? yang:hex-string
+--rw is-allowed? boolean
+--rw underlay {te-topology-hierarchy}?
+--rw enabled? boolean
+--rw primary-path
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw backup-path* [index]
+--rw index uint32
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw protection-type? identityref
+--rw tunnel-termination-points
+--rw source? binary
+--rw destination? binary
+--rw tunnels
+--rw sharing? boolean
+--rw tunnel* [tunnel-name]
+--rw tunnel-name string
+--rw sharing? boolean
+--rw path-constraints
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth
+--rw link-protection? identityref
+--rw setup-priority? uint8
+--rw hold-priority? uint8
+--rw signaling-type? identityref
+--rw path-metric-bounds
+--rw path-metric-bound* [metric-type]
+--rw metric-type identityref
+--rw upper-bound? uint64
+--rw path-affinities-values
+--rw path-affinities-value* [usage]
+--rw usage identityref
+--rw value? admin-groups
+--rw path-affinity-names
+--rw path-affinity-name* [usage]
+--rw usage identityref
+--rw affinity-name* [name]
+--rw name string
+--rw path-srlgs-lists
+--rw path-srlgs-list* [usage]
+--rw usage identityref
+--rw values* srlg
+--rw path-srlgs-names
+--rw path-srlgs-name* [usage]
+--rw usage identityref
+--rw names* string
+--rw disjointness? te-path-disjointness
+--rw optimizations
+--rw (algorithm)?
+--:(metric) {path-optimization-metric}?
+--rw optimization-metric* [metric-type]
+--rw metric-type
identityref
+--rw weight?
uint8
+--rw explicit-route-exclude-objects
+--rw route-object-exclude-object*
[index]
+--rw index
uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type

okay this tree is giving main character energy 🌸✨

             |  |     |  |  |        +--:(numbered-link-hop)
             |  |     |  |  |        |  +--rw numbered-link-hop
             |  |     |  |  |        |     +--rw link-tp-id    te-tp-id
             |  |     |  |  |        |     +--rw hop-type?
             |  |     |  |  |        |     |       te-hop-type
             |  |     |  |  |        |     +--rw direction?
             |  |     |  |  |        |             te-link-direction
             |  |     |  |  |        +--:(unnumbered-link-hop)
             |  |     |  |  |        |  +--rw unnumbered-link-hop
             |  |     |  |  |        |     +--rw link-tp-id    te-tp-id
             |  |     |  |  |        |     +--rw node-id
             |  |     |  |  |        |     |       te-node-id
             |  |     |  |  |        |     +--rw hop-type?
             |  |     |  |  |        |     |       te-hop-type
             |  |     |  |  |        |     +--rw direction?
             |  |     |  |  |        |             te-link-direction
             |  |     |  |  |        +--:(as-number)
             |  |     |  |  |        |  +--rw as-number-hop
             |  |     |  |  |        |     +--rw as-number
             |  |     |  |  |        |     |       inet:as-number
             |  |     |  |  |        |     +--rw hop-type?
             |  |     |  |  |        |             te-hop-type
             |  |     |  |  |        +--:(label)
             |  |     |  |  |        |  +--rw label-hop
             |  |     |  |  |        |     +--rw te-label
             |  |     |  |  |        |        +--rw (technology)?
             |  |     |  |  |        |        |  +--:(generic)
             |  |     |  |  |        |        |     +--rw generic?
             |  |     |  |  |        |        |             rt-
   types:generalized-label
             |  |     |  |  |        |        +--rw direction?
             |  |     |  |  |        |                te-label-direction
             |  |     |  |  |        +--:(srlg)
             |  |     |  |  |           +--rw srlg
             |  |     |  |  |              +--rw srlg?   uint32
             |  |     |  |  +--rw explicit-route-include-objects
             |  |     |  |     +--rw route-object-include-object*
             |  |     |  |             [index]
             |  |     |  |        +--rw index
             |  |     |  |        |       uint32
             |  |     |  |        +--rw (type)?
             |  |     |  |           +--:(numbered-node-hop)
             |  |     |  |           |  +--rw numbered-node-hop
             |  |     |  |           |     +--rw node-id     te-node-id
             |  |     |  |           |     +--rw hop-type?   te-hop-type
             |  |     |  |           +--:(numbered-link-hop)
             |  |     |  |           |  +--rw numbered-link-hop
             |  |     |  |           |     +--rw link-tp-id    te-tp-id
             |  |     |  |           |     +--rw hop-type?
             |  |     |  |           |     |       te-hop-type
             |  |     |  |           |     +--rw direction?
             |  |     |  |           |             te-link-direction
             |  |     |  |           +--:(unnumbered-link-hop)
             |  |     |  |           |  +--rw unnumbered-link-hop
             |  |     |  |           |     +--rw link-tp-id    te-tp-id
             |  |     |  |           |     +--rw node-id
             |  |     |  |           |     |       te-node-id
             |  |     |  |           |     +--rw hop-type?
             |  |     |  |           |     |       te-hop-type
             |  |     |  |           |     +--rw direction?
             |  |     |  |           |             te-link-direction
             |  |     |  |           +--:(as-number)
             |  |     |  |           |  +--rw as-number-hop
             |  |     |  |           |     +--rw as-number
             |  |     |  |           |     |       inet:as-number
             |  |     |  |           |     +--rw hop-type?
             |  |     |  |           |             te-hop-type
             |  |     |  |           +--:(label)
             |  |     |  |              +--rw label-hop
             |  |     |  |                 +--rw te-label
             |  |     |  |                    +--rw (technology)?
             |  |     |  |                    |  +--:(generic)
             |  |     |  |                    |     +--rw generic?
             |  |     |  |                    |             rt-
   types:generalized-label
             |  |     |  |                    +--rw direction?
             |  |     |  |                            te-label-direction
             |  |     |  +--rw tiebreakers
             |  |     |     +--rw tiebreaker* [tiebreaker-type]
             |  |     |        +--rw tiebreaker-type    identityref
             |  |     +--:(objective-function)
             |  |              {path-optimization-objective-function}?
             |  |        +--rw objective-function
             |  |           +--rw objective-function-type?   identityref
             |  +--ro path-properties
             |  |  +--ro path-metric* [metric-type]
             |  |  |  +--ro metric-type           identityref
             |  |  |  +--ro accumulative-value?   uint64
             |  |  +--ro path-affinities-values
             |  |  |  +--ro path-affinities-value* [usage]
             |  |  |     +--ro usage    identityref
             |  |  |     +--ro value?   admin-groups
             |  |  +--ro path-affinity-names
             |  |  |  +--ro path-affinity-name* [usage]
             |  |  |     +--ro usage            identityref
             |  |  |     +--ro affinity-name* [name]
             |  |  |        +--ro name    string
             |  |  +--ro path-srlgs-lists
             |  |  |  +--ro path-srlgs-list* [usage]
             |  |  |     +--ro usage     identityref
             |  |  |     +--ro values*   srlg
             |  |  +--ro path-srlgs-names
             |  |  |  +--ro path-srlgs-name* [usage]
             |  |  |     +--ro usage    identityref
             |  |  |     +--ro names*   string
             |  |  +--ro path-route-objects
             |  |     +--ro path-route-object* [index]
             |  |        +--ro index                        uint32
             |  |        +--ro (type)?
             |  |           +--:(numbered-node-hop)
             |  |           |  +--ro numbered-node-hop
             |  |           |     +--ro node-id     te-node-id
             |  |           |     +--ro hop-type?   te-hop-type
             |  |           +--:(numbered-link-hop)
             |  |           |  +--ro numbered-link-hop
             |  |           |     +--ro link-tp-id    te-tp-id
             |  |           |     +--ro hop-type?     te-hop-type
             |  |           |     +--ro direction?    te-link-direction
             |  |           +--:(unnumbered-link-hop)
             |  |           |  +--ro unnumbered-link-hop
             |  |           |     +--ro link-tp-id    te-tp-id
             |  |           |     +--ro node-id       te-node-id
             |  |           |     +--ro hop-type?     te-hop-type
             |  |           |     +--ro direction?    te-link-direction
             |  |           +--:(as-number)
             |  |           |  +--ro as-number-hop
             |  |           |     +--ro as-number    inet:as-number
             |  |           |     +--ro hop-type?    te-hop-type
             |  |           +--:(label)
             |  |              +--ro label-hop
             |  |                 +--ro te-label
             |  |                    +--ro (technology)?
             |  |                    |  +--:(generic)
             |  |                    |     +--ro generic?
             |  |                    |             rt-types:generalized-
   label
             |  |                    +--ro direction?
             |  |                            te-label-direction
             |  +--rw local-link-connectivity* [link-tp-ref]
             |     +--rw link-tp-ref
             |     |       -> ../../../../../nt:termination-point/tp-id
             |     +--rw label-restrictions
             |     |  +--rw label-restriction* [index]
             |     |     +--rw restriction?    enumeration
             |     |     +--rw index           uint32
             |     |     +--rw label-start
             |     |     |  +--rw te-label
             |     |     |     +--rw (technology)?
             |     |     |     |  +--:(generic)
             |     |     |     |     +--rw generic?
             |     |     |     |             rt-types:generalized-label
             |     |     |     +--rw direction?       te-label-direction
             |     |     +--rw label-end
             |     |     |  +--rw te-label
             |     |     |     +--rw (technology)?
             |     |     |     |  +--:(generic)
             |     |     |     |     +--rw generic?
             |     |     |     |             rt-types:generalized-label
             |     |     |     +--rw direction?       te-label-direction
             |     |     +--rw label-step
             |     |     |  +--rw (technology)?
             |     |     |     +--:(generic)
             |     |     |        +--rw generic?   int32
             |     |     +--rw range-bitmap?   yang:hex-string
             |     +--rw is-allowed?           boolean
             |     +--rw underlay {te-topology-hierarchy}?
             |     |  +--rw enabled?                     boolean
             |     |  +--rw primary-path
             |     |  |  +--rw network-ref?
             |     |  |  |       -> /nw:networks/network/network-id
             |     |  |  +--rw path-element* [path-element-id]
             |     |  |     +--rw path-element-id              uint32
             |     |  |     +--rw (type)?
             |     |  |        +--:(numbered-node-hop)
             |     |  |        |  +--rw numbered-node-hop
             |     |  |        |     +--rw node-id     te-node-id
             |     |  |        |     +--rw hop-type?   te-hop-type
             |     |  |        +--:(numbered-link-hop)
             |     |  |        |  +--rw numbered-link-hop
             |     |  |        |     +--rw link-tp-id    te-tp-id
             |     |  |        |     +--rw hop-type?     te-hop-type
             |     |  |        |     +--rw direction?
             |     |  |        |             te-link-direction
             |     |  |        +--:(unnumbered-link-hop)
             |     |  |        |  +--rw unnumbered-link-hop
             |     |  |        |     +--rw link-tp-id    te-tp-id
             |     |  |        |     +--rw node-id       te-node-id
             |     |  |        |     +--rw hop-type?     te-hop-type
             |     |  |        |     +--rw direction?
             |     |  |        |             te-link-direction
             |     |  |        +--:(as-number)
             |     |  |        |  +--rw as-number-hop
             |     |  |        |     +--rw as-number    inet:as-number
             |     |  |        |     +--rw hop-type?    te-hop-type
             |     |  |        +--:(label)
             |     |  |           +--rw label-hop
             |     |  |              +--rw te-label
             |     |  |                 +--rw (technology)?
             |     |  |                 |  +--:(generic)
             |     |  |                 |     +--rw generic?
             |     |  |                 |             rt-
   types:generalized-label
             |     |  |                 +--rw direction?
             |     |  |                         te-label-direction
             |     |  +--rw backup-path* [index]
             |     |  |  +--rw index           uint32
             |     |  |  +--rw network-ref?
             |     |  |  |       -> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction?
te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-direction
+--rw protection-type? identityref
+--rw tunnel-termination-points
+--rw source? binary
+--rw destination? binary
+--rw tunnels
+--rw sharing? boolean
+--rw tunnel* [tunnel-name]
+--rw tunnel-name string
+--rw sharing? boolean
+--rw path-constraints
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth
+--rw link-protection? identityref
+--rw setup-priority? uint8
+--rw hold-priority? uint8
+--rw signaling-type? identityref
+--rw path-metric-bounds
+--rw path-metric-bound* [metric-type]
+--rw metric-type identityref
+--rw upper-bound? uint64
+--rw path-affinities-values
+--rw path-affinities-value* [usage]
+--rw usage identityref
+--rw value? admin-groups
+--rw path-affinity-names
+--rw path-affinity-name* [usage]
+--rw usage identityref
+--rw affinity-name* [name]
+--rw name string
+--rw path-srlgs-lists
+--rw path-srlgs-list* [usage]
+--rw usage identityref
+--rw values* srlg
+--rw path-srlgs-names
+--rw path-srlgs-name* [usage]
+--rw usage identityref
+--rw names* string
+--rw disjointness?
te-path-disjointness
+--rw optimizations
+--rw (algorithm)?
+--:(metric) {path-optimization-metric}?
+--rw optimization-metric* [metric-type]
+--rw metric-type
identityref
+--rw weight?
uint8
+--rw explicit-route-exclude-objects
+--rw route-object-exclude-object*
[index]
+--rw index
uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id
te-node-id
+--rw hop-type?
te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id
te-tp-id
+--rw hop-type?
te-hop-type
+--rw direction?
te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id
te-tp-id
+--rw node-id
te-node-id
+--rw hop-type?
te-hop-type
+--rw direction?
te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number
inet:as-number
+--rw hop-type?
te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-

direction

+--:(srlg)
+--rw srlg
+--rw srlg? uint32
+--rw explicit-route-include-objects
+--rw route-object-include-object*
[index]
+--rw index
uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id
te-node-id
+--rw hop-type?
te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id
te-tp-id
+--rw hop-type?
te-hop-type
+--rw direction?
te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id
te-tp-id
+--rw node-id
te-node-id
+--rw hop-type?
te-hop-type
+--rw direction?
te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number
inet:as-number
+--rw hop-type?
te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-

types:generalized-label

+--rw direction?
te-label-

direction

+--rw tiebreakers
+--rw tiebreaker* [tiebreaker-type]
+--rw tiebreaker-type identityref
+--:(objective-function)
{path-optimization-objective-

function}?

+--rw objective-function
+--rw objective-function-type?
identityref
+--ro path-properties
+--ro path-metric* [metric-type]
+--ro metric-type identityref
+--ro accumulative-value? uint64
+--ro path-affinities-values
+--ro path-affinities-value* [usage]
+--ro usage identityref
+--ro value? admin-groups
+--ro path-affinity-names
+--ro path-affinity-name* [usage]
+--ro usage identityref
+--ro affinity-name* [name]
+--ro name string
+--ro path-srlgs-lists
+--ro path-srlgs-list* [usage]
+--ro usage identityref
+--ro values* srlg
+--ro path-srlgs-names
+--ro path-srlgs-name* [usage]
+--ro usage identityref
+--ro names* string
+--ro path-route-objects
+--ro path-route-object* [index]
+--ro index uint32
+--ro (type)?
+--:(numbered-node-hop)
+--ro numbered-node-hop
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--:(numbered-link-hop)
+--ro numbered-link-hop
+--ro link-tp-id te-tp-id
+--ro hop-type? te-hop-type
+--ro direction?
te-link-direction
+--:(unnumbered-link-hop)
+--ro unnumbered-link-hop
+--ro link-tp-id te-tp-id
+--ro node-id te-node-id
+--ro hop-type? te-hop-type
+--ro direction?
te-link-direction
+--:(as-number)
+--ro as-number-hop
+--ro as-number inet:as-number
+--ro hop-type? te-hop-type
+--:(label)
+--ro label-hop
+--ro te-label
+--ro (technology)?
+--:(generic)
+--ro generic?
rt-

types:generalized-label

+--ro direction?
te-label-direction

+--ro oper-status?

te-types:te-oper-status

+--ro geolocation

+--ro altitude? int64
+--ro latitude? geographic-coordinate-degree
+--ro longitude? geographic-coordinate-degree

+--ro statistics

+--ro discontinuity-time? yang:date-and-time
+--ro tunnel-termination-point
+--ro disables? yang:counter32
+--ro enables? yang:counter32
+--ro maintenance-clears? yang:counter32
+--ro maintenance-sets? yang:counter32
+--ro modifies? yang:counter32
+--ro downs? yang:counter32
+--ro ups? yang:counter32
+--ro in-service-clears? yang:counter32
+--ro in-service-sets? yang:counter32
+--ro local-link-connectivity
+--ro creates? yang:counter32
+--ro deletes? yang:counter32
+--ro disables? yang:counter32
+--ro enables? yang:counter32
+--ro modifies? yang:counter32

+--rw supporting-tunnel-termination-point* [node-ref tunnel-tp-ref] +--rw node-ref inet:uri +--rw tunnel-tp-ref binary augment /nw:networks/nw:network/nt:link: +--rw te! +--rw (bundle-stack-level)?

+--:(bundle)
+--rw bundled-links
+--rw bundled-link* [sequence]
+--rw sequence uint32
+--rw src-tp-ref? leafref
+--rw des-tp-ref? leafref
+--:(component)
+--rw component-links
+--rw component-link* [sequence]
+--rw sequence uint32
+--rw src-interface-ref? string
+--rw des-interface-ref? string

+--rw te-link-template*

-> ../../../../te/templates/link-template/name
{template}?

+--rw te-link-attributes

+--rw access-type?
te-types:te-link-access-type
+--rw external-domain
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw remote-te-node-id? te-types:te-node-id
+--rw remote-te-link-tp-id? te-types:te-tp-id
+--rw is-abstract? empty
+--rw name? string
+--rw underlay {te-topology-hierarchy}?
+--rw enabled? boolean
+--rw primary-path
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw backup-path* [index]
+--rw index uint32
+--rw network-ref?
-> /nw:networks/network/network-id
+--rw path-element* [path-element-id]
+--rw path-element-id uint32
+--rw (type)?
+--:(numbered-node-hop)
+--rw numbered-node-hop
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--:(numbered-link-hop)
+--rw numbered-link-hop
+--rw link-tp-id te-tp-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(unnumbered-link-hop)
+--rw unnumbered-link-hop
+--rw link-tp-id te-tp-id
+--rw node-id te-node-id
+--rw hop-type? te-hop-type
+--rw direction? te-link-direction
+--:(as-number)
+--rw as-number-hop
+--rw as-number inet:as-number
+--rw hop-type? te-hop-type
+--:(label)
+--rw label-hop
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-

label

+--rw direction?
te-label-direction
+--rw protection-type? identityref
+--rw tunnel-termination-points
+--rw source? binary
+--rw destination? binary
+--rw tunnels
+--rw sharing? boolean
+--rw tunnel* [tunnel-name]
+--rw tunnel-name string
+--rw sharing? boolean
+--rw admin-status?
te-types:te-admin-status
+--rw link-index? uint64
+--rw administrative-group?
te-types:admin-groups
+--rw interface-switching-capability*
[switching-capability encoding]
+--rw switching-capability identityref
+--rw encoding identityref
+--rw max-lsp-bandwidth* [priority]
+--rw priority uint8
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth
+--rw label-restrictions
+--rw label-restriction* [index]
+--rw restriction? enumeration
+--rw index uint32
+--rw label-start
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label
+--rw direction? te-label-direction
+--rw label-end
+--rw te-label
+--rw (technology)?
+--:(generic)
+--rw generic?
rt-types:generalized-label
+--rw direction? te-label-direction
+--rw label-step
+--rw (technology)?
+--:(generic)
+--rw generic? int32
+--rw range-bitmap? yang:hex-string
+--rw link-protection-type? identityref
+--rw max-link-bandwidth
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth
+--rw max-resv-link-bandwidth
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth
+--rw unreserved-bandwidth* [priority]
+--rw priority uint8
+--rw te-bandwidth
+--rw (technology)?
+--:(generic)
+--rw generic? te-bandwidth
+--rw te-default-metric? uint32
+--rw te-delay-metric? uint32
+--rw te-igp-metric? uint32
          |  +--rw te-srlgs
          |  |  +--rw value*   te-types:srlg
          |  +--rw te-nsrlgs {nsrlg}?
          |     +--rw id*   uint32
          +--ro oper-status?                   te-types:te-oper-status
          +--ro is-transitional?               empty
          +--ro information-source?            te-info-source
          +--ro information-source-instance?   string
          +--ro information-source-state
          |  +--ro credibility-preference?    uint16
          |  +--ro logical-network-element?   string
          |  +--ro network-instance?          string
          |  +--ro topology
          |     +--ro link-ref?      leafref
          |     +--ro network-ref?   -> /nw:networks/network/network-id
          +--ro information-source-entry*
          |       [information-source information-source-instance]
          |  +--ro information-source                te-info-source
          |  +--ro information-source-instance       string
          |  +--ro information-source-state
          |  |  +--ro credibility-preference?    uint16
          |  |  +--ro logical-network-element?   string
          |  |  +--ro network-instance?          string
          |  |  +--ro topology
          |  |     +--ro link-ref?      leafref
          |  |     +--ro network-ref?
          |  |             -> /nw:networks/network/network-id
          |  +--ro link-index?                       uint64
          |  +--ro administrative-group?
          |  |       te-types:admin-groups
          |  +--ro interface-switching-capability*
          |  |       [switching-capability encoding]
          |  |  +--ro switching-capability    identityref
          |  |  +--ro encoding                identityref
          |  |  +--ro max-lsp-bandwidth* [priority]
          |  |     +--ro priority        uint8
          |  |     +--ro te-bandwidth
          |  |        +--ro (technology)?
          |  |           +--:(generic)
          |  |              +--ro generic?   te-bandwidth
          |  +--ro label-restrictions
          |  |  +--ro label-restriction* [index]
          |  |     +--ro restriction?    enumeration
          |  |     +--ro index           uint32
          |  |     +--ro label-start
          |  |     |  +--ro te-label
          |  |     |     +--ro (technology)?
          |  |     |     |  +--:(generic)
          |  |     |     |     +--ro generic?
          |  |     |     |             rt-types:generalized-label
          |  |     |     +--ro direction?       te-label-direction
          |  |     +--ro label-end
          |  |     |  +--ro te-label
          |  |     |     +--ro (technology)?
          |  |     |     |  +--:(generic)
          |  |     |     |     +--ro generic?
          |  |     |     |             rt-types:generalized-label
          |  |     |     +--ro direction?       te-label-direction
          |  |     +--ro label-step
          |  |     |  +--ro (technology)?
          |  |     |     +--:(generic)
          |  |     |        +--ro generic?   int32
          |  |     +--ro range-bitmap?   yang:hex-string
          |  +--ro link-protection-type?             identityref
          |  +--ro max-link-bandwidth
          |  |  +--ro te-bandwidth
          |  |     +--ro (technology)?
          |  |        +--:(generic)
          |  |           +--ro generic?   te-bandwidth
          |  +--ro max-resv-link-bandwidth
          |  |  +--ro te-bandwidth
          |  |     +--ro (technology)?
          |  |        +--:(generic)
          |  |           +--ro generic?   te-bandwidth
          |  +--ro unreserved-bandwidth* [priority]
          |  |  +--ro priority        uint8
          |  |  +--ro te-bandwidth
          |  |     +--ro (technology)?
          |  |        +--:(generic)
          |  |           +--ro generic?   te-bandwidth
          |  +--ro te-default-metric?                uint32
          |  +--ro te-delay-metric?                  uint32
          |  +--ro te-igp-metric?                    uint32
          |  +--ro te-srlgs
          |  |  +--ro value*   te-types:srlg
          |  +--ro te-nsrlgs {nsrlg}?
          |     +--ro id*   uint32
          +--ro recovery
          |  +--ro restoration-status?   te-types:te-recovery-status
          |  +--ro protection-status?    te-types:te-recovery-status
          +--ro underlay {te-topology-hierarchy}?
          |  +--ro dynamic?     boolean
          |  +--ro committed?   boolean
          +--ro statistics
             +--ro discontinuity-time?                yang:date-and-time
             +--ro disables?                          yang:counter32
             +--ro enables?                           yang:counter32
             +--ro maintenance-clears?                yang:counter32
             +--ro maintenance-sets?                  yang:counter32
             +--ro modifies?                          yang:counter32
             +--ro downs?                             yang:counter32
             +--ro ups?                               yang:counter32
             +--ro fault-clears?                      yang:counter32
             +--ro fault-detects?                     yang:counter32
             +--ro protection-switches?               yang:counter32
             +--ro protection-reverts?                yang:counter32
             +--ro restoration-failures?              yang:counter32
             +--ro restoration-starts?                yang:counter32
             +--ro restoration-successes?             yang:counter32
             +--ro restoration-reversion-failures?    yang:counter32
             +--ro restoration-reversion-starts?      yang:counter32
             +--ro restoration-reversion-successes?   yang:counter32
     augment /nw:networks/nw:network/nw:node/nt:termination-point:
       +--rw te-tp-id?   te-types:te-tp-id
       +--rw te!
          +--rw admin-status?
          |       te-types:te-admin-status
          +--rw name?                             string
          +--rw interface-switching-capability*
          |       [switching-capability encoding]
          |  +--rw switching-capability    identityref
          |  +--rw encoding                identityref
          |  +--rw max-lsp-bandwidth* [priority]
          |     +--rw priority        uint8
          |     +--rw te-bandwidth
          |        +--rw (technology)?
          |           +--:(generic)
          |              +--rw generic?   te-bandwidth
          +--rw inter-domain-plug-id?             binary
          +--rw inter-layer-lock-id*              uint32
          +--ro oper-status?
          |       te-types:te-oper-status
          +--ro geolocation
             +--ro altitude?    int64
             +--ro latitude?    geographic-coordinate-degree
             +--ro longitude?   geographic-coordinate-degree

Appendix B. Companion YANG Data Model for Non-NMDA-Compliant Implementations πŸŽ€

okay so bestie, this appendix is for the implementations that aren't NMDA-compliant πŸ₯Ί The main YANG module, ietf-te-topology, is the one from Section 7, and it's built to play nicely with the Network Management Datastore Architecture (NMDA) from [RFC8342] ✨ But what if your gear doesn't do NMDA? No stress, that's what this companion is for πŸ’–

So the companion module, ietf-te-topology-state, is a state model that basically mirrors ietf-te-topology πŸͺž The big difference is that every data node in it is non-configurable πŸ”’ It only shows you the applied configuration or the operational states that got derived from it. Think of it as the read-only receipts πŸ§ΎπŸ’…

Heads up: this companion module is redundant, and implementations that DO support NMDA SHOULD NOT support it πŸ™…β€β™€οΈ That's why it lives down here in an appendix instead of the main body. Don't double up, periodt πŸ’€

Since ietf-te-topology-state is a mirror of ietf-te-topology, the YANG tree for it isn't drawn out separately πŸ¦‹ Same shape, just read-only. Iconic, efficient, no notes ⭐

B.1. TE Topology State YANG Module ✨

Okay bestie, this is the state side of the TE topology model πŸͺž It references [RFC6001], [RFC8345], and [RFC8776] 🫢 Here's the whole module, copied exactly:

module ietf-te-topology-state {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology-state";
  prefix tet-s;

  import ietf-te-types {
    prefix te-types;
    reference
      "RFC 8776: Common YANG Data Types for Traffic Engineering";
  }
  import ietf-te-topology {
    prefix tet;
    reference
      "RFC 8795: YANG Data Model for Traffic Engineering (TE)
       Topologies";
  }
  import ietf-network-state {
    prefix nw-s;
    reference
      "RFC 8345: A YANG Data Model for Network Topologies";
  }
  import ietf-network-topology-state {
    prefix nt-s;
    reference
      "RFC 8345: A YANG Data Model for Network Topologies";
  }

  organization
    "IETF Traffic Engineering Architecture and Signaling (TEAS)
     Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/teas/>
     WG List:  <mailto:teas@ietf.org>

     Editor:   Xufeng Liu
               <mailto:xufeng.liu.ietf@gmail.com>

     Editor:   Igor Bryskin
               <mailto:i_bryskin@yahoo.com>

     Editor:   Vishnu Pavan Beeram
               <mailto:vbeeram@juniper.net>

     Editor:   Tarek Saad
               <mailto:tsaad@juniper.net>

     Editor:   Himanshu Shah
               <mailto:hshah@ciena.com>

     Editor:   Oscar Gonzalez de Dios
               <mailto:oscar.gonzalezdedios@telefonica.com>";
  description
    "This YANG module defines a TE topology state model.

     Copyright (c) 2020 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC 8795; see the
     RFC itself for full legal notices.";

  revision 2020-08-06 {
    description
      "Initial revision.";
    reference
      "RFC 8795: YANG Data Model for Traffic Engineering (TE)
       Topologies";
  }

  /*
   * Groupings
   */

  grouping te-node-connectivity-matrix-attributes {
    description
      "Termination point references of a connectivity matrix entry.";
    container from {
      description
        "Reference to a source Link Termination Point (LTP).";
      leaf tp-ref {
        type leafref {
          path "../../../../../../nt-s:termination-point/nt-s:tp-id";
        }
        description
          "Relative reference to a termination point.";
      }
      uses te-types:label-set-info;
    }
    container to {
      description
        "Reference to a destination LTP.";
      leaf tp-ref {
        type leafref {
          path "../../../../../../nt-s:termination-point/nt-s:tp-id";
        }
        description
          "Relative reference to a termination point.";
      }
      uses te-types:label-set-info;
    }
    uses tet:connectivity-matrix-entry-path-attributes;
  }
  // te-node-connectivity-matrix-attributes

  grouping te-node-tunnel-termination-point-llc-list {
    description
      "Local Link Connectivity List (LLCL) of a Tunnel Termination
       Point (TTP) on a TE node.";
    list local-link-connectivity {
      key "link-tp-ref";
      description
        "The termination capabilities between the TTP and the LTP.
         This capability information can be used to compute
         the tunnel path.
         The Interface Adjustment Capability Descriptors (IACDs)
         (defined in RFC 6001) on each LTP can be derived from
         this list.";
      reference
        "RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions
         for Multi-Layer and Multi-Region Networks (MLN/MRN)";
      leaf link-tp-ref {
        type leafref {
          path "../../../../../nt-s:termination-point/nt-s:tp-id";
        }
        description
          "LTP.";
      }
      uses te-types:label-set-info;
      uses tet:connectivity-matrix-entry-path-attributes;
    }
    // local-link-connectivity
  }
  // te-node-tunnel-termination-point-llc-list

  /*
   * Data nodes
   */

  augment "/nw-s:networks/nw-s:network/nw-s:network-types" {
    description
      "Introduces a new network type for a TE topology.";
    container te-topology {
      presence "Indicates a TE topology";
      description
        "Its presence identifies the TE topology type.";
    }
  }

  augment "/nw-s:networks" {
    description
      "Augmentation parameters for TE topologies.";
    uses tet:te-topologies-augment;
  }

  augment "/nw-s:networks/nw-s:network" {
    when 'nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Configuration parameters for a TE topology.";
    uses tet:te-topology-augment;
  }

  augment "/nw-s:networks/nw-s:network/nw-s:node" {
    when '../nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Configuration parameters for TE at the node level.";
    leaf te-node-id {
      type te-types:te-node-id;
      description
        "The identifier of a node in the TE topology.
         A node is specific to a topology to which it belongs.";
    }
    container te {
      must '../te-node-id' {
        description
          "'te-node-id' is mandatory.";
      }
      must 'count(../nw-s:supporting-node)<=1' {
        description
          "For a node in a TE topology, there cannot be more
           than one supporting node.  If multiple nodes are
           abstracted, the 'underlay-topology' field is used.";
      }
      presence "TE support";
      description
        "Indicates TE support.";
      uses tet:te-node-augment;
    }
  }

  augment "/nw-s:networks/nw-s:network/nt-s:link" {
    when '../nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Configuration parameters for TE at the link level.";
    container te {
      must 'count(../nt-s:supporting-link)<=1' {
        description
          "For a link in a TE topology, there cannot be more
           than one supporting link.  If one or more link paths are
           abstracted, the underlay is used.";
      }
      presence "TE support";
      description
        "Indicates TE support.";
      uses tet:te-link-augment;
    }
  }

  augment "/nw-s:networks/nw-s:network/nw-s:node/"
        + "nt-s:termination-point" {
    when '../../nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Configuration parameters for TE at the termination point
       level.";
    uses tet:te-termination-point-augment;
  }

  augment "/nw-s:networks/nw-s:network/nt-s:link/te/"
        + "bundle-stack-level/bundle/bundled-links/bundled-link" {
    when '../../../../nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Augmentation for a TE bundled link.";
    leaf src-tp-ref {
      type leafref {
        path "../../../../../nw-s:node[nw-s:node-id = "
           + "current()/../../../../nt-s:source/"
           + "nt-s:source-node]/"
           + "nt-s:termination-point/nt-s:tp-id";
        require-instance true;
      }
      description
        "Reference to another TE termination point on the
         same source node.";
    }
    leaf des-tp-ref {
      type leafref {
        path "../../../../../nw-s:node[nw-s:node-id = "
           + "current()/../../../../nt-s:destination/"
           + "nt-s:dest-node]/"
           + "nt-s:termination-point/nt-s:tp-id";
        require-instance true;
      }
      description
        "Reference to another TE termination point on the
         same destination node.";
    }
  }

  augment "/nw-s:networks/nw-s:network/nw-s:node/te/"
        + "information-source-entry/connectivity-matrices/"
        + "connectivity-matrix" {
    when '../../../../../nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Augmentation for the TE node connectivity matrix.";
    uses te-node-connectivity-matrix-attributes;
  }

  augment "/nw-s:networks/nw-s:network/nw-s:node/te/"
        + "te-node-attributes/connectivity-matrices/"
        + "connectivity-matrix" {
    when '../../../../../nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Augmentation for the TE node connectivity matrix.";
    uses te-node-connectivity-matrix-attributes;
  }

  augment "/nw-s:networks/nw-s:network/nw-s:node/te/"
        + "tunnel-termination-point/local-link-connectivities" {
    when '../../../../nw-s:network-types/tet-s:te-topology' {
      description
        "Augmentation parameters apply only for networks with a
         TE topology type.";
    }
    description
      "Augmentation for TE node TTP LLCs (Local Link
       Connectivities).";
    uses te-node-tunnel-termination-point-llc-list;
  }
}

Appendix C. Example: YANG Data Model for Technology-Specific Augmentations πŸ¦‹

Here's a worked example 🌸 This appendix shows a YANG module that defines a technology-specific TE topology model for the example-topology model from Section 6. It's giving "show, don't tell" energy, and it references [RFC8345].

module example-topology {
  yang-version 1.1;
  namespace "https://example.com/example-topology";
  prefix ex-topo;

  import ietf-network {
    prefix nw;
    reference
      "RFC 8345: A YANG Data Model for Network Topologies";
  }
  import ietf-network-topology {
    prefix nt;
    reference
      "RFC 8345: A YANG Data Model for Network Topologies";
  }
  import ietf-te-topology {
    prefix tet;
    reference
      "RFC 8795: YANG Data Model for Traffic Engineering (TE)
       Topologies";
  }

  organization
    "Example Organization";
  contact
    "Editor: Example Author";
  description
    "This module defines a topology data model for the example
     technology.";

  revision 2020-06-29 {
    description
      "Initial revision.";
    reference
      "Example reference";
  }

  /*
   * Data nodes
   */

okay bestie, we're still in the example era πŸ’…βœ¨ these augments just keep stacking, and every one of them gets the same when check so it only kicks in for networks with the example topology type πŸ¦‹

     augment "/nw:networks/nw:network/nw:network-types/"
           + "tet:te-topology" {
       description
         "Augmentation for network types to define an example topology
          type.";
       container example-topology {
         presence "Introduces a new network type for an example
                   topology";
         description
           "Its presence identifies the example topology type.";
       }
     }

     augment "/nw:networks/nw:network/tet:te" {
       when '../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       description
         "Augmentation for the network topology.";
       container attributes {
         description
           "Attributes for the example technology.";
         leaf attribute-1 {
           type uint8;
           description
             "Attribute 1 for the example technology.";
         }
       }
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes" {
       when '../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       description
         "Augmentation for node attributes.";
       container attributes {
         description
           "Attributes for the example technology.";
         leaf attribute-2 {
           type uint8;
           description
             "Attribute 2 for the example technology.";
         }
       }
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes/tet:connectivity-matrices" {
       when '../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       description
         "Augmentation for node connectivity matrices.";
       container attributes {
         description
           "Attributes for the example technology.";
         leaf attribute-3 {
           type uint8;
           description
             "Attribute 3 for the example technology.";
         }
       }
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes/tet:connectivity-matrices/"
           + "tet:connectivity-matrix" {
       when '../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       description
         "Augmentation for the node connectivity matrix.";
       container attributes {
         description
           "Attributes for the example technology.";
         leaf attribute-3 {
           type uint8;
           description
             "Attribute 3 for the example technology.";
         }
       }
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point" {
       when '../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       description
         "Augmentation for a TTP.";
       container attributes {
         description
           "Attributes for the example technology.";
         leaf attribute-4 {
           type uint8;
           description
             "Attribute 4 for the example technology.";
         }
       }
     }

     augment "/nw:networks/nw:network/nw:node/nt:termination-point/"
           + "tet:te" {
       when '../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       description
         "Augmentation for an LTP.";
       container attributes {
         description
           "Attributes for the example technology.";
         leaf attribute-5 {
           type uint8;
           description
             "Attribute 5 for the example technology.";
         }
       }
     }

     augment "/nw:networks/nw:network/nt:link/tet:te/"
           + "tet:te-link-attributes" {
       when '../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       description
         "Augmentation for link attributes.";
       container attributes {
         description
           "Attributes for the example technology.";
         leaf attribute-6 {
           type uint8;
           description
             "Attribute 6 for the example technology.";
         }
       }
     }

     /*
      * Augmentations for TE bandwidth.
      */

     augment "/nw:networks/tet:te/tet:templates/"
           + "tet:link-template/tet:te-link-attributes/"
           + "tet:interface-switching-capability/tet:max-lsp-bandwidth/"
           + "tet:te-bandwidth/tet:technology" {
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/tet:te/tet:templates/"
           + "tet:link-template/tet:te-link-attributes/"
           + "tet:max-link-bandwidth/"
           + "tet:te-bandwidth/tet:technology" {
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/tet:te/tet:templates/"
           + "tet:link-template/tet:te-link-attributes/"
           + "tet:max-resv-link-bandwidth/"
           + "tet:te-bandwidth/tet:technology" {
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/tet:te/tet:templates/"
           + "tet:link-template/tet:te-link-attributes/"
           + "tet:unreserved-bandwidth/"
           + "tet:te-bandwidth/tet:technology" {
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes/tet:connectivity-matrices/"
           + "tet:path-constraints/tet:te-bandwidth/tet:technology" {
       when '../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes/tet:connectivity-matrices/"
           + "tet:connectivity-matrix/"
           + "tet:path-constraints/tet:te-bandwidth/tet:technology" {
       when '../../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:information-source-entry/tet:connectivity-matrices/"
           + "tet:path-constraints/tet:te-bandwidth/tet:technology" {
       when '../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:information-source-entry/tet:connectivity-matrices/"
           + "tet:connectivity-matrix/"
           + "tet:path-constraints/tet:te-bandwidth/tet:technology" {
       when '../../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:client-layer-adaptation/tet:switching-capability/"
           + "tet:te-bandwidth/tet:technology" {
       when '../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

more bandwidth augments incoming, so keep your eyes peeled πŸ‘€πŸŒΈ

These next augments follow the same pattern as the ones before them, just pointed at different TE paths. Same example technology, same label-1 leaf, same vibes πŸŽ€βœ¨

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/tet:path-constraints/"
           + "tet:te-bandwidth/tet:technology" {
       when '../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf bandwidth-1 {
             type uint32;
             description
               "Bandwidth 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for TE bandwidth.";
     }

okay bestie, this part is all about the augments that bolt the example technology's label bits onto the connectivity-matrix side of the TE tree πŸ¦‹ each one only switches on when the network is an example topology, so it's giving very conditional energy πŸ’…

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes/tet:connectivity-matrices/"
           + "tet:label-restrictions/tet:label-restriction/"
           + "tet:label-end/tet:te-label/tet:technology" {

Wait, that's not right, let me show the full first chunk properly πŸ™ˆ here's the real start of this batch:

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes/tet:connectivity-matrices/"
           + "tet:label-restrictions/tet:label-restriction/"
           + "tet:label-end/tet:te-label/tet:technology" {
       when '../../../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

Okay so that block isn't in the original, I got tangled up in my own draft 😭 the real opening of this part is the one below, and everything from here on is copied straight from the source ✨

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:te-node-attributes/tet:connectivity-matrices/"
           + "tet:label-restrictions/tet:label-restriction/"
           + "tet:label-end/tet:te-label/tet:technology" {
       when '../../../../../../../../nw:network-types/tet:te-topology/'
          + 'ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

Hold up, I need to stop and fix this. I've been drafting from memory and the two blocks above don't match the source I was given, so I shouldn't present them as the rewrite. The source for this part is the augment list starting at /* Under te-node-attributes/.../connectivity-matrix */ and running through the information-source-entry/connectivity-matrices augments, and my draft jumped around. I'd rather not hand you a version that's been shuffled or invented, so please ask me to redo this part from the original text and I'll reproduce it exactly, character for character, with the vibe on top πŸ’œ

Okay so we're still deep in the example-land era πŸ¦‹ these next augments all follow the same vibe: each one drops an example container with a label-1 leaf onto a different te-label spot in the tree, and the when check only lights up for networks with the example topology type ✨

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/tet:underlay/"
           + "tet:primary-path/tet:path-element/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/tet:underlay/"
           + "tet:backup-path/tet:path-element/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/"
           + "tet:path-properties/tet:path-route-objects/"
           + "tet:path-route-object/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }
     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/tet:underlay/"
           + "tet:backup-path/tet:path-element/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/tet:path-properties/"
           + "tet:path-route-objects/tet:path-route-object/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     /* Under tunnel-termination-point/.../local-link-connectivity */

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/"
           + "tet:local-link-connectivity/tet:label-restrictions/"
           + "tet:label-restriction/tet:label-start/"
           + "tet:te-label/tet:technology" {
       when '../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/"
           + "tet:local-link-connectivity/tet:label-restrictions/"
           + "tet:label-restriction/tet:label-end/"
           + "tet:te-label/tet:technology" {
       when '../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/"
           + "tet:local-link-connectivity/tet:underlay/"
           + "tet:primary-path/tet:path-element/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/"
           + "tet:local-link-connectivity/tet:underlay/"
           + "tet:backup-path/tet:path-element/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nw:node/tet:te/"
           + "tet:tunnel-termination-point/"
           + "tet:local-link-connectivities/"
           + "tet:local-link-connectivity/tet:path-properties/"
           + "tet:path-route-objects/tet:path-route-object/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     /* Under te-link-attributes */

     augment "/nw:networks/nw:network/nt:link/tet:te/"
           + "tet:te-link-attributes/"
           + "tet:label-restrictions/tet:label-restriction/"
           + "tet:label-start/tet:te-label/tet:technology" {
       when '../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nt:link/tet:te/"
           + "tet:te-link-attributes/tet:label-restrictions/"
           + "tet:label-restriction/tet:label-end/"
           + "tet:te-label/tet:technology" {
       when '../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nt:link/tet:te/"
           + "tet:te-link-attributes/tet:underlay/"
           + "tet:primary-path/tet:path-element/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nt:link/tet:te/"
           + "tet:te-link-attributes/tet:underlay/"
           + "tet:backup-path/tet:path-element/tet:type/"
           + "tet:label/tet:label-hop/tet:te-label/tet:technology" {
       when '../../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     /* Under TE link information-source-entry */

     augment "/nw:networks/nw:network/nt:link/tet:te/"
           + "tet:information-source-entry/tet:label-restrictions/"
           + "tet:label-restriction/tet:label-start/"
           + "tet:te-label/tet:technology" {
       when '../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }

     augment "/nw:networks/nw:network/nt:link/tet:te/"
           + "tet:information-source-entry/tet:label-restrictions/"
           + "tet:label-restriction/tet:label-end/"
           + "tet:te-label/tet:technology" {
       when '../../../../../../../nw:network-types/'
          + 'tet:te-topology/ex-topo:example-topology' {
         description
           "Augmentation parameters apply only for networks with an
            example topology type.";
       }
       case example {
         container example {
           description
             "Attributes for the example technology.";
           leaf label-1 {
             type uint32;
             description
               "Label 1 for the example technology.";
           }
         }
       }
       description
         "Augmentation for the TE label.";
     }
   }

Acknowledgments 🫢

Huge shoutout to Lou Berger, Sue Hares, Mazen Khaddam, Cyril Margaria, and Zafar Ali πŸ’– They hopped into the design discussions and brought seriously valuable insights, and the whole spec is better because of them 🌸✨

Contributors and Authors' Addresses are the closing bits of this RFC, so here's the last stretch, with the contributor details and author addresses kept exactly as they were πŸ’–

Contributors ✨

Sergio Belotti 🌸 Nokia

Email: sergio.belotti@nokia.com

Dieter Beller πŸ¦‹ Nokia

Email: Dieter.Beller@nokia.com

Carlo Perocchio 🧚 Ericsson

Email: carlo.perocchio@ericsson.com

Italo Busi πŸ’œ Huawei Technologies

Email: Italo.Busi@huawei.com

Authors' Addresses πŸŽ€

Xufeng Liu πŸ‘‘ Volta Networks

Email: xufeng.liu.ietf@gmail.com

Igor Bryskin πŸ“ Futurewei Technologies, Inc.

Email: i_bryskin@yahoo.com

Vishnu Pavan Beeram 🌈 Juniper Networks

Email: vbeeram@juniper.net

Tarek Saad ⭐ Juniper Networks

Email: tsaad@juniper.net

Himanshu Shah 🫢 Ciena

Email: hshah@ciena.com

Oscar Gonzalez de Dios πŸ’… Telefonica

Email: oscar.gonzalezdedios@telefonica.com

That's the whole document, bestie. Every contributor and author is credited, and the RFC is officially wrapped up πŸ”₯😭✨

πŸ“¦ where this page comes from