/* * * Copyright 2016 RIFT.IO Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * */ module odl-network-topology { yang-version 1; namespace "urn:TBD:params:xml:ns:yang:network-topology"; // replace with IANA namespace when assigned prefix "nt"; import ietf-inet-types { prefix "inet"; } organization "TBD"; contact "WILL-BE-DEFINED-LATER"; description "This module defines a model for the topology of a network. Key design decisions are as follows: A topology consists of a set of nodes and links. Links are point-to-point and unidirectional. Bidirectional connections need to be represented through two separate links. Multipoint connections, broadcast domains etc can be represented through a hierarchy of nodes, then connecting nodes at upper layers of the hierarchy."; revision 2013-10-21 { description "Initial revision."; } typedef topology-id { type inet:uri; description "An identifier for a topology."; } typedef node-id { type inet:uri; description "An identifier for a node in a topology. The identifier may be opaque. The identifier SHOULD be chosen such that the same node in a real network topology will always be identified through the same identifier, even if the model is instantiated in separate datastores. An implementation MAY choose to capture semantics in the identifier, for example to indicate the type of node and/or the type of topology that the node is a part of."; } typedef link-id { type inet:uri; description "An identifier for a link in a topology. The identifier may be opaque. The identifier SHOULD be chosen such that the same link in a real network topology will always be identified through the same identifier, even if the model is instantiated in separate datastores. An implementation MAY choose to capture semantics in the identifier, for example to indicate the type of link and/or the type of topology that the link is a part of."; } typedef tp-id { type inet:uri; description "An identifier for termination points on a node. The identifier may be opaque. The identifier SHOULD be chosen such that the same TP in a real network topology will always be identified through the same identifier, even if the model is instantiated in separate datastores. An implementation MAY choose to capture semantics in the identifier, for example to indicate the type of TP and/or the type of node and topology that the TP is a part of."; } typedef tp-ref { type leafref { path "/network-topology/topology/node/termination-point/tp-id"; } description "A type for an absolute reference to a termination point. (This type should not be used for relative references. In such a case, a relative path should be used instead.)"; } typedef topology-ref { type leafref { path "/network-topology/topology/topology-id"; } description "A type for an absolute reference a topology instance."; } typedef node-ref { type leafref { path "/network-topology/topology/node/node-id"; } description "A type for an absolute reference to a node instance. (This type should not be used for relative references. In such a case, a relative path should be used instead.)"; } typedef link-ref { type leafref { path "/network-topology/topology/link/link-id"; } description "A type for an absolute reference a link instance. (This type should not be used for relative references. In such a case, a relative path should be used instead.)"; } grouping tp-attributes { description "The data objects needed to define a termination point. (This only includes a single leaf at this point, used to identify the termination point.) Provided in a grouping so that in addition to the datastore, the data can also be included in notifications."; leaf tp-id { type tp-id; } leaf-list tp-ref { type tp-ref; config false; description "The leaf list identifies any termination points that the termination point is dependent on, or maps onto. Those termination points will themselves be contained in a supporting node. This dependency information can be inferred from the dependencies between links. For this reason, this item is not separately configurable. Hence no corresponding constraint needs to be articulated. The corresponding information is simply provided by the implementing system."; } } grouping node-attributes { description "The data objects needed to define a node. The objects are provided in a grouping so that in addition to the datastore, the data can also be included in notifications as needed."; leaf node-id { type node-id; description "The identifier of a node in the topology. A node is specific to a topology to which it belongs."; } list supporting-node { description "This list defines vertical layering information for nodes. It allows to capture for any given node, which node (or nodes) in the corresponding underlay topology it maps onto. A node can map to zero, one, or more nodes below it; accordingly there can be zero, one, or more elements in the list. If there are specific layering requirements, for example specific to a particular type of topology that only allows for certain layering relationships, the choice below can be augmented with additional cases. A list has been chosen rather than a leaf-list in order to provide room for augmentations, e.g. for statistics or priorization information associated with supporting nodes."; // This is not what was published in the initial draft, // added topology-ref leaf and added it to the key key "topology-ref node-ref"; leaf topology-ref { type topology-ref; } leaf node-ref { type node-ref; } } } grouping link-attributes { // This is a grouping, not defined inline with the link definition itself, // so it can be included in a notification, if needed leaf link-id { type link-id; description "The identifier of a link in the topology. A link is specific to a topology to which it belongs."; } container source { leaf source-node { mandatory true; type node-ref; description "Source node identifier, must be in same topology."; } leaf source-tp { type tp-ref; description "Termination point within source node that terminates the link."; } } container destination { leaf dest-node { mandatory true; type node-ref; description "Destination node identifier, must be in same topology."; } leaf dest-tp { type tp-ref; description "Termination point within destination node that terminates the link."; } } list supporting-link { key "link-ref"; leaf link-ref { type link-ref; } } } container network-topology { list topology { description " This is the model of an abstract topology. A topology contains nodes and links. Each topology MUST be identified by unique topology-id for reason that a network could contain many topologies. "; key "topology-id"; leaf topology-id { type topology-id; description " It is presumed that a datastore will contain many topologies. To distinguish between topologies it is vital to have UNIQUE topology identifiers. "; } leaf server-provided { type boolean; config false; description " Indicates whether the topology is configurable by clients, or whether it is provided by the server. This leaf is populated by the server implementing the model. It is set to false for topologies that are created by a client; it is set to true otherwise. If it is set to true, any attempt to edit the topology MUST be rejected. "; } container topology-types { description "This container is used to identify the type, or types (as a topology can support several types simultaneously), of the topology. Topology types are the subject of several integrity constraints that an implementing server can validate in order to maintain integrity of the datastore. Topology types are indicated through separate data nodes; the set of topology types is expected to increase over time. To add support for a new topology, an augmenting module needs to augment this container with a new empty optional container to indicate the new topology type. The use of a container allows to indicate a subcategorization of topology types. The container SHALL NOT be augmented with any data nodes that serve a purpose other than identifying a particular topology type. "; } list underlay-topology { key "topology-ref"; leaf topology-ref { type topology-ref; } // a list, not a leaf-list, to allow for potential augmentation // with properties specific to the underlay topology, // such as statistics, preferences, or cost. description "Identifies the topology, or topologies, that this topology is dependent on."; } list node { description "The list of network nodes defined for the topology."; key "node-id"; uses node-attributes; must "boolean(../underlay-topology[*]/node[./supporting-nodes/node-ref])"; // This constraint is meant to ensure that a referenced node is in fact // a node in an underlay topology. list termination-point { description "A termination point can terminate a link. Depending on the type of topology, a termination point could, for example, refer to a port or an interface."; key "tp-id"; uses tp-attributes; } } list link { description " A Network Link connects a by Local (Source) node and a Remote (Destination) Network Nodes via a set of the nodes' termination points. As it is possible to have several links between the same source and destination nodes, and as a link could potentially be re-homed between termination points, to ensure that we would always know to distinguish between links, every link is identified by a dedicated link identifier. Note that a link models a point-to-point link, not a multipoint link. Layering dependencies on links in underlay topologies are not represented as the layering information of nodes and of termination points is sufficient. "; key "link-id"; uses link-attributes; must "boolean(../underlay-topology/link[./supporting-link])"; // Constraint: any supporting link must be part of an underlay topology must "boolean(../node[./source/source-node])"; // Constraint: A link must have as source a node of the same topology must "boolean(../node[./destination/dest-node])"; // Constraint: A link must have as source a destination of the same topology must "boolean(../node/termination-point[./source/source-tp])"; // Constraint: The source termination point must be contained in the source node must "boolean(../node/termination-point[./destination/dest-tp])"; // Constraint: The destination termination point must be contained // in the destination node } } } }