Adding OpenConfig YANG models.

Change-Id: I0a2fdd5826e80933cf4b9ae939ff3051acec02aa
diff --git a/models/openconfig/src/main/yang/policy/openconfig-routing-policy.yang b/models/openconfig/src/main/yang/policy/openconfig-routing-policy.yang
new file mode 100644
index 0000000..9e2a08a
--- /dev/null
+++ b/models/openconfig/src/main/yang/policy/openconfig-routing-policy.yang
@@ -0,0 +1,1091 @@
+module openconfig-routing-policy {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/routing-policy";
+
+  prefix "oc-rpol";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-policy-types { prefix oc-pol-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module describes a YANG model for routing policy
+    configuration. It is a limited subset of all of the policy
+    configuration parameters available in the variety of vendor
+    implementations, but supports widely used constructs for managing
+    how routes are imported, exported, and modified across different
+    routing protocols.  This module is intended to be used in
+    conjunction with routing protocol configuration models (e.g.,
+    BGP) defined in other modules.
+
+    Route policy expression:
+
+    Policies are expressed as a set of top-level policy definitions,
+    each of which consists of a sequence of policy statements. Policy
+    statements consist of simple condition-action tuples. Conditions
+    may include mutiple match or comparison operations, and similarly
+    actions may be multitude of changes to route attributes or a
+    final disposition of accepting or rejecting the route.
+
+    Route policy evaluation:
+
+    Policy definitions are referenced in routing protocol
+    configurations using import and export configuration statements.
+    The arguments are members of an ordered list of named policy
+    definitions which comprise a policy chain, and optionally, an
+    explicit default policy action (i.e., reject or accept).
+
+    Evaluation of each policy definition proceeds by evaluating its
+    corresponding individual policy statements in order.  When a
+    condition statement in a policy statement is satisfied, the
+    corresponding action statement is executed.  If the action
+    statement has either accept-route or reject-route actions, policy
+    evaluation of the current policy definition stops, and no further
+    policy definitions in the chain are evaluated.
+
+    If the condition is not satisfied, then evaluation proceeds to
+    the next policy statement.  If none of the policy statement
+    conditions are satisfied, then evaluation of the current policy
+    definition stops, and the next policy definition in the chain is
+    evaluated.  When the end of the policy chain is reached, the
+    default route disposition action is performed (i.e., reject-route
+    unless an an alternate default action is specified for the
+    chain).
+
+    Policy 'subroutines' (or nested policies) are supported by
+    allowing policy statement conditions to reference another policy
+    definition which applies conditions and actions from the
+    referenced policy before returning to the calling policy
+    statement and resuming evaluation.  If the called policy
+    results in an accept-route (either explicit or by default), then
+    the subroutine returns an effective true value to the calling
+    policy.  Similarly, a reject-route action returns false.  If the
+    subroutine returns true, the calling policy continues to evaluate
+    the remaining conditions (using a modified route if the
+    subroutine performed any changes to the route).";
+
+  oc-ext:openconfig-version "3.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Replace policy choice node/type with policy-result
+      enumeration;simplified defined set naming;removed generic
+      IGP actions; migrate to OpenConfig types; added mode for
+      prefix sets";
+    reference "3.0.0";
+  }
+
+  revision "2016-05-12" {
+    description
+      "OpenConfig public release";
+    reference "2.0.1";
+  }
+
+
+  // typedef statements
+
+  typedef default-policy-type {
+    // this typedef retained for name compatibiity with default
+    // import and export policy
+    type enumeration {
+      enum ACCEPT_ROUTE {
+        description
+          "Default policy to accept the route";
+      }
+      enum REJECT_ROUTE {
+        description
+          "Default policy to reject the route";
+      }
+    }
+    description
+      "Type used to specify route disposition in
+      a policy chain";
+  }
+
+  typedef policy-result-type {
+    type enumeration {
+      enum ACCEPT_ROUTE {
+        description "Policy accepts the route";
+      }
+      enum REJECT_ROUTE {
+        description "Policy rejects the route";
+      }
+    }
+    description
+      "Type used to specify route disposition in
+      a policy chain";
+  }
+
+
+  // grouping statements
+
+  grouping prefix-set-config {
+    description
+      "Configuration data for prefix sets used in policy
+      definitions.";
+
+    leaf name {
+      type string;
+      description
+        "name / label of the prefix set -- this is used to
+        reference the set in match conditions";
+    }
+
+    leaf mode {
+      type enumeration {
+        enum IPV4 {
+          description
+            "Prefix set contains IPv4 prefixes only";
+        }
+        enum IPV6 {
+          description
+            "Prefix set contains IPv6 prefixes only";
+        }
+        enum MIXED {
+          description
+            "Prefix set contains mixed IPv4 and IPv6 prefixes";
+        }
+      }
+      description
+        "Indicates the mode of the prefix set, in terms of which
+        address families (IPv4, IPv6, or both) are present.  The
+        mode provides a hint, but the device must validate that all
+        prefixes are of the indicated type, and is expected to
+        reject the configuration if there is a discrepancy.  The
+        MIXED mode may not be supported on devices that require
+        prefix sets to be of only one address family.";
+    }
+
+  }
+
+  grouping prefix-set-state {
+    description
+      "Operational state data for prefix sets";
+  }
+
+  grouping prefix-set-top {
+    description
+      "Top-level data definitions for a list of IPv4 or IPv6
+      prefixes which are matched as part of a policy";
+
+    container prefix-sets {
+      description
+        "Enclosing container ";
+
+      list prefix-set {
+        key "name";
+        description
+          "List of the defined prefix sets";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to prefix name list key";
+        }
+
+        container config {
+          description
+            "Configuration data for prefix sets";
+
+          uses prefix-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses prefix-set-config;
+          uses prefix-set-state;
+        }
+
+        uses prefix-top;
+      }
+    }
+  }
+
+  grouping prefix-config {
+    description
+      "Configuration data for a prefix definition";
+
+    leaf ip-prefix {
+      type oc-inet:ip-prefix;
+      mandatory true;
+      description
+        "The prefix member in CIDR notation -- while the
+        prefix may be either IPv4 or IPv6, most
+        implementations require all members of the prefix set
+        to be the same address family.  Mixing address types in
+        the same prefix set is likely to cause an error.";
+    }
+
+    leaf masklength-range {
+      type string {
+        pattern '^([0-9]+\.\.[0-9]+)|exact$';
+      }
+      description
+        "Defines a range for the masklength, or 'exact' if
+        the prefix has an exact length.
+
+        Example: 10.3.192.0/21 through 10.3.192.0/24 would be
+        expressed as prefix: 10.3.192.0/21,
+        masklength-range: 21..24.
+
+        Example: 10.3.192.0/21 would be expressed as
+        prefix: 10.3.192.0/21,
+        masklength-range: exact";
+    }
+  }
+
+  grouping prefix-state {
+    description
+      "Operational state data for prefix definitions";
+  }
+
+  grouping prefix-top {
+    description
+      "Top-level grouping for prefixes in a prefix list";
+
+    container prefixes {
+      description
+        "Enclosing container for the list of prefixes in a policy
+        prefix list";
+
+      list prefix {
+        key "ip-prefix masklength-range";
+        description
+          "List of prefixes in the prefix set";
+
+        leaf ip-prefix {
+          type leafref {
+            path "../config/ip-prefix";
+          }
+          description
+            "Reference to the ip-prefix list key.";
+        }
+
+        leaf masklength-range {
+          type leafref {
+            path "../config/masklength-range";
+          }
+          description
+            "Reference to the masklength-range list key";
+        }
+
+        container config {
+          description
+            "Configuration data for prefix definition";
+
+          uses prefix-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for prefix definition";
+
+          uses prefix-config;
+          uses prefix-state;
+        }
+      }
+    }
+  }
+
+  grouping neighbor-set-config {
+    description
+      "Configuration data for neighbor set definitions";
+
+    leaf name {
+      type string;
+      description
+          "name / label of the neighbor set -- this is used to
+          reference the set in match conditions";
+    }
+
+    leaf-list address {
+      type oc-inet:ip-address;
+      description
+        "List of IP addresses in the neighbor set";
+    }
+  }
+
+  grouping neighbor-set-state {
+    description
+      "Operational state data for neighbor set definitions";
+  }
+
+  grouping neighbor-set-top {
+    description
+      "Top-level data definition for a list of IPv4 or IPv6
+      neighbors which can be matched in a routing policy";
+
+    container neighbor-sets {
+      description
+        "Enclosing container for the list of neighbor set
+        definitions";
+
+      list neighbor-set {
+        key "name";
+        description
+          "List of defined neighbor sets for use in policies.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the neighbor set name list key.";
+        }
+
+        container config {
+          description
+            "Configuration data for neighbor sets.";
+
+          uses neighbor-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for neighbor sets.";
+
+          uses neighbor-set-config;
+          uses neighbor-set-state;
+        }
+      }
+    }
+  }
+
+  grouping tag-set-config {
+    description
+      "Configuration data for tag set definitions.";
+
+    leaf name {
+      type string;
+      description
+        "name / label of the tag set -- this is used to reference
+        the set in match conditions";
+    }
+
+    leaf-list tag-value {
+      type oc-pol-types:tag-type;
+      description
+        "Value of the tag set member";
+    }
+  }
+
+  grouping tag-set-state {
+    description
+      "Operational state data for tag set definitions.";
+  }
+
+  grouping tag-set-top {
+    description
+      "Top-level data definitions for a list of tags which can
+      be matched in policies";
+
+    container tag-sets {
+      description
+        "Enclosing container for the list of tag sets.";
+
+      list tag-set {
+        key "name";
+        description
+          "List of tag set definitions.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the tag set name list key";
+        }
+
+        container config {
+          description
+            "Configuration data for tag sets";
+
+          uses tag-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for tag sets";
+
+          uses tag-set-config;
+          uses tag-set-state;
+        }
+      }
+    }
+  }
+
+  grouping generic-defined-sets {
+    description
+      "Data definitions for pre-defined sets of attributes used in
+      policy match conditions.  These sets are generic and can
+      be used in matching conditions in different routing
+      protocols.";
+
+    uses prefix-set-top;
+    uses neighbor-set-top;
+    uses tag-set-top;
+  }
+
+  grouping match-set-options-group {
+    description
+      "Grouping containing options relating to how a particular set
+      should be matched";
+
+    leaf match-set-options {
+      type oc-pol-types:match-set-options-type;
+      description
+        "Optional parameter that governs the behaviour of the
+        match operation";
+    }
+  }
+
+  grouping match-set-options-restricted-group {
+    description
+      "Grouping for a restricted set of match operation modifiers";
+
+    leaf match-set-options {
+      type oc-pol-types:match-set-options-restricted-type;
+      description
+        "Optional parameter that governs the behaviour of the
+        match operation.  This leaf only supports matching on ANY
+        member of the set or inverting the match.  Matching on ALL is
+        not supported";
+    }
+  }
+
+  grouping match-interface-condition-config {
+    description
+      "Configuration data for interface match condition";
+
+    uses oc-if:interface-ref-common;
+  }
+
+  grouping match-interface-condition-state {
+    description
+      "Operational state data for interface match condition";
+  }
+
+  grouping match-interface-condition-top {
+    description
+      "Top-level grouping for the interface match condition";
+
+    container match-interface {
+      description
+        "Top-level container for interface match conditions";
+
+      container config {
+        description
+          "Configuration data for interface match conditions";
+
+        uses match-interface-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for interface match conditions";
+
+        uses match-interface-condition-config;
+        uses match-interface-condition-state;
+      }
+
+    }
+  }
+
+  grouping prefix-set-condition-config {
+    description
+      "Configuration data for prefix-set conditions";
+
+    leaf prefix-set {
+        type leafref {
+          path "../../../../../../../../defined-sets/" +
+            "prefix-sets/prefix-set/config/name";
+        }
+        description "References a defined prefix set";
+      }
+      uses match-set-options-restricted-group;
+  }
+
+
+  grouping prefix-set-condition-state {
+    description
+      "Operational state data for prefix-set conditions";
+  }
+
+  grouping prefix-set-condition-top {
+    description
+      "Top-level grouping for prefix-set conditions";
+
+    container match-prefix-set {
+      description
+        "Match a referenced prefix-set according to the logic
+        defined in the match-set-options leaf";
+
+      container config {
+        description
+          "Configuration data for a prefix-set condition";
+
+        uses prefix-set-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for a prefix-set condition";
+
+        uses prefix-set-condition-config;
+        uses prefix-set-condition-state;
+      }
+    }
+  }
+
+  grouping neighbor-set-condition-config {
+    description
+      "Configuration data for neighbor-set conditions";
+
+    leaf neighbor-set {
+      type leafref {
+        path "../../../../../../../../defined-sets/neighbor-sets/" +
+        "neighbor-set/name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      description "References a defined neighbor set";
+    }
+
+    uses match-set-options-restricted-group;
+  }
+
+  grouping neighbor-set-condition-state {
+    description
+      "Operational state data for neighbor-set conditions";
+  }
+
+  grouping neighbor-set-condition-top {
+    description
+      "Top-level grouping for neighbor-set conditions";
+
+    container match-neighbor-set {
+      description
+        "Match a referenced neighbor set according to the logic
+        defined in the match-set-options-leaf";
+
+      container config {
+        description
+          "Configuration data ";
+
+        uses neighbor-set-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses neighbor-set-condition-config;
+        uses neighbor-set-condition-state;
+      }
+    }
+  }
+
+  grouping tag-set-condition-config {
+    description
+      "Configuration data for tag-set condition statements";
+
+    leaf tag-set {
+      type leafref {
+        path "../../../../../../../../defined-sets/tag-sets/tag-set" +
+        "/name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      description "References a defined tag set";
+    }
+    uses match-set-options-restricted-group;
+  }
+
+  grouping tag-set-condition-state {
+    description
+      "Operational state data for tag-set condition statements";
+  }
+
+  grouping tag-set-condition-top {
+    description
+      "Top-level grouping for tag-set conditions";
+
+    container match-tag-set {
+      description
+        "Match a referenced tag set according to the logic defined
+        in the match-options-set leaf";
+
+      container config {
+        description
+          "Configuration data for tag-set conditions";
+
+        uses tag-set-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data tag-set conditions";
+
+        uses tag-set-condition-config;
+        uses tag-set-condition-state;
+      }
+    }
+  }
+
+  grouping generic-conditions {
+    description "Condition statement definitions for checking
+    membership in a generic defined set";
+
+    uses match-interface-condition-top;
+    uses prefix-set-condition-top;
+    uses neighbor-set-condition-top;
+    uses tag-set-condition-top;
+
+  }
+
+  grouping generic-actions {
+    description
+      "Definitions for common set of policy action statements that
+      manage the disposition or control flow of the policy";
+
+    leaf policy-result {
+      type policy-result-type;
+      description
+        "Select the final disposition for the route, either
+        accept or reject.";
+    }
+  }
+
+
+  grouping policy-conditions-config {
+    description
+      "Configuration data for general policy conditions, i.e., those
+      not related to match-sets";
+
+      leaf call-policy {
+        type leafref {
+          path "../../../../../../../" +
+            "oc-rpol:policy-definitions/" +
+            "oc-rpol:policy-definition/oc-rpol:name";
+          //TODO: require-instance should be added when
+          //it is supported in YANG 1.1
+          //require-instance true;
+        }
+        description
+          "Applies the statements from the specified policy
+          definition and then returns control the current
+          policy statement. Note that the called policy may
+          itself call other policies (subject to
+          implementation limitations). This is intended to
+          provide a policy 'subroutine' capability.  The
+          called policy should contain an explicit or a
+          default route disposition that returns an
+          effective true (accept-route) or false
+          (reject-route), otherwise the behavior may be
+          ambiguous and implementation dependent";
+      }
+
+      leaf install-protocol-eq {
+        type identityref {
+          base oc-pol-types:INSTALL_PROTOCOL_TYPE;
+        }
+        description
+          "Condition to check the protocol / method used to install
+          the route into the local routing table";
+      }
+  }
+
+  grouping policy-conditions-state {
+    description
+      "Operational state data for policy conditions";
+  }
+
+  grouping policy-conditions-top {
+    description
+      "Top-level grouping for policy conditions";
+
+    container conditions {
+      description
+        "Condition statements for the current policy statement";
+
+      container config {
+        description
+          "Configuration data for policy conditions";
+
+        uses policy-conditions-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for policy conditions";
+
+        uses policy-conditions-config;
+        uses policy-conditions-state;
+      }
+      uses generic-conditions;
+    }
+  }
+
+  grouping policy-statements-config {
+    description
+      "Configuration data for policy statements";
+
+    leaf name {
+      type string;
+      description
+        "name of the policy statement";
+    }
+  }
+
+  grouping policy-statements-state {
+    description
+      "Operational state data for policy statements";
+  }
+
+
+
+  grouping policy-actions-config {
+    description
+      "Configuration data for policy actions";
+
+    uses generic-actions;
+  }
+
+  grouping policy-actions-state {
+    description
+      "Operational state data for policy actions";
+  }
+
+  grouping policy-actions-top {
+    description
+      "Top-level grouping for policy actions";
+
+    container actions {
+      description
+        "Top-level container for policy action statements";
+
+      container config {
+        description
+          "Configuration data for policy actions";
+
+        uses policy-actions-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for policy actions";
+
+        uses policy-actions-config;
+        uses policy-actions-state;
+      }
+    }
+  }
+
+  grouping policy-statements-top {
+    description
+      "Top-level grouping for the policy statements list";
+
+    container statements {
+      description
+        "Enclosing container for policy statements";
+
+      list statement {
+        key "name";
+        // TODO: names of policy statements within a policy
+        // definition should probably be optional, however, YANG
+        // requires a unique id for lists
+        ordered-by user;
+        description
+          "Policy statements group conditions and actions
+          within a policy definition.  They are evaluated in
+          the order specified (see the description of policy
+          evaluation at the top of this module.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to list key";
+        }
+
+        container config {
+          description
+            "Configuration data for policy statements";
+
+          uses policy-statements-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for policy statements";
+
+          uses policy-statements-config;
+          uses policy-statements-state;
+        }
+
+        uses policy-conditions-top;
+        uses policy-actions-top;
+      }
+    }
+  }
+
+  grouping defined-sets-top {
+    description
+      "Top-level grouping for defined set definitions";
+
+    container defined-sets {
+      description
+        "Predefined sets of attributes used in policy match
+        statements";
+
+      uses generic-defined-sets;
+    }
+  }
+
+  grouping policy-definitions-config {
+    description
+      "Configuration data for policy definitions";
+
+    leaf name {
+      type string;
+      description
+        "Name of the top-level policy definition -- this name
+        is used in references to the current policy";
+    }
+  }
+
+  grouping policy-definitions-state {
+    description
+      "Operational state data for policy definitions";
+  }
+
+  grouping policy-definitions-top {
+    description
+      "Top-level grouping for the policy definition list";
+
+    container policy-definitions {
+      description
+        "Enclosing container for the list of top-level policy
+          definitions";
+
+      list policy-definition {
+        key "name";
+        description
+          "List of top-level policy definitions, keyed by unique
+          name.  These policy definitions are expected to be
+          referenced (by name) in policy chains specified in import
+          or export configuration statements.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container config {
+          description
+            "Configuration data for policy defintions";
+
+          uses policy-definitions-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for policy definitions";
+
+          uses policy-definitions-config;
+          uses policy-definitions-state;
+        }
+
+        uses policy-statements-top;
+      }
+    }
+  }
+
+  grouping routing-policy-top {
+    description
+      "Top level container for OpenConfig routing policy";
+
+    container routing-policy {
+      description
+        "Top-level container for all routing policy configuration";
+
+
+      uses defined-sets-top;
+
+      uses policy-definitions-top;
+    }
+  }
+
+  grouping apply-policy-import-config {
+    description
+      "Configuration data for applying import policies";
+
+    leaf-list import-policy {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+          "oc-rpol:policy-definition/oc-rpol:name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      ordered-by user;
+      description
+        "list of policy names in sequence to be applied on
+        receiving a routing update in the current context, e.g.,
+        for the current peer group, neighbor, address family,
+        etc.";
+    }
+
+    leaf default-import-policy {
+      type default-policy-type;
+      default REJECT_ROUTE;
+      description
+        "explicitly set a default policy if no policy definition
+        in the import policy chain is satisfied.";
+    }
+
+  }
+
+  grouping apply-policy-export-config {
+    description
+      "Configuration data for applying export policies";
+
+    leaf-list export-policy {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+          "oc-rpol:policy-definition/oc-rpol:name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      ordered-by user;
+      description
+        "list of policy names in sequence to be applied on
+        sending a routing update in the current context, e.g.,
+        for the current peer group, neighbor, address family,
+        etc.";
+    }
+
+    leaf default-export-policy {
+      type default-policy-type;
+      default REJECT_ROUTE;
+      description
+        "explicitly set a default policy if no policy definition
+        in the export policy chain is satisfied.";
+    }
+  }
+
+
+  grouping apply-policy-config {
+    description
+      "Configuration data for routing policies";
+
+    uses apply-policy-import-config;
+    uses apply-policy-export-config;
+
+  }
+
+
+
+  grouping apply-policy-state {
+    description
+      "Operational state associated with routing policy";
+
+    //TODO: identify additional state data beyond the intended
+    //policy configuration.
+  }
+
+  grouping apply-policy-group {
+    description
+      "Top level container for routing policy applications. This
+      grouping is intended to be used in routing models where
+      needed.";
+
+    container apply-policy {
+      description
+        "Anchor point for routing policies in the model.
+        Import and export policies are with respect to the local
+        routing table, i.e., export (send) and import (receive),
+        depending on the context.";
+
+      container config {
+        description
+          "Policy configuration data.";
+
+        uses apply-policy-config;
+      }
+
+      container state {
+
+        config false;
+        description
+          "Operational state for routing policy";
+
+        uses apply-policy-config;
+        uses apply-policy-state;
+      }
+    }
+  }
+
+  uses routing-policy-top;
+
+}