| |
| /* |
| * |
| * 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 |
| } |
| } |
| } |
| } |