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

}
