submodule openconfig-mpls-static {

  yang-version "1";

  belongs-to "openconfig-mpls" {
    prefix "mpls";
  }

  // import some basic types
  import openconfig-mpls-types {prefix oc-mplst; }
  import openconfig-inet-types { prefix inet; }
  import openconfig-extensions { prefix oc-ext; }


  // meta
  organization "OpenConfig working group";

  contact
    "OpenConfig working group
    netopenconfig@googlegroups.com";

  description
    "Defines static LSP configuration";


  oc-ext:openconfig-version "3.3.0";

  revision "2022-02-11" {
    description
      "Add lsp-path PCE control mode";
    reference "3.3.0";
  }

  revision "2021-07-28" {
    description
      "Add prefix to qualify when statements.";
    reference "3.2.2";
  }

  revision "2021-06-16" {
    description
      "Remove trailing whitespace";
    reference "3.2.1";
  }

  revision "2021-03-24" {
    description
      "Add Metric bounds constraints for LSPs.";
    reference "3.2.0";
  }

  revision "2019-03-26" {
    description
      "Add Pseudowire encapsulation.";
    reference "3.1.0";
  }

  revision "2018-11-21" {
    description
      "Add OpenConfig module metadata extensions.";
    reference "3.0.1";
  }

  revision "2018-07-02" {
    description
      "Add new RSVP-TE statistics, remove associated-rsvp-session
      leaf. Remove use of date-and-time.";
    reference "3.0.0";
  }

  revision "2018-06-16" {
    description
      "Included attributes for base LDP configuration.";
     reference "2.6.0";
  }

  revision "2018-06-13" {
    description
      "Add ttl-propagation to global MPLS config";
    reference "2.5.0";
  }

  revision "2018-06-05" {
    description
      "Fixed bugs in when statements on RSVP-TE attributes";
    reference "2.4.2";
  }

  revision "2017-08-24" {
    description
      "Minor formatting fixes.";
    reference "2.4.1";
  }

  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";
  }

  // grouping statements

  grouping static-lsp-common-config {
    description
      "common definitions for static LSPs";

    leaf next-hop {
      type inet:ip-address;
      description
        "next hop IP address for the LSP";
    }

    leaf incoming-label {
      type oc-mplst:mpls-label;
      description
        "label value on the incoming packet";
    }

    leaf push-label {
      type oc-mplst:mpls-label;
      description
        "label value to push at the current hop for the
        LSP";
    }
  }

  grouping static-lsp-ingress-config {
    description
      "Configuration data for ingress LSPs";

    uses static-lsp-common-config;
  }

  grouping static-lsp-ingress-state {
    description
      "Operational state data for ingress LSPs";
  }

  grouping static-lsp-ingress-top {
    description
      "Top-level grouping for ingress LSP data";

    container ingress {
      description
        "Static LSPs for which the router is an
          ingress node";

      container config {
        description
          "Configuration data for ingress LSPs";

        uses static-lsp-ingress-config;
      }

      container state {

        config false;

        description
          "Operational state data for ingress LSPs";

        uses static-lsp-ingress-config;
        uses static-lsp-ingress-state;
      }
    }
  }

  grouping static-lsp-transit-config {
    description
      "Configuration data for transit LSPs";

    uses static-lsp-common-config;
  }

  grouping static-lsp-transit-state {
    description
      "Operational state data for transit LSPs";
  }

  grouping static-lsp-transit-top {
    description
      "Top-level grouping for transit LSP data";

    container transit {
      description
        "Static LSPs for which the router is an
          transit node";

      container config {
        description
          "Configuration data for transit LSPs";

        uses static-lsp-transit-config;
      }

      container state {

        config false;

        description
          "Operational state data for transit LSPs";

        uses static-lsp-transit-config;
        uses static-lsp-transit-state;
      }
    }
  }

  grouping static-lsp-egress-config {
    description
      "Configuration data for egress LSPs";

    uses static-lsp-common-config;
  }

  grouping static-lsp-egress-state {
    description
      "Operational state data for egress LSPs";
  }

  grouping static-lsp-egress-top {
    description
      "Top-level grouping for egress LSP data";

    container egress {
      description
        "Static LSPs for which the router is an
          egress node";

      container config {
        description
          "Configuration data for egress LSPs";

        uses static-lsp-egress-config;
      }

      container state {

        config false;

        description
          "Operational state data for egress LSPs";

        uses static-lsp-egress-config;
        uses static-lsp-egress-state;
      }
    }
  }

  grouping static-lsp-config {
    description
      "Configuration data for static LSPs";

    leaf name {
      type string;
      description
        "name to identify the LSP";
    }
  }

  grouping static-lsp-state {
    description
      "Operational state data for static LSPs";

  }

  grouping static-lsp-top {
    description
      "grouping for top level list of static LSPs";


    list static-lsp {
      key "name";
      description
        "list of defined static LSPs";

      leaf name {
        type leafref {
          path "../config/name";
        }
        description
          "Reference the name list key";
      }

      container config {
        description
          "Configuration data for the static lsp";

        uses static-lsp-config;
      }

      container state {
        config false;

        description
          "Operational state data for the static lsp";

        uses static-lsp-config;
        uses static-lsp-state;

      }

      // TODO: separation into ingress, transit, egress may help
      // to figure out what exactly is configured, but need to
      // consider whether implementations can support the
      // separation
      uses static-lsp-ingress-top;
      uses static-lsp-transit-top;
      uses static-lsp-egress-top;
    }
  }

  // data definition statements

  // augment statements


}