[ONOS-4636]YANG Grouping linking bug fix + YANG Code review comment fix

Change-Id: I68ee8dd08266a02593e217cef1a9bb010037d673
diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-te-topology.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-te-topology.yang
new file mode 100644
index 0000000..849828f
--- /dev/null
+++ b/utils/yangutils/src/test/resources/interfileietf/ietf-te-topology.yang
@@ -0,0 +1,1730 @@
+   module ietf-te-topology {
+     yang-version 1;
+     namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology";
+     // replace with IANA namespace when assigned
+
+     prefix "tet";
+
+     import ietf-inet-types {
+       prefix "inet";
+     }
+
+     import ietf-schedule {
+       prefix "sch";
+     }
+
+     import ietf-te-types {
+       prefix "te-types";
+     }
+
+     import ietf-network {
+       prefix "nw";
+     }
+
+     import ietf-network-topology {
+       prefix "nt";
+     }
+
+     organization
+       "Traffic Engineering Architecture and Signaling (TEAS)
+        Working Group";
+
+     contact
+       "WG Web:   <http://tools.ietf.org/wg/teas/>
+        WG List:  <mailto:teas@ietf.org>
+
+        WG Chair: Lou Berger
+                  <mailto:lberger@labn.net>
+
+        WG Chair: Vishnu Pavan Beeram
+                  <mailto:vbeeram@juniper.net>
+
+        Editor:   Xufeng Liu
+                  <mailto:xliu@kuatrotech.com>
+
+        Editor:   Igor Bryskin
+                  <mailto:Igor.Bryskin@huawei.com>
+
+        Editor:   Vishnu Pavan Beeram
+                  <mailto:vbeeram@juniper.net>
+
+        Editor:   Tarek Saad
+                  <mailto:tsaad@cisco.com>
+
+        Editor:   Himanshu Shah
+                  <mailto:hshah@ciena.com>
+
+        Editor:   Oscar Gonzalez De Dios
+                  <mailto:oscar.gonzalezdedios@telefonica.com>";
+
+     description "TE topology model";
+
+     revision "2016-03-17" {
+       description "Initial revision";
+       reference "TBD";
+     }
+
+     /*
+      * Features
+      */
+
+     /*feature configuration-schedule {
+       description
+         "This feature indicates that the system supports
+          configuration scheduling.";
+     }
+
+     feature te-topology-hierarchy {
+       description
+         "This feature indicates that the system allows underlay
+          and/or overlay TE topology hierarchy.";
+     }
+
+     feature te-performance-metric {
+       description
+         "This feature indicates that the system supports
+          TE performance metric defined in
+          RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
+     }
+
+     feature template {
+       description
+         "This feature indicates that the system supports
+          template configuration.";
+     }*/
+
+     /*
+      * Typedefs
+      */
+     typedef performance-metric-normality {
+       type enumeration {
+         enum "unknown" {
+           value 0;
+           description
+             "Unknown.";
+         }
+         enum "normal" {
+           value 1;
+           description
+             "Normal.";
+         }
+         enum "abnormal" {
+           value 2;
+           description
+             "Abnormal. The anomalous bit is set.";
+         }
+       }
+       description
+         "Indicates whether a performance metric is normal, abnormal, or
+          unknown.";
+       reference
+         "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
+     }
+
+     typedef te-admin-status {
+       type enumeration {
+         enum up {
+           description
+             "Enabled.";
+         }
+         enum down {
+           description
+             "Disabled.";
+         }
+         enum testing {
+           description
+             "In some test mode.";
+         }
+         enum preparing-maintenance {
+           description
+             "Resource is disabled in the control plane to prepare for
+              graceful shutdown for maintenance purposes.";
+           reference
+             "RFC5817: Graceful Shutdown in MPLS and Generalized MPLS
+              Traffic Engineering Networks";
+         }
+         enum maintenance {
+           description
+             "Resource is disabled in the data plane for maintenance
+              purposes.";
+         }
+       }
+       description
+         "Defines a type representing the administrative status of
+          a TE resource.";
+     }
+     typedef te-global-id {
+       type uint32;
+       description
+         "An identifier to uniquely identify an operator, which can be
+          either a provider or a client.
+          The definition of this type is taken from RFC6370 and RFC5003.
+          This attribute type is used solely to provide a globally
+          unique context for TE topologies.";
+     }
+
+     typedef te-link-access-type {
+       type enumeration {
+         enum point-to-point {
+           description
+             "The link is point-to-point.";
+         }
+         enum multi-access {
+           description
+             "The link is multi-access, including broacast and NBMA.";
+         }
+       }
+       description
+         "Defines a type representing the access type of a TE link.";
+       reference
+         "RFC3630: Traffic Engineering (TE) Extensions to OSPF
+          Version 2.";
+     }
+
+     typedef te-node-id {
+       type inet:ip-address;
+       description
+         "An identifier for a node in a topology.
+          The identifier is represented as an IPv4 or IPv6 address.
+          This attribute is mapped to Router ID in
+          RFC3630, RFC5329, RFC5305, and RFC 6119.";
+     }
+
+     typedef te-oper-status {
+       type enumeration {
+         enum up {
+           description
+           "Operational up.";
+         }
+         enum down {
+           description
+           "Operational down.";
+         }
+         enum testing {
+           description
+           "In some test mode.";
+         }
+         enum unknown {
+           description
+           "Status cannot be determined for some reason.";
+         }
+         enum preparing-maintenance {
+           description
+             "Resource is disabled in the control plane to prepare for
+              graceful shutdown for maintenance purposes.";
+           reference
+             "RFC5817: Graceful Shutdown in MPLS and Generalized MPLS
+              Traffic Engineering Networks";
+         }
+         enum maintenance {
+           description
+             "Resource is disabled in the data plane for maintenance
+              purposes.";
+         }
+       }
+       description
+         "Defines a type representing the operational status of
+          a TE resource.";
+     }
+
+     typedef te-recovery-status {
+       type enumeration {
+         enum normal {
+           description
+             "Both the recovery and working spans are fully
+              allocated and active, data traffic is being
+              transported over (or selected from) the working
+              span, and no trigger events are reported.";
+         }
+         enum recovery-started {
+           description
+             "The recovery action has been started, but not completed.";
+         }
+         enum recovery-succeeded {
+           description
+             "The recovery action has succeeded. The working span has
+              reported a failure/degrade condition and the user traffic
+              is being transported (or selected) on the recovery span.";
+         }
+         enum recovery-failed {
+           description
+             "The recovery action has failed.";
+         }
+         enum reversion-started {
+           description
+             "The reversion has started.";
+         }
+         enum reversion-failed {
+           description
+             "The reversion has failed.";
+         }
+         enum recovery-unavailable {
+           description
+             "The recovery is unavailable -- either as a result of an
+              operator Lockout command or a failure condition detected
+              on the recovery span.";
+         }
+         enum recovery-admin {
+           description
+             "The operator has issued a command switching the user
+              traffic to the recovery span.";
+         }
+         enum wait-to-restore {
+           description
+             "The recovery domain is recovering from a failuer/degrade
+              condition on the working span that is being controlled by
+              the Wait-to-Restore (WTR) timer.";
+         }
+       }
+       description
+         "Defines the status of a recovery action.";
+       reference
+         "RFC4427: Recovery (Protection and Restoration) Terminology
+          for Generalized Multi-Protocol Label Switching (GMPLS).
+          RFC6378: MPLS Transport Profile (MPLS-TP) Linear Protection";
+     }
+
+     typedef te-template-name {
+       type string {
+         pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
+       }
+       description
+         "A type for the name of a TE node template or TE link
+          template.";
+     }
+
+     typedef te-topology-event-type {
+       type enumeration {
+         enum "add" {
+           value 0;
+           description
+             "A TE node or te-link has been added.";
+         }
+         enum "remove" {
+           value 1;
+           description
+             "A TE node or te-link has been removed.";
+         }
+         enum "update" {
+           value 2;
+           description
+             "A TE node or te-link has been updated.";
+         }
+       }
+       description "TE  Event type for notifications";
+     } // te-topology-event-type
+     typedef te-topology-id {
+       type string {
+         pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
+       }
+       description
+         "An identifier for a topology.";
+     }
+
+     typedef te-tp-id {
+       type union {
+         type uint32;          // Unnumbered
+         type inet:ip-address; // IPv4 or IPv6 address
+       }
+       description
+         "An identifier for a TE link endpoint on a node.
+          This attribute is mapped to local or remote link identifier in
+          RFC3630 and RFC5305.";
+     }
+
+     /*
+      * Identities
+      */
+
+     /*
+      * Groupings
+      */
+     grouping information-source-attributes {
+       description
+         "The attributes identifying source that has provided the
+          related information, and the source credibility.";
+       leaf information-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 "ISIS.";
+           }
+           enum "system-processed" {
+             description "System processed entity.";
+           }
+           enum "other" {
+             description "Other source.";
+           }
+         }
+         description
+           "Indicates the source of the information.";
+       }
+       container information-source-state {
+         description
+           "The container contains state attributes related to
+            the information source.";
+         leaf credibility-preference {
+           type uint16;
+           description
+             "The preference value to calculate the traffic
+              engineering database credibility value used for
+              tie-break selection between different
+              information-source values.
+              Higher value is more preferable.";
+         }
+         container topology {
+           description
+             "When the information is processed by the system,
+              the attributes in this container indicate which topology
+              is used to process to generate the result information.";
+           uses te-topology-ref;
+         } // topology
+         leaf routing-instance {
+           type string;
+           description
+             "When applicable, this is the name of a routing instance
+              from which the information is learned.";
+         } // routing-information
+       }
+     } // information-source-attributes
+
+     grouping performance-metric-attributes {
+       description
+         "Link performance information in real time.";
+       reference
+         "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
+       leaf unidirectional-delay {
+         type uint32 {
+           range 0..16777215;
+         }
+         description "Delay or latency in micro seconds.";
+       }
+       leaf unidirectional-min-delay {
+         type uint32 {
+           range 0..16777215;
+         }
+         description "Minimum delay or latency in micro seconds.";
+       }
+       leaf unidirectional-max-delay {
+         type uint32 {
+           range 0..16777215;
+         }
+         description "Maximum delay or latency in micro seconds.";
+       }
+       leaf unidirectional-delay-variation {
+         type uint32 {
+           range 0..16777215;
+         }
+         description "Delay variation in micro seconds.";
+       }
+       leaf unidirectional-packet-loss {
+         type decimal64 {
+           /*fraction-digits 6;
+           range "0 .. 50.331642";*/
+         }
+         description
+           "Packet loss as a percentage of the total traffic sent
+            over a configurable interval. The finest precision is
+            0.000003%.";
+       }
+       leaf unidirectional-residual-bandwidth {
+         type decimal64 {
+           /*fraction-digits 2;*/
+         }
+         description
+           "Residual bandwidth that subtracts tunnel
+            reservations from Maximum Bandwidth (or link capacity)
+            [RFC3630] and provides an aggregated remainder across QoS
+            classes.";
+       }
+       leaf unidirectional-available-bandwidth {
+         type decimal64 {
+           /*fraction-digits 2;*/
+         }
+         description
+           "Available bandwidth that is defined to be residual
+            bandwidth minus the measured bandwidth used for the
+            actual forwarding of non-RSVP-TE LSP packets.  For a
+            bundled link, available bandwidth is defined to be the
+            sum of the component link available bandwidths.";
+       }
+       leaf unidirectional-utilized-bandwidth {
+         type decimal64 {
+           /*fraction-digits 2;*/
+         }
+         description
+           "Bandwidth utilization that represents the actual
+            utilization of the link (i.e. as measured in the router).
+            For a bundled link, bandwidth utilization is defined to
+            be the sum of the component link bandwidth
+            utilizations.";
+       }
+     } // performance-metric-attributes
+     grouping performance-metric-normality-attributes {
+       description
+         "Link performance metric normality attributes.";
+       reference
+         "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
+       leaf unidirectional-delay {
+         type performance-metric-normality;
+         description "Delay normality.";
+       }
+       leaf unidirectional-min-delay {
+         type performance-metric-normality;
+         description "Minimum delay or latency normality.";
+       }
+       leaf unidirectional-max-delay {
+         type performance-metric-normality;
+         description "Maximum delay or latency normality.";
+       }
+       leaf unidirectional-delay-variation {
+         type performance-metric-normality;
+         description "Delay variation normality.";
+       }
+       leaf unidirectional-packet-loss {
+         type performance-metric-normality;
+         description "Packet loss normality.";
+       }
+       leaf unidirectional-residual-bandwidth {
+         type performance-metric-normality;
+         description "Residual bandwidth normality.";
+       }
+       leaf unidirectional-available-bandwidth {
+         type performance-metric-normality;
+         description "Available bandwidth normality.";
+       }
+       leaf unidirectional-utilized-bandwidth {
+         type performance-metric-normality;
+         description "Bandwidth utilization normality.";
+       }
+     } // performance-metric-normality-attributes
+
+     grouping performance-metric-throttle-container {
+       description
+         "A container controlling performance metric throttle.";
+       container performance-metric-throttle {
+         if-feature te-performance-metric;
+         /*must "suppression-interval >= measure-interval" {
+           error-message
+             "suppression-interval cannot be less then
+              measure-interval.";
+           description
+             "Constraint on suppression-interval and
+              measure-interval.";
+         }*/
+         description
+           "Link performance information in real time.";
+         reference
+           "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
+         leaf unidirectional-delay-offset {
+           type uint32 {
+             range 0..16777215;
+           }
+           description
+             "Offset value to be added to the measured delay value.";
+         }
+         leaf measure-interval {
+           type uint32;
+           default 30;
+           description
+             "Interval in seconds to measure the extended metric
+              values.";
+         }
+         leaf advertisement-interval {
+           type uint32;
+           description
+             "Interval in seconds to advertise the extended metric
+              values.";
+         }
+         leaf suppression-interval {
+           type uint32 {
+             range "1..max";
+           }
+           default 120;
+           description
+             "Interval in seconds to suppress advertising the extended
+              metric values.";
+         }
+         container threshold-out {
+           uses performance-metric-attributes;
+           description
+             "If the measured parameter falls outside an upper bound
+              for all but the min delay metric (or lower bound for
+              min-delay metric only) and the advertised value is not
+              already outside that bound, anomalous announcement will be
+              triggered.";
+         }
+         container threshold-in {
+           uses performance-metric-attributes;
+           description
+             "If the measured parameter falls inside an upper bound
+              for all but the min delay metric (or lower bound for
+              min-delay metric only) and the advertised value is not
+              already inside that bound, normal (anomalous-flag cleared)
+              announcement will be triggered.";
+         }
+         container threshold-accelerated-advertisement {
+           description
+             "When the difference between the last advertised value and
+              current measured value exceed this threshold, anomalous
+              announcement will be triggered.";
+           uses performance-metric-attributes;
+         }
+       }
+     } // performance-metric-throttle-container
+
+     grouping te-link-augment {
+       description
+         "Augmentation for TE link.";
+
+       container te {
+         presence "TE support.";
+         description
+           "Indicates TE support.";
+
+         container config {
+           description
+             "Configuration data.";
+           uses te-link-config;
+         } // config
+         container state {
+           config false;
+           description
+             "Operational state data.";
+           uses te-link-config;
+           uses te-link-state-derived;
+         } // state
+       } // te
+     } // te-link-augment
+
+     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
+               "RFC4201: Link Bundling in MPLS Traffic Engineering
+               (TE).";
+             list bundled-link {
+               key "sequence";
+               description
+                 "Specify a bundled interface that is
+                  further partitioned.";
+               leaf sequence {
+                 type uint32;
+                 description
+                   "Identify the sequence in the bundle.";
+               }
+               leaf src-tp-ref {
+                 type nt:tp-id;
+                 description
+                   "Reference to another TE termination point on the
+                    same souruce node.";
+               }
+               leaf des-tp-ref {
+                 type nt:tp-id;
+                 description
+                   "Reference to another TE termination point on the
+                    same destination node.";
+               }
+             } // list bundled-link
+           }
+         }
+         case component {
+           container component-links {
+             description
+               "A set of component links";
+             list component-link {
+               key "sequence";
+               description
+                 "Specify a component interface that is
+                  sufficient to unambiguously identify the
+                  appropriate resources";
+
+               leaf sequence {
+                 type uint32;
+                 description
+                   "Identify the sequence in the bundle.";
+               }
+               leaf src-interface-ref {
+                 type string;
+                 description
+                   "Reference to component link interface on the
+                    source node.";
+               }
+               leaf des-interface-ref {
+                 type string;
+                 description
+                   "Reference to component link interface on the
+                    destinatioin node.";
+               }
+             }
+           }
+         }
+       } // bundle-stack-level
+
+       leaf-list te-link-template {
+         if-feature template;
+         type te-template-name;
+         description
+           "The reference to a TE link template.";
+       }
+       uses te-link-config-attributes;
+     } // te-link-config
+
+     grouping te-link-config-attributes {
+       description
+         "Link configuration attributes in a TE topology.";
+       container te-link-attributes {
+         description "Link attributes in a TE topology.";
+         uses sch:schedules;
+         leaf access-type {
+           type te-link-access-type;
+           description
+             "Link access type, which can be point-to-point or
+              multi-access.";
+         }
+         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;
+           presence
+             "Indicates the underlay exists for this link.";
+           description "Attributes of the te-link underlay.";
+           reference
+             "RFC4206: Label Switched Paths (LSP) Hierarchy with
+              Generalized Multi-Protocol Label Switching (GMPLS)
+              Traffic Engineering (TE)";
+
+           uses te-link-underlay-attributes;
+         } // underlay
+         leaf admin-status {
+           type te-admin-status;
+           description
+             "The administrative state of the link.";
+         }
+
+         uses performance-metric-throttle-container;
+         uses te-link-info-attributes;
+       } // te-link-attributes
+     } // te-link-config-attributes
+
+     grouping te-link-info-attributes {
+       description
+         "Advertised TE information attributes.";
+       leaf link-index {
+         type uint64;
+         description
+           "The link identifier.  If OSPF is used, this represents an
+            ospfLsdbID.  If IS-IS is used, this 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 group (defined in
+            RFC3630, RFC5329, and RFC5305), and extended administrative
+            group (defined in RFC7308).";
+       }
+       leaf max-link-bandwidth {
+         type decimal64 {
+           /*fraction-digits 2;*/
+         }
+         description
+           "Maximum bandwidth that can be seen on this link in this
+            direction. Units in bytes per second.";
+         reference
+           "RFC3630: Traffic Engineering (TE) Extensions to OSPF
+            Version 2.
+            RFC5305: IS-IS Extensions for Traffic Engineering.";
+       }
+       leaf max-resv-link-bandwidth {
+         type decimal64 {
+           /*fraction-digits 2;*/
+         }
+         description
+           "Maximum amount of bandwidth that can be reserved in this
+            direction in this link. Units in bytes per second.";
+         reference
+           "RFC3630: Traffic Engineering (TE) Extensions to OSPF
+            Version 2.
+            RFC5305: IS-IS Extensions for Traffic Engineering.";
+       }
+       list unreserved-bandwidth {
+         key "priority";
+         max-elements "8";
+         description
+           "Unreserved bandwidth for 0-7 priority levels. Units in
+            bytes per second.";
+         reference
+           "RFC3630: Traffic Engineering (TE) Extensions to OSPF
+            Version 2.
+            RFC5305: IS-IS Extensions for Traffic Engineering.";
+         leaf priority {
+           type uint8 {
+             range "0..7";
+           }
+           description "Priority.";
+         }
+         leaf bandwidth {
+           type decimal64 {
+             /*fraction-digits 2;*/
+           }
+           description
+             "Unreserved bandwidth for this level.";
+         }
+       }
+       leaf te-default-metric {
+         type uint32;
+         description
+           "Traffic Engineering Metric.";
+       }
+       container performance-metric {
+         if-feature te-performance-metric;
+         description
+           "Link performance information in real time.";
+         reference
+           "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
+         container measurement {
+           description
+             "Measured performance metric values. Static configuration
+              and manual overrides of these measurements are also
+              allowed.";
+           uses performance-metric-attributes;
+         }
+         container normality
+         {
+           description
+             "Performance metric normality values.";
+           uses performance-metric-normality-attributes;
+         }
+       }
+       leaf link-protection-type {
+         type enumeration {
+           enum "unprotected" {
+             description "Unprotected.";
+           }
+           enum "extra-traffic" {
+             description "Extra traffic.";
+           }
+           enum "shared" {
+             description "Shared.";
+           }
+           enum "1-for-1" {
+             description "One for one protection.";
+           }
+           enum "1-plus-1" {
+             description "One plus one protection.";
+           }
+           enum "enhanced" {
+             description "Enhanced protection.";
+           }
+         }
+         description
+           "Link Protection Type desired for this link.";
+         reference
+           "RFC4202: Routing Extensions in Support of
+            Generalized Multi-Protocol Label Switching (GMPLS).";
+       }
+       list interface-switching-capability {
+         key "switching-capability";
+         description
+           "List of Interface Switching Capabilities Descriptors (ISCD)
+            for this link.";
+         reference
+           "RFC3471: Generalized Multi-Protocol Label Switching (GMPLS)
+            Signaling Functional Description.
+            RFC4203: OSPF Extensions in Support of Generalized
+            Multi-Protocol Label Switching (GMPLS).";
+         leaf switching-capability {
+           type string;
+           description
+             "Switching Capability for this interface.";
+         }
+         leaf encoding {
+           type string;
+           description
+             "Encoding supported by this interface.";
+         }
+         list max-lsp-bandwidth {
+           key "priority";
+           max-elements "8";
+           description
+             "Maximum LSP Bandwidth at priorities 0-7.";
+           leaf priority {
+             type uint8 {
+               range "0..7";
+             }
+             description "Priority.";
+           }
+           leaf bandwidth {
+             type decimal64 {
+               /*fraction-digits 2;*/
+             }
+             description
+               "Max LSP Bandwidth for this level";
+           }
+         }
+         container time-division-multiplex-capable {
+           when "../switching-capability = 'TDM'" {
+             description "Valid only for TDM";
+           }
+           description
+             "Interface has time-division multiplex capabilities.";
+
+           leaf minimum-lsp-bandwidth {
+             type decimal64 {
+               /*fraction-digits 2;*/
+             }
+             description
+               "Minimum LSP Bandwidth. Units in bytes per second.";
+           }
+           leaf indication {
+             type enumeration {
+               enum "standard" {
+                 description
+                   "Indicates support of standard SONET/SDH.";
+               }
+               enum "arbitrary" {
+                 description
+                   "Indicates support of arbitrary SONET/SDH.";
+               }
+             }
+             description
+               "Indication whether the interface supports Standard or
+                Arbitrary SONET/SDH";
+           }
+         }
+         list interface-adjustment-capability {
+           key "upper-sc";
+           description
+             "List of Interface Adjustment Capability Descriptors (IACD)
+              for this link.";
+           reference
+             "RFC6001: Generalized MPLS (GMPLS) Protocol Extensions
+              for Multi-Layer and Multi-Region Networks (MLN/MRN).";
+           leaf upper-sc {
+             type string;
+             description
+               "Switching Capability for this interface.";
+           }
+           leaf upper-encoding {
+             type string;
+             description
+               "Encoding supported by this interface.";
+           }
+           list max-lsp-bandwidth {
+             key "priority";
+             max-elements "8";
+             description
+               "Maximum LSP Bandwidth at priorities 0-7.";
+             leaf priority {
+               type uint8 {
+                 range "0..7";
+               }
+               description "Priority.";
+             }
+             leaf bandwidth {
+               type decimal64 {
+                 /*fraction-digits 2;*/
+               }
+               description
+                 "Max LSP Bandwidth for this level.";
+             }
+           }
+         } // interface-adjustment-capability
+       } // interface-switching-capability
+       container te-srlgs {
+         description
+           "A list of SLRGs.";
+         leaf-list values {
+           type te-types:srlg;
+           description "SRLG value.";
+           reference
+             "RFC4202: Routing Extensions in Support of
+              Generalized Multi-Protocol Label Switching (GMPLS).";
+         }
+       }
+     } // te-link-info-attributes
+
+     grouping te-link-state-derived {
+       description
+         "Link state attributes in a TE topology.";
+       leaf oper-status {
+         type te-oper-status;
+         description
+           "The current operational state of the link.";
+       }
+       uses information-source-attributes;
+       list alt-information-sources {
+         key "information-source";
+         description
+           "A list of information sources learned but not used.";
+         uses information-source-attributes;
+         uses te-link-info-attributes;
+       }
+       container recovery {
+         description
+           "Status of the recovery process.";
+         leaf restoration-status {
+           type te-recovery-status;
+           description
+             "Restoration status.";
+         }
+         leaf protection-status {
+           type te-recovery-status;
+           description
+             "Protection status.";
+         }
+       }
+       container underlay {
+         if-feature te-topology-hierarchy;
+         description "State attributes for te-link underlay.";
+         uses te-link-state-underlay-attributes;
+       }
+     } // te-link-state-derived
+     grouping te-link-state-underlay-attributes {
+       description "State attributes for 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-underlay-attributes
+
+     grouping te-link-underlay-attributes {
+       description "Attributes for  te-link underlay.";
+       reference
+         "RFC4206: Label Switched Paths (LSP) Hierarchy with
+          Generalized Multi-Protocol Label Switching (GMPLS)
+          Traffic Engineering (TE)";
+       container underlay-primary-path {
+         description
+           "The service path on the underlay topology that
+            supports this link.";
+         uses te-topology-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;
+         }
+       } // underlay-primary-path
+       list underlay-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 te-topology-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;
+         }
+       } // underlay-backup-path
+       leaf underlay-protection-type {
+         type uint16;
+         description
+           "Underlay protection type desired for this link";
+       }
+       container underlay-trail-src {
+         uses nt:tp-ref;
+         description
+           "Source TE link of the underlay trail.";
+       }
+       container underlay-trail-des {
+         uses nt:tp-ref;
+         description
+           "Destination TE link of the underlay trail.";
+       }
+     } // te-link-underlay-attributes
+
+     grouping te-node-augment {
+       description
+         "Augmentation for TE node.";
+
+       container te {
+         presence "TE support.";
+         description
+           "Indicates TE support.";
+
+         leaf te-node-id {
+           type te-node-id;
+           mandatory true;
+           description
+             "The identifier of a node in the TE topology.
+              A node is specific to a topology to which it belongs.";
+         }
+
+         container config {
+           description
+             "Configuration data.";
+           uses te-node-config;
+         } // config
+         container state {
+           config false;
+           description
+             "Operational state data.";
+
+           uses te-node-config;
+           uses te-node-state-derived;
+         } // state
+
+         list tunnel-termination-point {
+           key "tunnel-tp-id";
+           description
+             "A termination point can terminate a tunnel.";
+           leaf tunnel-tp-id {
+             type binary;
+             description
+               "Tunnel termination point identifier.";
+           }
+           container config {
+             description
+               "Configuration data.";
+             uses te-node-tunnel-termination-capability;
+           }
+
+           container state {
+             config false;
+             description
+               "Operational state data.";
+
+             uses te-node-tunnel-termination-capability;
+             leaf switching-capability {
+               type string;
+               mandatory true;
+               description
+                 "Switching Capability.";
+             }
+             leaf encoding {
+               type string;
+               mandatory true;
+               description
+                 "Encoding type.";
+             }
+           } // state
+
+         } // tunnel-termination-point
+       } // te
+     } // te-node-augment
+
+     grouping te-node-config {
+       description "TE node configuration grouping.";
+
+       leaf-list te-node-template {
+         if-feature template;
+         type te-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 "Containing node attributes in a TE topology.";
+         uses sch:schedules;
+         leaf admin-status {
+           type te-admin-status;
+           description
+             "The administrative state of the link.";
+         }
+         uses te-node-connectivity-matrix;
+         uses te-node-info-attributes;
+       } // te-node-attributes
+     } // te-node-config-attributes
+
+     grouping te-node-config-attributes-notification {
+       description
+         "Configuration node attributes for template in a TE topology.";
+       container te-node-attributes {
+         description "Containing node attributes in a TE topology.";
+         uses sch:schedules;
+         leaf admin-status {
+           type te-admin-status;
+           description
+             "The administrative state of the link.";
+         }
+         uses te-node-connectivity-matrix-abs;
+         uses te-node-info-attributes;
+       } // te-node-attributes
+     } // te-node-config-attributes-notification
+
+     grouping te-node-config-attributes-template {
+       description
+         "Configuration node attributes for template in a TE topology.";
+       container te-node-attributes {
+         description "Containing node attributes in a TE topology.";
+         uses sch:schedules;
+         leaf admin-status {
+           type te-admin-status;
+           description
+             "The administrative state of the link.";
+         }
+         uses te-node-info-attributes;
+       } // te-node-attributes
+     } // te-node-config-attributes-template
+
+     grouping te-node-connectivity-matrix {
+       description "Connectivity matrix on a TE node.";
+       list connectivity-matrix {
+         key "id";
+         description
+           "Represents node's switching limitations, i.e. limitations
+            in interconnecting network TE links across the node.";
+         reference
+           "RFC7579: General Network Element Constraint Encoding
+            for GMPLS-Controlled Networks.";
+         leaf id {
+           type uint32;
+           description "Identifies the connectivity-matrix entry.";
+         }
+         container from {
+           leaf tp-ref {
+             type nt:tp-id;
+             description
+               "Relative reference to source termination point.";
+           }
+           description
+             "Reference to source NTP.";
+         }
+         container to {
+           leaf tp-ref {
+             type nt:tp-id;
+             description
+               "Relative reference to destination termination point.";
+           }
+           description
+             "Reference to destination NTP.";
+         }
+         leaf is-allowed {
+           type boolean;
+           description
+             "true  - switching is allowed,
+              false - switching is disallowed.";
+         }
+       }
+     } // te-node-connectivity-matrix
+
+     grouping te-node-connectivity-matrix-abs {
+       description
+         "Connectivity matrix on a TE node, using absolute
+          paths to reference termination points.";
+       list connectivity-matrix {
+         key "id";
+         description
+           "Represents node's switching limitations, i.e. limitations
+            in interconnecting network TE links across the node.";
+         reference
+           "RFC7579: General Network Element Constraint Encoding
+            for GMPLS-Controlled Networks.";
+         leaf id {
+           type uint32;
+           description "Identifies the connectivity-matrix entry.";
+         }
+         container from {
+           uses nt:tp-ref;
+           description
+             "Reference to source NTP.";
+         }
+         container to {
+           uses nt:tp-ref;
+           description
+             "Reference to destination NTP.";
+         }
+         leaf is-allowed {
+           type boolean;
+           description
+             "true  - switching is allowed,
+              false - switching is disallowed.";
+         }
+       }
+     } // te-node-connectivity-matrix-abs
+
+     grouping te-node-info-attributes {
+       description
+         "Advertised TE information attributes.";
+       leaf domain-id {
+         type uint32;
+         description
+           "Identifies the domain that this node belongs.
+            This attribute is used to support inter-domain links.";
+         reference
+           "RFC5152: A Per-Domain Path Computation Method for
+            Establishing Inter-Domain Traffic Engineering (TE)
+            Label Switched Paths (LSPs).
+            RFC5392: OSPF Extensions in Support of Inter-Autonomous
+            System (AS) MPLS and GMPLS Traffic Engineering.
+            RFC5316: ISIS 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 inet:domain-name;
+         description "Node name.";
+       }
+       leaf-list signaling-address {
+         type inet:ip-address;
+         description "Node 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 te-topology-ref;
+       }
+     } // te-node-info-attributes
+
+     grouping te-node-state-derived {
+       description "Node state attributes in a TE topology.";
+       leaf oper-status {
+         type te-oper-status;
+         description
+           "The current operational state of the node.";
+       }
+       leaf is-multi-access-dr {
+         type empty;
+         description
+           "The presence of this attribute indicates that this TE node
+            is a pseudonode elected as a designated router.";
+         reference
+           "RFC3630: Traffic Engineering (TE) Extensions to OSPF
+            Version 2.
+            RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual
+            Environments.";
+       }
+       uses information-source-attributes;
+       list alt-information-sources {
+         key "information-source";
+         description
+           "A list of information sources learned but not used.";
+         uses information-source-attributes;
+         uses te-node-connectivity-matrix;
+         uses te-node-info-attributes;
+       }
+     } // te-node-state-derived
+
+     grouping te-node-state-derived-notification {
+       description "Node state attributes in a TE topology.";
+       leaf oper-status {
+         type te-oper-status;
+         description
+           "The current operational state of the node.";
+       }
+       leaf is-multi-access-dr {
+         type empty;
+         description
+           "The presence of this attribute indicates that this TE node
+            is a pseudonode elected as a designated router.";
+         reference
+           "RFC3630: Traffic Engineering (TE) Extensions to OSPF
+            Version 2.
+            RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual
+            Environments.";
+       }
+       uses information-source-attributes;
+       list alt-information-sources {
+         key "information-source";
+         description
+           "A list of information sources learned but not used.";
+         uses information-source-attributes;
+         uses te-node-connectivity-matrix-abs;
+         uses te-node-info-attributes;
+       }
+     } // te-node-state-derived-notification
+
+     grouping te-node-tunnel-termination-capability {
+       description
+         "Termination capability of a tunnel termination point on a
+          TE node.";
+
+       list termination-capability {
+         key "link-tp";
+         description
+           "The termination capabilities between
+            tunnel-termination-point and link termination-point.
+            The capability information can be used to compute
+            the tunnel path.";
+         leaf link-tp {
+           type nt:tp-id;
+           description
+             "Link termination point.";
+         }
+       } // termination-capability
+     } // te-node-tunnel-termination-capability
+
+     grouping te-path-element {
+       description
+         "A group of attributes defining an element in a TE path
+          such as TE node, TE link, TE atomic resource or label.";
+       uses te-types:explicit-route-subobject;
+     } // te-path-element
+
+     grouping te-termination-point-augment {
+       description
+         "Augmentation for TE termination point.";
+
+       container te {
+         presence "TE support.";
+         description
+           "Indicates TE support.";
+
+         leaf te-tp-id {
+           type te-tp-id;
+           mandatory true;
+           description
+             "An identifier to uniquely identify a TE termination
+              point.";
+         }
+
+         container config {
+           description
+             "Configuration data.";
+           uses te-termination-point-config;
+         } // config
+         container state {
+           config false;
+           description
+             "Operational state data.";
+           uses te-termination-point-config;
+         } // state
+       } // te
+     } // te-termination-point-augment
+
+     grouping te-termination-point-config {
+       description
+         "TE termination point configuration grouping.";
+       uses sch:schedules;
+     } // 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 TE
+              topology.";
+
+           list node-template {
+             if-feature template;
+             key "name";
+             leaf name {
+               type 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-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 TE topology.";
+
+       container te {
+         presence "TE support.";
+         description
+           "Indicates TE support.";
+
+         leaf provider-id {
+           type te-global-id;
+           mandatory true;
+           description
+             "An identifier to uniquely identify a provider.";
+         }
+         leaf client-id {
+           type te-global-id;
+           mandatory true;
+           description
+             "An identifier to uniquely identify a client.";
+         }
+         leaf te-topology-id {
+           type te-topology-id;
+           mandatory true;
+           description
+             "It is presumed that a datastore will contain many
+              topologies. To distinguish between topologies it is
+              vital to have UNIQUE topology identifiers.";
+         }
+
+         container config {
+           description
+             "Configuration data.";
+           uses te-topology-config;
+         } // config
+         container state {
+           config false;
+           description
+             "Operational state data.";
+           uses te-topology-config;
+         } // state
+       } // te
+     } // te-topology-augment
+
+     grouping te-topology-config {
+       description
+         "TE topology configuration grouping.";
+       uses sch:schedules;
+       leaf preference {
+         type uint8 {
+           range "1..255";
+         }
+         description
+           "Specifies a preference for this topology. A lower number
+            indicates a higher preference.";
+       }
+     } // te-topology-config
+
+     grouping te-topology-ref {
+       description
+         "References a TE topology.";
+       leaf provider-id-ref {
+         type te-global-id;
+         description
+           "A reference to a provider-id.";
+       }
+       leaf client-id-ref {
+         type te-global-id;
+         description
+           "A reference to a client-id.";
+       }
+       leaf te-topology-id-ref {
+         type tet:te-topology-id;
+         description
+           "A reference to a te-topology-id.";
+       }
+       leaf network-id-ref {
+         type nw:network-id;
+         description
+           "A reference to a network-id in base ietf-network module.";
+       }
+     } // te-topology-ref
+
+     grouping te-topology-type {
+       description
+         "Identifies the TE topology type.";
+       container te-topology {
+         presence "Indicates TE topology.";
+         description
+           "Its presence identifies the TE topology type.";
+       }
+     } // te-topology-type
+
+     grouping template-attributes {
+       description
+         "Common attributes for all templates.";
+
+       leaf priority {
+         type uint16;
+         description
+           "The preference value to resolve 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.";
+       }
+       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 to a configuration
+            node that has a reference to this template.";
+       }
+     } // template-attributes
+
+     /*
+      * Configuration data nodes
+      */
+     augment "/nw:networks/nw:network/nw:network-types" {
+       description
+         "Introduce new network type for TE topology.";
+       uses 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/te-topology" {
+         description
+           "Augmentation parameters apply only for networks with
+            TE topology type.";
+       }
+       description
+         "Configuration parameters for TE topology.";
+       uses te-topology-augment;
+     }
+
+     augment "/nw:networks/nw:network/nw:node" {
+       when "../nw:network-types/te-topology" {
+         description
+           "Augmentation parameters apply only for networks with
+            TE topology type.";
+       }
+       description
+         "Configuration parameters for TE at node level.";
+       uses te-node-augment;
+     }
+
+     augment "/nw:networks/nw:network/nt:link" {
+       when "../nw:network-types/te-topology" {
+         description
+           "Augmentation parameters apply only for networks with
+            TE topology type.";
+       }
+       description
+         "Configuration parameters for TE at link level";
+       uses te-link-augment;
+     }
+
+     augment "/nw:networks/nw:network/nw:node/"
+           + "nt:termination-point" {
+       when "../../nw:network-types/te-topology" {
+         description
+           "Augmentation parameters apply only for networks with
+            TE topology type.";
+       }
+       description
+         "Configuration parameters for TE at termination point level";
+       uses te-termination-point-augment;
+     }
+
+     /*
+      * Operational state data nodes
+      */
+
+     /*
+      * Notifications
+      */
+     notification te-node-event {
+       description "Notification event for TE node.";
+       leaf event-type {
+         type te-topology-event-type;
+         description "Event type.";
+       }
+       uses nw:node-ref;
+       uses te-topology-type;
+       uses tet:te-node-config-attributes-notification;
+       uses tet:te-node-state-derived-notification;
+     }
+
+     notification te-link-event {
+       description "Notification event for TE link.";
+       leaf event-type {
+         type te-topology-event-type;
+         description "Event type";
+       }
+       uses nt:link-ref;
+       uses te-topology-type;
+       uses tet:te-link-config-attributes;
+       uses tet:te-link-state-derived;
+     }
+
+     augment "/te-link-event/te-link-attributes/underlay" {
+       description "Add state attributes to te-link underlay.";
+       uses te-link-state-underlay-attributes;
+     }
+   }