blob: 4903de8f4f64c5f79c2a68da6178b29852011504 [file] [log] [blame]
module openconfig-bgp-policy {
yang-version "1";
// namespace
namespace "http://openconfig.net/yang/bgp-policy";
prefix "oc-bgp-pol";
// import some basic types
import openconfig-inet-types { prefix oc-inet; }
import openconfig-routing-policy {prefix oc-rpol; }
import openconfig-policy-types { prefix oc-pol-types; }
import openconfig-bgp-types { prefix oc-bgp-types; }
import openconfig-extensions { prefix oc-ext; }
// meta
organization
"OpenConfig working group";
contact
"OpenConfig working group
netopenconfig@googlegroups.com";
description
"This module contains data definitions for BGP routing policy.
It augments the base routing-policy module with BGP-specific
options for conditions and actions.";
oc-ext:openconfig-version "4.0.1";
revision "2017-07-30" {
description
"Clarification of add-paths send-max leaf";
reference "4.0.1";
}
revision "2017-07-10" {
description
"Add error notifications; moved add-paths config; add AS
prepend policy features; removed unneeded config leaves";
reference "4.0.0";
}
revision "2017-02-02" {
description
"Bugfix to remove remaining global-level policy data";
reference "3.0.1";
}
revision "2017-01-26" {
description
"Add dynamic neighbor support, migrate to OpenConfig types";
reference "3.0.0";
}
revision "2016-06-21" {
description
"OpenConfig BGP refactor";
reference "2.1.1";
}
// typedef statements
typedef bgp-set-community-option-type {
type enumeration {
enum ADD {
description
"add the specified communities to the existing
community attribute";
}
enum REMOVE {
description
"remove the specified communities from the
existing community attribute";
}
enum REPLACE {
description
"replace the existing community attribute with
the specified communities. If an empty set is
specified, this removes the community attribute
from the route.";
}
}
description
"Type definition for options when setting the community
attribute in a policy action";
}
typedef bgp-next-hop-type {
type union {
type oc-inet:ip-address;
type enumeration {
enum SELF {
description "special designation for local router's own
address, i.e., next-hop-self";
}
}
}
description
"type definition for specifying next-hop in policy actions";
}
typedef bgp-set-med-type {
type union {
type uint32;
type string {
pattern '^[+-][0-9]+$';
}
type enumeration {
enum IGP {
description "set the MED value to the IGP cost toward the
next hop for the route";
}
}
}
description
"Type definition for specifying how the BGP MED can
be set in BGP policy actions. The three choices are to set
the MED directly, increment/decrement using +/- notation,
and setting it to the IGP cost (predefined value).";
}
// grouping statements
grouping match-community-config {
description
"Configuration data for match conditions on communities";
leaf community-set {
type leafref {
path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
"oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:community-sets/" +
"oc-bgp-pol:community-set/oc-bgp-pol:community-set-name";
}
description
"References a defined community set";
}
uses oc-rpol:match-set-options-group;
}
grouping match-community-state {
description
"Operational state data for match conditions on communities";
}
grouping match-community-top {
description
"Top-level grouping for match conditions on communities";
container match-community-set {
description
"Top-level container for match conditions on communities.
Match a referenced community-set according to the logic
defined in the match-set-options leaf";
container config {
description
"Configuration data for match conditions on communities";
uses match-community-config;
}
container state {
config false;
description
"Operational state data ";
uses match-community-config;
uses match-community-state;
}
}
}
grouping match-ext-community-config {
description
"Configuration data for match conditions on extended
communities";
leaf ext-community-set {
type leafref {
path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
"oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:ext-community-sets/" +
"oc-bgp-pol:ext-community-set/" +
"oc-bgp-pol:ext-community-set-name";
}
description "References a defined extended community set";
}
uses oc-rpol:match-set-options-group;
}
grouping match-ext-community-state {
description
"Operational state data for match conditions on extended
communities";
}
grouping match-ext-community-top {
description
"Top-level grouping for match conditions on extended
communities";
container match-ext-community-set {
description
"Match a referenced extended community-set according to the
logic defined in the match-set-options leaf";
container config {
description
"Configuration data for match conditions on extended
communities";
uses match-ext-community-config;
}
container state {
config false;
description
"Operational state data for match conditions on extended
communities";
uses match-ext-community-config;
uses match-ext-community-state;
}
}
}
grouping match-as-path-config {
description
"Configuration data for match conditions on AS path set";
leaf as-path-set {
type leafref {
path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
"oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:as-path-sets/" +
"oc-bgp-pol:as-path-set/oc-bgp-pol:as-path-set-name";
}
description "References a defined AS path set";
}
uses oc-rpol:match-set-options-group;
}
grouping match-as-path-state {
description
"Operational state data for match conditions on AS path set";
}
grouping match-as-path-top {
description
"Top-level grouping for match conditions on AS path set";
container match-as-path-set {
description
"Match a referenced as-path set according to the logic
defined in the match-set-options leaf";
container config {
description
"Configuration data for match conditions on AS path set";
uses match-as-path-config;
}
container state {
config false;
description
"Operational state data for match conditions on AS
path set";
uses match-as-path-config;
uses match-as-path-state;
}
}
}
grouping bgp-match-set-conditions {
description
"Condition statement definitions for checking membership in a
defined set";
uses match-community-top;
uses match-ext-community-top;
uses match-as-path-top;
}
grouping community-count-config {
description
"Configuration data for community count condition";
uses oc-pol-types:attribute-compare-operators;
}
grouping community-count-state {
description
"Operational state data for community count condition";
}
grouping community-count-top {
description
"Top-level grouping for community count condition";
container community-count {
description
"Value and comparison operations for conditions based on the
number of communities in the route update";
container config {
description
"Configuration data for community count condition";
uses community-count-config;
}
container state {
config false;
description
"Operational state data for community count condition";
uses community-count-config;
uses community-count-state;
}
}
}
grouping as-path-length-config {
description
"Configuration data for AS path length condition";
uses oc-pol-types:attribute-compare-operators;
}
grouping as-path-length-state {
description
"Operational state data for AS path length condition";
}
grouping as-path-length-top {
description
"Top-level grouping for AS path length condition";
container as-path-length {
description
"Value and comparison operations for conditions based on the
length of the AS path in the route update";
container config {
description
"Configuration data for AS path length condition";
uses as-path-length-config;
}
container state {
config false;
description
"Operational state data for AS path length condition";
uses as-path-length-config;
uses as-path-length-state;
}
}
}
grouping bgp-conditions-config {
description
"Configuration data for BGP-specific policy conditions";
leaf med-eq {
type uint32;
description
"Condition to check if the received MED value is equal to
the specified value";
}
leaf origin-eq {
type oc-bgp-types:bgp-origin-attr-type;
description
"Condition to check if the route origin is equal to the
specified value";
}
leaf-list next-hop-in {
type oc-inet:ip-address;
description
"List of next hop addresses to check for in the route
update";
}
leaf-list afi-safi-in {
type identityref {
base oc-bgp-types:AFI_SAFI_TYPE;
}
description
"List of address families which the NLRI may be
within";
}
leaf local-pref-eq {
type uint32;
// TODO: add support for other comparisons if needed
description
"Condition to check if the local pref attribute is equal to
the specified value";
}
leaf route-type {
// TODO: verify extent of vendor support for this comparison
type enumeration {
enum INTERNAL {
description "route type is internal";
}
enum EXTERNAL {
description "route type is external";
}
}
description
"Condition to check the route type in the route update";
}
}
grouping bgp-conditions-state {
description
"Operational state data for BGP-specific policy conditions";
}
grouping bgp-conditions-top {
description
"Top-level grouping for BGP-specific policy conditions";
container bgp-conditions {
description
"Top-level container ";
container config {
description
"Configuration data for BGP-specific policy conditions";
uses bgp-conditions-config;
}
container state {
config false;
description
"Operational state data for BGP-specific policy
conditions";
uses bgp-conditions-config;
uses bgp-conditions-state;
}
uses community-count-top;
uses as-path-length-top;
uses bgp-match-set-conditions;
}
}
grouping community-set-config {
description
"Configuration data for BGP community sets";
leaf community-set-name {
type string;
mandatory true;
description
"name / label of the community set -- this is used to
reference the set in match conditions";
}
leaf-list community-member {
type union {
type oc-bgp-types:bgp-std-community-type;
type oc-bgp-types:bgp-community-regexp-type;
type oc-bgp-types:bgp-well-known-community-type;
}
description
"members of the community set";
}
}
grouping community-set-state {
description
"Operational state data for BGP community sets";
}
grouping community-set-top {
description
"Top-level grouping for BGP community sets";
container community-sets {
description
"Enclosing container for list of defined BGP community sets";
list community-set {
key "community-set-name";
description
"List of defined BGP community sets";
leaf community-set-name {
type leafref {
path "../config/community-set-name";
}
description
"Reference to list key";
}
container config {
description
"Configuration data for BGP community sets";
uses community-set-config;
}
container state {
config false;
description
"Operational state data for BGP community sets";
uses community-set-config;
uses community-set-state;
}
}
}
}
grouping ext-community-set-config {
description
"Configuration data for extended BGP community sets";
leaf ext-community-set-name {
type string;
description
"name / label of the extended community set -- this is
used to reference the set in match conditions";
}
leaf-list ext-community-member {
type union {
type oc-bgp-types:bgp-ext-community-type;
type oc-bgp-types:bgp-community-regexp-type;
}
description
"members of the extended community set";
}
}
grouping ext-community-set-state {
description
"Operational state data for extended BGP community sets";
}
grouping ext-community-set-top {
description
"Top-level grouping for extended BGP community sets";
container ext-community-sets {
description
"Enclosing container for list of extended BGP community
sets";
list ext-community-set {
key "ext-community-set-name";
description
"List of defined extended BGP community sets";
leaf ext-community-set-name {
type leafref {
path "../config/ext-community-set-name";
}
description
"Reference to list key";
}
container config {
description
"Configuration data for extended BGP community sets";
uses ext-community-set-config;
}
container state {
config false;
description
"Operational state data for extended BGP community sets";
uses ext-community-set-config;
uses ext-community-set-state;
}
}
}
}
grouping as-path-set-config {
description
"Configuration data for AS path sets";
leaf as-path-set-name {
type string;
description
"name of the AS path set -- this is used to reference
the set in match conditions";
}
leaf-list as-path-set-member {
// TODO: need to refine typedef for AS path expressions
type string;
description
"AS path expression -- list of ASes in the set";
}
}
grouping as-path-set-state {
description
"Operational state data for AS path sets";
}
grouping as-path-set-top {
description
"Top-level grouping for AS path sets";
container as-path-sets {
description
"Enclosing container for list of define AS path sets";
list as-path-set {
key "as-path-set-name";
description
"List of defined AS path sets";
leaf as-path-set-name {
type leafref {
path "../config/as-path-set-name";
}
description
"Reference to list key";
}
container config {
description
"Configuration data for AS path sets";
uses as-path-set-config;
}
container state {
config false;
description
"Operational state data for AS path sets";
uses as-path-set-config;
uses as-path-set-state;
}
}
}
}
// augment statements
augment "/oc-rpol:routing-policy/oc-rpol:defined-sets" {
description "adds BGP defined sets container to routing policy
model";
container bgp-defined-sets {
description
"BGP-related set definitions for policy match conditions";
uses community-set-top;
uses ext-community-set-top;
uses as-path-set-top;
}
}
grouping as-path-prepend-config {
description
"Configuration data for the AS path prepend action";
leaf repeat-n {
type uint8 {
range 1..max;
}
description
"Number of times to prepend the value specified in the asn
leaf to the AS path. If no value is specified by the asn
leaf, the local AS number of the system is used. The value
should be between 1 and the maximum supported by the
implementation.";
}
leaf asn {
type oc-inet:as-number;
description
"The AS number to prepend to the AS path. If this leaf is
not specified and repeat-n is set, then the local AS
number will be used for prepending.";
}
}
grouping as-path-prepend-state {
description
"Operational state data for the AS path prepend action";
}
grouping as-path-prepend-top {
description
"Top-level grouping for the AS path prepend action";
container set-as-path-prepend {
description
"Action to prepend the specified AS number to the AS-path a
specified number of times";
container config {
description
"Configuration data for the AS path prepend action";
uses as-path-prepend-config;
}
container state {
config false;
description
"Operational state data for the AS path prepend action";
uses as-path-prepend-config;
uses as-path-prepend-state;
}
}
}
grouping set-community-action-common {
description
"Common leaves for set-community and set-ext-community
actions";
leaf method {
type enumeration {
enum INLINE {
description
"The extended communities are specified inline as a
list";
}
enum REFERENCE {
description
"The extended communities are specified by referencing a
defined ext-community set";
}
}
description
"Indicates the method used to specify the extended
communities for the set-ext-community action";
}
leaf options {
type bgp-set-community-option-type;
description
"Options for modifying the community attribute with
the specified values. These options apply to both
methods of setting the community attribute.";
}
}
grouping set-community-inline-config {
description
"Configuration data for inline specification of set-community
action";
leaf-list communities {
type union {
type oc-bgp-types:bgp-std-community-type;
type oc-bgp-types:bgp-well-known-community-type;
}
description
"Set the community values for the update inline with
a list.";
}
}
grouping set-community-inline-state {
description
"Operational state data or inline specification of
set-community action";
}
grouping set-community-inline-top {
description
"Top-level grouping or inline specification of set-community
action";
container inline {
when "../config/method=INLINE" {
description
"Active only when the set-community method is INLINE";
}
description
"Set the community values for the action inline with
a list.";
container config {
description
"Configuration data or inline specification of set-community
action";
uses set-community-inline-config;
}
container state {
config false;
description
"Operational state data or inline specification of
set-community action";
uses set-community-inline-config;
uses set-community-inline-state;
}
}
}
grouping set-community-reference-config {
description
"Configuration data for referening a community-set in the
set-community action";
leaf community-set-ref {
type leafref {
path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
"oc-bgp-pol:bgp-defined-sets/" +
"oc-bgp-pol:community-sets/oc-bgp-pol:community-set/" +
"oc-bgp-pol:community-set-name";
}
description
"References a defined community set by name";
}
}
grouping set-community-reference-state {
description
"Operational state data for referening a community-set in the
set-community action";
}
grouping set-community-reference-top {
description
"Top-level grouping for referening a community-set in the
set-community action";
container reference {
when "../config/method=REFERENCE" {
description
"Active only when the set-community method is REFERENCE";
}
description
"Provide a reference to a defined community set for the
set-community action";
container config {
description
"Configuration data for referening a community-set in the
set-community action";
uses set-community-reference-config;
}
container state {
config false;
description
"Operational state data for referening a community-set
in the set-community action";
uses set-community-reference-config;
uses set-community-reference-state;
}
}
}
grouping set-community-action-config {
description
"Configuration data for the set-community action";
uses set-community-action-common;
}
grouping set-community-action-state {
description
"Operational state data for the set-community action";
}
grouping set-community-action-top {
description
"Top-level grouping for the set-community action";
container set-community {
description
"Action to set the community attributes of the route, along
with options to modify how the community is modified.
Communities may be set using an inline list OR
reference to an existing defined set (not both).";
container config {
description
"Configuration data for the set-community action";
uses set-community-action-config;
}
container state {
config false;
description
"Operational state data for the set-community action";
uses set-community-action-config;
uses set-community-action-state;
}
uses set-community-inline-top;
uses set-community-reference-top;
}
}
grouping set-ext-community-inline-config {
description
"Configuration data for inline specification of
set-ext-community action";
leaf-list communities {
type union {
type oc-bgp-types:bgp-ext-community-type;
type oc-bgp-types:bgp-well-known-community-type;
}
description
"Set the extended community values for the update inline
with a list.";
}
}
grouping set-ext-community-inline-state {
description
"Operational state data or inline specification of
set-ext-community action";
}
grouping set-ext-community-inline-top {
description
"Top-level grouping or inline specification of set-ext-community
action";
container inline {
when "../config/method=INLINE" {
description
"Active only when the set-community method is INLINE";
}
description
"Set the extended community values for the action inline with
a list.";
container config {
description
"Configuration data or inline specification of
set-ext-community action";
uses set-ext-community-inline-config;
}
container state {
config false;
description
"Operational state data or inline specification of
set-ext-community action";
uses set-ext-community-inline-config;
uses set-ext-community-inline-state;
}
}
}
grouping set-ext-community-reference-config {
description
"Configuration data for referening a extended community-set
in the set-ext-community action";
leaf ext-community-set-ref {
type leafref {
path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
"oc-bgp-pol:bgp-defined-sets/" +
"oc-bgp-pol:ext-community-sets/" +
"oc-bgp-pol:ext-community-set/" +
"oc-bgp-pol:ext-community-set-name";
}
description
"References a defined extended community set by
name";
}
}
grouping set-ext-community-reference-state {
description
"Operational state data for referening an extended
community-set in the set-ext-community action";
}
grouping set-ext-community-reference-top {
description
"Top-level grouping for referening an extended community-set
in the set-community action";
container reference {
when "../config/method=REFERENCE" {
description
"Active only when the set-community method is REFERENCE";
}
description
"Provide a reference to an extended community set for the
set-ext-community action";
container config {
description
"Configuration data for referening an extended
community-set in the set-ext-community action";
uses set-ext-community-reference-config;
}
container state {
config false;
description
"Operational state data for referening an extended
community-set in the set-ext-community action";
uses set-ext-community-reference-config;
uses set-ext-community-reference-state;
}
}
}
grouping set-ext-community-action-config {
description
"Configuration data for the set-ext-community action";
uses set-community-action-common;
}
grouping set-ext-community-action-state {
description
"Operational state data for the set-ext-community action";
}
grouping set-ext-community-action-top {
description
"Top-level grouping for the set-ext-community action";
container set-ext-community {
description
"Action to set the extended community attributes of the
route, along with options to modify how the community is
modified. Extended communities may be set using an inline
list OR a reference to an existing defined set (but not
both).";
container config {
description
"Configuration data for the set-ext-community action";
uses set-ext-community-action-config;
}
container state {
config false;
description
"Operational state data for the set-ext-community action";
uses set-ext-community-action-config;
uses set-ext-community-action-state;
}
uses set-ext-community-inline-top;
uses set-ext-community-reference-top;
}
}
grouping bgp-actions-config {
description
"Configuration data for BGP-specific actions";
leaf set-route-origin {
type oc-bgp-types:bgp-origin-attr-type;
description "set the origin attribute to the specified
value";
}
leaf set-local-pref {
type uint32;
description "set the local pref attribute on the route
update";
}
leaf set-next-hop {
type bgp-next-hop-type;
description "set the next-hop attribute in the route update";
}
leaf set-med {
type bgp-set-med-type;
description "set the med metric attribute in the route
update";
}
}
grouping bgp-actions-state {
description
"Operational state data for BGP-specific actions";
}
grouping bgp-actions-top {
description
"Top-level grouping for BGP-specific actions";
container bgp-actions {
description
"Top-level container for BGP-specific actions";
container config {
description
"Configuration data for BGP-specific actions";
uses bgp-actions-config;
}
container state {
config false;
description
"Operational state data for BGP-specific actions";
uses bgp-actions-config;
uses bgp-actions-state;
}
uses as-path-prepend-top;
uses set-community-action-top;
uses set-ext-community-action-top;
}
}
augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
"oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
"oc-rpol:conditions" {
description
"BGP policy conditions added to routing policy module";
uses bgp-conditions-top;
}
augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
"oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
"oc-rpol:actions" {
description "BGP policy actions added to routing policy
module";
uses bgp-actions-top;
}
// rpc statements
// notification statements
}