Adding OpenConfig YANG models.

Change-Id: I0a2fdd5826e80933cf4b9ae939ff3051acec02aa
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-te.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-te.yang
new file mode 100644
index 0000000..7feb012
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-te.yang
@@ -0,0 +1,1297 @@
+submodule openconfig-mpls-te {
+
+  yang-version "1";
+
+  belongs-to "openconfig-mpls" {
+    prefix "oc-mpls";
+  }
+
+
+  // import some basic types
+  import openconfig-inet-types { prefix inet; }
+  import openconfig-mpls-rsvp { prefix oc-rsvp; }
+  import openconfig-mpls-sr { prefix oc-sr; }
+  import openconfig-mpls-types {prefix oc-mplst; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-yang-types { prefix yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Configuration related to constrained-path LSPs and traffic
+    engineering.  These definitions are not specific to a particular
+    signaling protocol or mechanism (see related submodules for
+    signaling protocol-specific configuration).";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // typedef statements
+
+ typedef te-bandwidth-type {
+    type enumeration {
+      enum SPECIFIED {
+        description
+          "Bandwidth is explicitly specified";
+      }
+      enum AUTO {
+        description
+          "Bandwidth is automatically computed";
+      }
+    }
+    description
+      "enumerated type for specifying whether bandwidth is
+       explicitly specified or automatically computed";
+  }
+
+  typedef mpls-srlg-flooding-type {
+    type enumeration {
+      enum FLOODED_SRLG {
+        description
+          "SRLG is flooded in the IGP";
+      }
+      enum STATIC_SRLG {
+        description
+          "SRLG is not flooded, the members are
+           statically configured";
+      }
+    }
+    description
+      "Enumerated bype for specifying how the SRLG is flooded";
+  }
+
+  typedef mpls-hop-type {
+    type enumeration {
+      enum LOOSE {
+        description
+          "loose hop in an explicit path";
+      }
+      enum STRICT {
+        description
+          "strict hop in an explicit path";
+      }
+    }
+    description
+     "enumerated type for specifying loose or strict
+      paths";
+  }
+
+  typedef te-metric-type {
+    type union {
+      type enumeration {
+        enum IGP {
+          description
+           "set the LSP metric to track the underlying
+            IGP metric";
+        }
+      }
+      type uint32;
+    }
+    description
+     "union type for setting the LSP TE metric to a
+      static value, or to track the IGP metric";
+  }
+
+  typedef cspf-tie-breaking {
+    type enumeration {
+      enum RANDOM {
+        description
+         "CSPF calculation selects a random path among
+          multiple equal-cost paths to the destination";
+      }
+      enum LEAST_FILL {
+        description
+         "CSPF calculation selects the path with greatest
+          available bandwidth";
+      }
+      enum MOST_FILL {
+        description
+          "CSPF calculation selects the path with the least
+          available bandwidth";
+      }
+    }
+    default RANDOM;
+    description
+     "type to indicate the CSPF selection policy when
+      multiple equal cost paths are available";
+  }
+
+
+  // grouping statements
+
+  grouping te-tunnel-reoptimize_config {
+    description
+      "Definition for reoptimize timer configuration";
+
+    leaf reoptimize-timer {
+      type uint16;
+      units seconds;
+      description
+       "frequency of reoptimization of
+        a traffic engineered LSP";
+    }
+  }
+
+
+  grouping te-lsp-auto-bandwidth_config {
+    description
+      "Configuration parameters related to autobandwidth";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "enables mpls auto-bandwidth on the
+         lsp";
+    }
+
+    leaf min-bw {
+      type oc-mplst:bandwidth-kbps;
+      description
+        "set the minimum bandwidth in Kbps for an
+         auto-bandwidth LSP";
+    }
+
+    leaf max-bw {
+      type oc-mplst:bandwidth-kbps;
+      description
+        "set the maximum bandwidth in Kbps for an
+         auto-bandwidth LSP";
+    }
+
+    leaf adjust-interval {
+      type uint32;
+      description
+        "time in seconds between adjustments to
+         LSP bandwidth";
+    }
+
+    leaf adjust-threshold {
+      type oc-types:percentage;
+      description
+        "percentage difference between the LSP's
+         specified bandwidth and its current bandwidth
+         allocation -- if the difference is greater than the
+         specified percentage, auto-bandwidth adjustment is
+         triggered";
+    }
+  }
+
+  grouping te-lsp-overflow_config {
+    description
+     "configuration for mpls lsp bandwidth
+      overflow adjustment";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+       "enables mpls lsp bandwidth overflow
+        adjustment on the lsp";
+    }
+
+    leaf overflow-threshold {
+      type oc-types:percentage;
+      description
+       "bandwidth percentage change to trigger
+        an overflow event";
+
+    }
+
+    leaf trigger-event-count {
+      type uint16;
+      description
+       "number of consecutive overflow sample
+        events needed to trigger an overflow adjustment";
+    }
+  }
+
+  grouping te-lsp-underflow_config {
+    description
+      "configuration for mpls lsp bandwidth
+      underflow adjustment";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+       "enables bandwidth underflow
+        adjustment on the lsp";
+    }
+
+    leaf underflow-threshold {
+      type oc-types:percentage;
+      description
+       "bandwidth percentage change to trigger
+        and underflow event";
+    }
+
+    leaf trigger-event-count {
+      type uint16;
+      description
+       "number of consecutive underflow sample
+        events needed to trigger an underflow adjustment";
+    }
+  }
+
+  grouping te-path-placement-constraints-config {
+    description
+      "Configuration data for link affinities";
+
+    leaf-list exclude-group {
+      type leafref {
+        path "../../../../../../../../../../te-global-attributes" +
+          "/mpls-admin-groups/admin-group/admin-group-name";
+      }
+      description
+        "list of references to named admin-groups to exclude in
+        path calculation.";
+    }
+
+    leaf-list include-all-group {
+      type leafref {
+        path "../../../../../../../../../../te-global-attributes" +
+          "/mpls-admin-groups/admin-group/admin-group-name";
+      }
+      description
+        "list of references to named admin-groups of which all must
+        be included";
+    }
+
+    leaf-list include-any-group {
+      type leafref {
+        path "../../../../../../../../../../te-global-attributes" +
+          "/mpls-admin-groups/admin-group/admin-group-name";
+      }
+      description
+        "list of references to named admin-groups of which one must
+        be included";
+    }
+  }
+
+  grouping te-path-placement-constraints-state {
+    description
+      "Operational state data for link affinities";
+    //TODO: currently a placeholder
+  }
+
+  grouping te-path-placement-constraints-top {
+    description
+      "Top-level grouping ";
+
+    container admin-groups {
+      description
+        "Top-level container for include/exclude constraints for
+        link affinities";
+
+      container config {
+        description
+          "Configuration data ";
+
+        uses te-path-placement-constraints-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses te-path-placement-constraints-config;
+        uses te-path-placement-constraints-state;
+      }
+    }
+  }
+
+  grouping te-tunnel-protection_config {
+    description
+     "Configuration parameters related to LSP
+      protection";
+    leaf protection-style-requested {
+      type identityref {
+        base oc-mplst:PROTECTION_TYPE;
+      }
+      default oc-mplst:UNPROTECTED;
+      description
+        "style of mpls frr protection desired: can be
+        link, link-node or unprotected.";
+    }
+  }
+
+  grouping explicit-route-subobject-config {
+    description
+      "The explicit route subobject grouping";
+
+    leaf address {
+     type inet:ip-address;
+     description
+      "router hop for the LSP path";
+    }
+
+    leaf hop-type {
+      type mpls-hop-type;
+      description
+        "strict or loose hop";
+    }
+
+    leaf index {
+      type uint8 {
+        range "0..255";
+      }
+      description
+        "Index of this explicit route object to express
+        the order of hops in the path";
+    }
+
+  }
+
+  grouping named-explicit-path-config {
+    description
+      "Configuration parameters relating to a named
+       explicit path";
+
+    leaf name {
+      type string;
+      description
+        "A string name that uniquely identifies an explicit
+         path";
+    }
+  }
+
+  // Explicit paths config somewhat following the IETF model
+  grouping explicit-paths_top {
+    description
+      "Top level global explicit path configuration
+      grouping";
+
+    container named-explicit-paths {
+      description
+        "Enclosing container for the named explicit paths";
+      list named-explicit-path {
+        key "name";
+        description
+          "A list of explicit paths";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "A string name that uniquely identifies
+            an explicit path";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to named explicit
+            paths";
+          uses named-explicit-path-config;
+          uses oc-sr:sr-path-attributes_config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the named
+            explicit paths";
+          uses named-explicit-path-config;
+          uses oc-sr:sr-path-attributes_config;
+        }
+
+        container explicit-route-objects {
+          description
+            "Enclosing container for EROs";
+
+          list explicit-route-object {
+            key "index";
+            description
+              "List of explicit route objects";
+
+            leaf index {
+              type leafref {
+                path "../config/index";
+              }
+
+              description
+                "Index of this explicit route object,
+                 to express the order of hops in path";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to an explicit
+                route";
+              uses explicit-route-subobject-config;
+            }
+
+
+            container state {
+              config false;
+              description
+                "State parameters relating to an explicit route";
+              uses explicit-route-subobject-config;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping mpls-te-srlg_config {
+    description
+      "Configuration of various attributes associated
+      with the SRLG";
+
+    leaf name {
+      type string;
+      description
+        "SRLG group identifier";
+    }
+
+    leaf value {
+      type uint32;
+      description
+        "group ID for the SRLG";
+    }
+
+    leaf cost {
+      type uint32;
+      description
+        "The cost of the SRLG to the computation
+        algorithm";
+    }
+
+    leaf flooding-type {
+      type mpls-srlg-flooding-type;
+      default FLOODED_SRLG;
+      description
+        "The type of SRLG, either flooded in the IGP or
+         statically configured";
+    }
+  }
+
+  grouping mpls-te-srlg-members_config {
+    description
+      "Configuration of the membership of the SRLG";
+
+    leaf from-address {
+      type inet:ip-address;
+      description
+        "IP address of the a-side of the SRLG link";
+    }
+
+    leaf to-address {
+      type inet:ip-address;
+      description
+        "IP address of the z-side of the SRLG link";
+    }
+  }
+
+  grouping mpls-te-srlg-top {
+    description
+      "Top level grouping for MPLS shared
+      risk link groups.";
+
+    container srlgs {
+      description
+        "Shared risk link groups attributes";
+      list srlg {
+        key "name";
+        description
+          "List of shared risk link groups";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+            // Requires YANG 1.1
+            //require-instance true;
+          }
+          description
+            "The SRLG group identifier";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to the SRLG";
+          uses mpls-te-srlg_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to the SRLG";
+          uses mpls-te-srlg_config;
+        }
+
+        container static-srlg-members {
+          when "../config/flooding-type = 'STATIC_SRLG'" {
+            description
+              "Include this container for static
+              SRLG specific configuration";
+          }
+          description
+            "SRLG members for static (not flooded) SRLGs ";
+
+          list members-list {
+            key "from-address";
+            description
+             "List of SRLG members, which are expressed
+              as IP address endpoints of links contained in the
+              SRLG";
+
+            leaf from-address {
+              type leafref {
+                path "../config/from-address";
+                // Requires YANG 1.1
+                //require-instance true;
+              }
+              description
+                "The from address of the link in the SRLG";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the
+                SRLG members";
+              uses mpls-te-srlg-members_config;
+            }
+
+            container state {
+              config false;
+              description
+                "State parameters relating to the SRLG
+                members";
+              uses mpls-te-srlg-members_config;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping te-global-tunnel_config {
+    description
+      "Configuration parameters relevant to a single
+       traffic engineered tunnel.";
+
+    leaf name {
+      type string;
+      description
+        "The tunnel name";
+    }
+
+    leaf type {
+      type identityref {
+        base oc-mplst:TUNNEL_TYPE;
+      }
+      description
+        "Tunnel type, p2p or p2mp";
+    }
+
+    leaf signaling-protocol {
+      type identityref {
+        base oc-mplst:PATH_SETUP_PROTOCOL;
+      }
+      description
+        "Signaling protocol used to set up this tunnel";
+    }
+
+    leaf description {
+      type string;
+      description
+        "optional text description for the tunnel";
+    }
+
+    leaf admin-status {
+      type identityref {
+        base oc-mplst:TUNNEL_ADMIN_STATUS;
+      }
+      default oc-mplst:ADMIN_UP;
+      description
+        "TE tunnel administrative state.";
+    }
+
+    leaf preference {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Specifies a preference for this tunnel.
+        A lower number signifies a better preference";
+    }
+
+    leaf metric-type {
+      type identityref {
+        base oc-mplst:LSP_METRIC_TYPE;
+      }
+      default oc-mplst:LSP_METRIC_INHERITED;
+      description
+        "The type of metric specification that should be used to set
+        the LSP(s) metric";
+    }
+
+    leaf metric {
+      type int32;
+      description
+        "The value of the metric that should be specified. The value
+        supplied in this leaf is used in conjunction with the metric
+        type to determine the value of the metric used by the system.
+        Where the metric-type is set to LSP_METRIC_ABSOLUTE - the
+        value of this leaf is used directly; where it is set to
+        LSP_METRIC_RELATIVE, the relevant (positive or negative)
+        offset is used to formulate the metric; where metric-type
+        is LSP_METRIC_INHERITED, the value of this leaf is not
+        utilised";
+    }
+
+    leaf shortcut-eligible {
+      type boolean;
+      default "true";
+      description
+        "Whether this LSP is considered to be eligible for us as a
+        shortcut in the IGP. In the case that this leaf is set to
+        true, the IGP SPF calculation uses the metric specified to
+        determine whether traffic should be carried over this LSP";
+    }
+
+    leaf protection-style-requested {
+      type identityref {
+        base oc-mplst:PROTECTION_TYPE;
+      }
+      default oc-mplst:UNPROTECTED;
+      description
+        "style of mpls frr protection desired: can be
+        link, link-node or unprotected.";
+    }
+
+    uses te-tunnel-reoptimize_config;
+    uses oc-rsvp:rsvp-p2p-tunnel-attributes_config;
+
+  }
+
+  grouping tunnel-p2p-attributes_config {
+    description
+      "Configuration related to p2p LSPs";
+    leaf destination {
+      type inet:ip-address;
+      description
+        "P2P tunnel destination address";
+    }
+  }
+
+  grouping p2p-path_state {
+    description
+      "Operational state parameters for p2p paths";
+
+    leaf associated-rsvp-session {
+      type leafref {
+        path "../../../../../../../../../signaling-protocols/" +
+             "rsvp-te/sessions/session/local-index";
+      }
+      description
+        "If the signalling protocol specified for this path is
+        RSVP-TE, this leaf provides a reference to the associated
+        session within the RSVP-TE protocol sessions list, such
+        that details of the signaling can be retrieved.";
+    }
+  }
+
+  grouping p2p-path_config {
+    description
+      "Configuration parameters for p2p paths";
+
+    leaf name {
+      type string;
+      description
+        "Path name";
+    }
+
+    leaf path-computation-method {
+      type identityref {
+        base oc-mplst:PATH_COMPUTATION_METHOD;
+      }
+      default oc-mplst:LOCALLY_COMPUTED;
+      description
+        "The method used for computing the path, either
+        locally computed, queried from a server or not
+        computed at all (explicitly configured).";
+    }
+
+    leaf use-cspf {
+      when "../path-computation-method = 'LOCALLY_COMPUTED'" {
+        description
+          "The use of cspf when the path-computation method is
+           local computation";
+      }
+      type boolean;
+      description
+        "Flag to enable CSPF for locally computed LSPs";
+    }
+
+    leaf cspf-tiebreaker {
+      when "../path-computation-method = 'LOCALLY_COMPUTED'" {
+        description
+          "The cspf tiebreaking method when the path is
+           locally computed";
+      }
+      type cspf-tie-breaking;
+      description
+        "Determine the tie-breaking method to choose between
+        equally desirable paths during CSFP computation";
+    }
+
+
+    leaf path-computation-server {
+      when "../path-computation-method = 'EXTERNALLY_QUERIED'" {
+        description
+          "The path-computation server when the path is
+           externally queried";
+      }
+      type inet:ip-address;
+      description
+        "Address of the external path computation
+         server";
+    }
+
+    leaf explicit-path-name {
+      when "../path-computation-method = 'EXPLICITLY_DEFINED'" {
+        description
+          "The name of the explicitly defined path used";
+      }
+
+      type leafref {
+        path "../../../../../../../"
+             + "named-explicit-paths/named-explicit-path/"
+             + "config/name";
+        // Requires YANG 1.1
+        //require-instance true;
+      }
+      description
+        "reference to a defined path";
+    }
+
+    leaf preference {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Specifies a preference for this path. The lower the
+        number higher the preference";
+    }
+
+    uses oc-rsvp:rsvp-p2p-path-attributes_config;
+  }
+
+
+  grouping te-tunnel-p2p_top {
+    description
+      "Top level grouping for p2p configuration";
+
+    container p2p-tunnel-attributes {
+      when "../config/type = 'P2P'" {
+        description
+         "Include this container for LSPs of type P2P";
+      }
+      description
+        "Parameters related to LSPs of type P2P";
+
+      container config {
+       description
+         "Configuration parameters for P2P LSPs";
+       uses tunnel-p2p-attributes_config;
+      }
+
+      container state {
+       config false;
+       description
+         "State parameters for P2P LSPs";
+       uses tunnel-p2p-attributes_config;
+      }
+
+      uses p2p-primary-paths_top;
+      uses p2p-secondary-paths_top;
+    }
+  }
+
+
+  grouping te-tunnel_state {
+    description
+      "Counters and statistical data relevent to a single
+       tunnel.";
+
+    leaf oper-status {
+      type identityref {
+        base oc-mplst:LSP_OPER_STATUS;
+      }
+      description
+       "The operational status of the TE tunnel";
+    }
+
+    leaf role {
+      type identityref {
+        base oc-mplst:LSP_ROLE;
+      }
+      description
+       "The lsp role at the current node, whether it is headend,
+        transit or tailend.";
+    }
+
+    container counters {
+      description
+        "State data for MPLS label switched paths. This state
+        data is specific to a single label switched path.";
+
+      leaf bytes {
+        type yang:counter64;
+        description
+          "Number of bytes that have been forwarded over the
+           label switched path.";
+      }
+
+      leaf packets {
+        type yang:counter64;
+        description
+          "Number of pacets that have been forwarded over the
+           label switched path.";
+      }
+
+      leaf path-changes {
+        type yang:counter64;
+        description
+          "Number of path changes for the label switched path";
+      }
+
+      leaf state-changes {
+        type yang:counter64;
+        description
+          "Number of state changes for the label switched path";
+      }
+
+      leaf online-time {
+        type yang:date-and-time;
+        description
+          "Indication of the time the label switched path
+           transitioned to an Oper Up or in-service state";
+      }
+
+      leaf current-path-time {
+        type yang:date-and-time;
+        description
+          "Indicates the time the LSP switched onto its
+           current path. This is reset upon a LSP path
+           change.";
+      }
+
+      leaf next-reoptimization-time {
+        type yang:date-and-time;
+        description
+          "Indicates the next scheduled time the LSP
+           will be reoptimized.";
+      }
+    }
+  }
+
+  grouping te-tunnel-bandwidth_config {
+    description
+      "Configuration parameters related to bandwidth for a tunnel";
+
+    leaf specification-type {
+      type te-bandwidth-type;
+      default SPECIFIED;
+      description
+        "The method used for settign the bandwidth, either explicitly
+        specified or configured";
+    }
+
+    leaf set-bandwidth {
+      when "../specification-type = 'SPECIFIED'" {
+       description
+         "The bandwidth value when bandwidth is explicitly
+          specified";
+      }
+      type oc-mplst:bandwidth-kbps;
+      description
+       "set bandwidth explicitly, e.g., using
+        offline calculation";
+    }
+  }
+
+  grouping te-tunnel-bandwidth_state {
+    description
+      "Operational state parameters relating to bandwidth for a tunnel";
+
+    leaf signaled-bandwidth {
+      type oc-mplst:bandwidth-kbps;
+      description
+        "The currently signaled bandwidth of the LSP. In the case where
+        the bandwidth is specified explicitly, then this will match the
+        value of the set-bandwidth leaf; in cases where the bandwidth is
+        dynamically computed by the system, the current value of the
+        bandwidth should be reflected.";
+    }
+  }
+
+  grouping te-tunnel-bandwidth_top {
+    description
+      "Top level grouping for specifying bandwidth for a tunnel";
+
+    container bandwidth {
+      description
+        "Bandwidth configuration for TE LSPs";
+
+      container config {
+        description
+          "Configuration parameters related to bandwidth on TE
+          tunnels:";
+        uses te-tunnel-bandwidth_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State parameters related to bandwidth
+          configuration of TE tunnels";
+        uses te-tunnel-bandwidth_config;
+        uses te-tunnel-bandwidth_state;
+      }
+
+      container auto-bandwidth {
+        when "../config/specification-type = 'AUTO'" {
+          description
+            "Include this container for auto bandwidth
+            specific configuration";
+        }
+        description
+          "Parameters related to auto-bandwidth";
+
+        container config {
+          description
+            "Configuration parameters relating to MPLS
+            auto-bandwidth on the tunnel.";
+          uses te-lsp-auto-bandwidth_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters relating to MPLS
+            auto-bandwidth on the tunnel.";
+          uses te-lsp-auto-bandwidth_config;
+        }
+
+        container overflow {
+          description
+            "configuration of MPLS overflow bandwidth
+            adjustement for the LSP";
+
+          container config {
+            description
+              "Config information for MPLS overflow bandwidth
+              adjustment";
+            uses te-lsp-overflow_config;
+          }
+
+          container state {
+            config false;
+            description
+              "Config information for MPLS overflow bandwidth
+              adjustment";
+            uses te-lsp-overflow_config;
+          }
+        }
+
+        container underflow {
+          description
+            "configuration of MPLS underflow bandwidth
+            adjustement for the LSP";
+
+          container config {
+            description
+              "Config information for MPLS underflow bandwidth
+              adjustment";
+            uses te-lsp-underflow_config;
+          }
+
+          container state {
+            config false;
+            description
+              "State information for MPLS underflow bandwidth
+              adjustment";
+            uses te-lsp-underflow_config;
+          }
+        }
+      }
+    }
+  }
+
+  grouping p2p-path-candidate-secondary-path-config {
+    description
+      "Configuration parameters relating to a secondary path which
+      is a candidate for a particular primary path";
+
+    leaf secondary-path {
+      type leafref {
+        path "../../../../../../p2p-secondary-paths/" + 
+             "p2p-secondary-path/config/name";
+      }
+      description
+        "A reference to the secondary path that should be utilised
+        when the containing primary path option is in use";
+    }
+
+    leaf priority {
+      type uint16;
+      description
+        "The priority of the specified secondary path option. Higher
+        priority options are less preferable - such that a secondary
+        path reference with a priority of 0 is the most preferred";
+    }
+  }
+
+  grouping p2p-path-candidate-secondary-path-state {
+    description
+      "Operational state parameters relating to a secondary path
+      which is a candidate for a particular primary path";
+
+    leaf active {
+      type boolean;
+      description
+        "Indicates the current active path option that has
+        been selected of the candidate secondary paths";
+    }
+  }
+
+  grouping p2p-primary-paths_top {
+    description
+      "Top level grouping for p2p primary paths";
+
+    container p2p-primary-path {
+      description
+        "Primary paths associated with the LSP";
+
+      list p2p-primary-path {
+        key "name";
+        description
+         "List of p2p primary paths for a tunnel";
+
+        leaf name {
+         type leafref {
+           path "../config/name";
+           // Requires YANG 1.1
+           //require-instance true;
+         }
+         description
+          "Path name";
+        }
+
+        container config {
+         description
+          "Configuration parameters related to paths";
+         uses p2p-path_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to paths";
+          uses p2p-path_config;
+          uses p2p-path_state;
+        }
+
+        container candidate-secondary-paths {
+          description
+            "The set of candidate secondary paths which may be used
+            for this primary path. When secondary paths are specified
+            in the list the path of the secondary LSP in use must be
+            restricted to those path options referenced. The
+            priority of the secondary paths is specified within the
+            list. Higher priority values are less preferred - that is
+            to say that a path with priority 0 is the most preferred
+            path. In the case that the list is empty, any secondary
+            path option may be utilised when the current primary path
+            is in use.";
+
+          list candidate-secondary-path {
+            key "secondary-path";
+
+            description
+              "List of secondary paths which may be utilised when the
+              current primary path is in use";
+
+            leaf secondary-path {
+              type leafref {
+                path "../config/secondary-path";
+              }
+              description
+                "A reference to the secondary path option reference
+                which acts as the key of the candidate-secondary-path
+                list";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the candidate
+                secondary path";
+
+              uses p2p-path-candidate-secondary-path-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to the candidate
+                secondary path";
+
+              uses p2p-path-candidate-secondary-path-config;
+              uses p2p-path-candidate-secondary-path-state;
+            }
+          }
+        }
+
+        uses te-path-placement-constraints-top;
+
+      }
+    }
+  }
+
+  grouping p2p-secondary-paths_top {
+    description
+      "Top level grouping for p2p secondary paths";
+
+    container p2p-secondary-paths {
+      description
+        "Secondary paths for the LSP";
+
+      list p2p-secondary-path {
+        key "name";
+        description
+          "List of p2p primary paths for a tunnel";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+            // Requires YANG 1.1
+            //require-instance true;
+          }
+          description
+            "Path name";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to paths";
+          uses p2p-path_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to paths";
+          uses p2p-path_config;
+          uses p2p-path_state;
+        }
+
+        uses te-path-placement-constraints-top;
+      }
+    }
+  }
+
+  grouping te-tunnels_top {
+    description
+      "Top level grouping for TE tunnels";
+
+    container tunnels {
+      description
+        "Enclosing container for tunnels";
+      list tunnel {
+        key "name";
+        description
+          "List of TE tunnels. This list contains only the LSPs that the
+          current device originates (i.e., for which it is the head-end).
+          Where the signaling protocol utilised for an LSP allows a mid-point
+          or tail device to be aware of the LSP (e.g., RSVP-TE), then the
+          associated sessions are maintained per protocol";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+            // Requires YANG 1.1
+            //require-instance true;
+          }
+          description
+            "The tunnel name";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to TE tunnels:";
+          uses te-global-tunnel_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to TE tunnels";
+          uses te-global-tunnel_config;
+          uses te-tunnel_state;
+
+        }
+
+        uses te-tunnel-bandwidth_top;
+        uses te-tunnel-p2p_top;
+        // TODO - add the p2mp configuration
+      }
+    }
+  }
+
+// data definition statements
+
+// augment statements
+
+// rpc statements
+
+// notification statements
+
+}