From 1dcc2a57021b56ddac07d5050db49be30d904178 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 09:37:55 -0700 Subject: [PATCH 001/201] Fix CI push and increase timeout --- cloudbuild.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index a53dcde45..b3eb0f930 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -80,7 +80,7 @@ steps: entrypoint: 'bash' args: - -c - - >- # CI Configuration + - >- # CI Configuration #-compat-report=yanglint /go/bin/cmd_gen -modelRoot=$_MODEL_ROOT -repo-slug=$_REPO_SLUG @@ -89,7 +89,6 @@ steps: -pr-number=$_PR_NUMBER -skipped-validators=confd,yanglint -extra-pyang-versions=2.2.1 - #-compat-report=yanglint -branch=$BRANCH_NAME secretEnv: ['GITHUB_ACCESS_TOKEN'] env: @@ -293,7 +292,7 @@ steps: path: /go id: 'compat-report' -timeout: 600s +timeout: 900s options: machineType: 'E2_HIGHCPU_32' From 9c501dd53bb0303f6c90c9002c92fde3217a0042 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 09:40:35 -0700 Subject: [PATCH 002/201] remove yanglint comment --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index b3eb0f930..9c4c24184 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -80,7 +80,7 @@ steps: entrypoint: 'bash' args: - -c - - >- # CI Configuration #-compat-report=yanglint + - >- # CI Configuration /go/bin/cmd_gen -modelRoot=$_MODEL_ROOT -repo-slug=$_REPO_SLUG From d2e6fb1d3903622abcc1bc89fb843fd53e1da899 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 17:20:25 -0700 Subject: [PATCH 003/201] Test with new pyangbind plugin dir --- cloudbuild.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 9c4c24184..ac2276f7b 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,8 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - branch=$(git tag -l 'v9*' | sort -V | tail -1) + #branch=$(git tag -l 'v9*' | sort -V | tail -1) + branch=local-pyangbind-plugin git checkout $branch volumes: - name: 'ssh' From 475954ed988198ac49881f88bfb35092acfb298c Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 17:24:13 -0700 Subject: [PATCH 004/201] Trigger Build From bca3526165bfcb1bb2eeb265306c4bccb9b63d25 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 17:33:43 -0700 Subject: [PATCH 005/201] revert timeout increase --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index ac2276f7b..c1483ab2b 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -293,7 +293,7 @@ steps: path: /go id: 'compat-report' -timeout: 900s +timeout: 600s options: machineType: 'E2_HIGHCPU_32' From 7003096524fa34ccc03a173f0b8aaf7c0cff0476 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 17:47:49 -0700 Subject: [PATCH 006/201] Trigger Build From 37ad0caf09886fd86973eaaa68d569ae9b957ae4 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 18:03:08 -0700 Subject: [PATCH 007/201] Trigger Build From ff380a57c9514c78ba799c5fcb6b943ebe30583d Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 18:18:08 -0700 Subject: [PATCH 008/201] Trigger Build From cb97bd1ed74868598f3aaf3d5b00027a6dae978d Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 18:34:07 -0700 Subject: [PATCH 009/201] Move pyangbind to compat report due to failing BFD check --- cloudbuild.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index c1483ab2b..31bb8dd50 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -90,6 +90,7 @@ steps: -pr-number=$_PR_NUMBER -skipped-validators=confd,yanglint -extra-pyang-versions=2.2.1 + -compat-report=pyangbind -branch=$BRANCH_NAME secretEnv: ['GITHUB_ACCESS_TOKEN'] env: From 213371277ca19202399bbf3448ac1f06cbd147ce Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 18:52:30 -0700 Subject: [PATCH 010/201] Update to v10 for CI --- cloudbuild.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 31bb8dd50..e02c34e7f 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,8 +52,7 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - #branch=$(git tag -l 'v9*' | sort -V | tail -1) - branch=local-pyangbind-plugin + branch=$(git tag -l 'v10.*' | sort -V | tail -1) git checkout $branch volumes: - name: 'ssh' From 662e0713f0ba478dc30915d2328dc2d54ef42013 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 19:00:58 -0700 Subject: [PATCH 011/201] Test new pyangbind version --- cloudbuild.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index e02c34e7f..e622fe369 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,8 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - branch=$(git tag -l 'v10.*' | sort -V | tail -1) + #branch=$(git tag -l 'v10.*' | sort -V | tail -1) + branch=pyangbind-version git checkout $branch volumes: - name: 'ssh' @@ -89,8 +90,8 @@ steps: -pr-number=$_PR_NUMBER -skipped-validators=confd,yanglint -extra-pyang-versions=2.2.1 - -compat-report=pyangbind -branch=$BRANCH_NAME + #-compat-report=pyangbind secretEnv: ['GITHUB_ACCESS_TOKEN'] env: - 'GOPATH=/go' From 46ef618af044cc6d340c5854598db6aaa064c9d9 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 19:02:25 -0700 Subject: [PATCH 012/201] trigger CI --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index e622fe369..561000730 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -91,7 +91,7 @@ steps: -skipped-validators=confd,yanglint -extra-pyang-versions=2.2.1 -branch=$BRANCH_NAME - #-compat-report=pyangbind + -compat-report=pyangbind secretEnv: ['GITHUB_ACCESS_TOKEN'] env: - 'GOPATH=/go' From 57f0b652a242b1a3ba65a984a9891491efa3be66 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 13 Jul 2023 19:13:21 -0700 Subject: [PATCH 013/201] Trigger Build From 37557d26460d13c7deed03f5448e14497affd544 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Fri, 14 Jul 2023 16:50:13 -0700 Subject: [PATCH 014/201] Add IPv6 RA config mode (#900) * add v6 ra config mode, deprecate suppress * use container level enable, and mode enum --- .../models/interfaces/openconfig-if-ip.yang | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/release/models/interfaces/openconfig-if-ip.yang b/release/models/interfaces/openconfig-if-ip.yang index a0b74fee9..498a90bec 100644 --- a/release/models/interfaces/openconfig-if-ip.yang +++ b/release/models/interfaces/openconfig-if-ip.yang @@ -44,7 +44,14 @@ module openconfig-if-ip { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.3.0"; + oc-ext:openconfig-version "3.4.0"; + + revision "2023-06-30" { + description + "Deprecate IPv6 router advertisment config suppress leaf and add config + mode leaf."; + reference "3.4.0"; + } revision "2023-04-12" { description @@ -54,7 +61,7 @@ module openconfig-if-ip { revision "2023-02-06" { description - "Add ipv6 link-local configuration."; + "Add IPv6 link-local configuration."; reference "3.2.0"; } @@ -939,6 +946,15 @@ module openconfig-if-ip { description "Configuration parameters for IPv6 router advertisements."; + leaf enable { + type boolean; + default true; + description + "If set to false, all IPv6 router advertisement functions are + disabled. The local system will not transmit router advertisement + messages and will not respond to router solicitation messages."; + } + leaf interval { type uint32; units seconds; @@ -957,6 +973,7 @@ module openconfig-if-ip { } leaf suppress { + status deprecated; type boolean; default false; description @@ -964,6 +981,27 @@ module openconfig-if-ip { messages are not transmitted on this interface."; } + leaf mode { + type enumeration { + enum ALL { + description + "The system will transmit unsolicited router advertisement + messages and respond to router solicitation requests."; + } + enum DISABLE_UNSOLICITED_RA { + description + "Unsolicted router advertisement messages are not transmitted on + this interface. Responses to router solicitation messages will + be transmitted."; + } + } + default "ALL"; + description + "Mode controls which set of behaviors the local system should perform + to support IPv6 router advertisements."; + reference "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + leaf managed { type boolean; default false; From bf264a407f5bbcf8ac753d512f21bebacedf7f12 Mon Sep 17 00:00:00 2001 From: wenovus Date: Mon, 17 Jul 2023 15:26:10 -0700 Subject: [PATCH 015/201] Ready for review --- cloudbuild.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 561000730..88148e530 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,8 +52,7 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - #branch=$(git tag -l 'v10.*' | sort -V | tail -1) - branch=pyangbind-version + branch=$(git tag -l 'v10.*' | sort -V | tail -1) git checkout $branch volumes: - name: 'ssh' From 94aeb472fcc2f93deb6d6080996021ae3faa88aa Mon Sep 17 00:00:00 2001 From: jnelson-sj <116230171+jnelson-sj@users.noreply.github.com> Date: Mon, 24 Jul 2023 16:27:49 -0700 Subject: [PATCH 016/201] Bias voltage thresholds (#907) * Initial commit for bias and voltage thresholds * Specify that the thresholds are compared against the instant parameter of the measured value --- .../openconfig-platform-transceiver.yang | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/release/models/platform/openconfig-platform-transceiver.yang b/release/models/platform/openconfig-platform-transceiver.yang index 388953b49..e0af67e6e 100644 --- a/release/models/platform/openconfig-platform-transceiver.yang +++ b/release/models/platform/openconfig-platform-transceiver.yang @@ -66,7 +66,13 @@ module openconfig-platform-transceiver { specify a physical-channel within a TRANSCEIVER component (i.e. gray optic) that it is associated with."; - oc-ext:openconfig-version "0.11.0"; + oc-ext:openconfig-version "0.12.0"; + + revision "2023-06-27" { + description + "Add tx bias and voltage thresholds"; + reference "0.12.0"; + } revision "2023-05-03" { description @@ -439,7 +445,9 @@ module openconfig-platform-transceiver { container thresholds { description - "Enclosing container for transceiver alarm thresholds."; + "Enclosing container for transceiver alarm thresholds. + Each threshold is compared to the instant value of the + measured parameter corresponding to the threshold"; list threshold { key "severity"; @@ -803,6 +811,38 @@ module openconfig-platform-transceiver { description "The lower power threshold for the laser input power."; } + leaf laser-bias-current-upper{ + description + "The upper threshold for the laser bias current."; + type decimal64 { + fraction-digits 2; + } + units mA; + } + leaf laser-bias-current-lower{ + description + "The lower threshold for the laser bias current."; + type decimal64 { + fraction-digits 2; + } + units mA; + } + leaf supply-voltage-upper{ + description + "The upper threshold for the transceiver supply voltage."; + type decimal64 { + fraction-digits 2; + } + units volts; + } + leaf supply-voltage-lower{ + description + "The lower threshold for the transceiver supply voltage."; + type decimal64 { + fraction-digits 2; + } + units volts; + } } grouping port-transceiver-top { From 5b178c57258869ed4e02a24f0902376f48195ef2 Mon Sep 17 00:00:00 2001 From: Leon Wang Date: Tue, 25 Jul 2023 09:23:00 -0700 Subject: [PATCH 017/201] Add support for SFP-DD and DSFP form factor identities (#585) SFP-DD and DSFP transceiver form factor identities are missing from OpenConfig. --- .../openconfig-transport-types.yang | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index 494c67216..4eecd6b53 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,13 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.18.1"; + oc-ext:openconfig-version "0.19.0"; + + revision "2023-07-24" { + description + "Add SFP_DD and DSFP form factor identities."; + reference "0.19.0"; + } revision "2023-02-08" { description @@ -867,6 +873,22 @@ module openconfig-transport-types { 50 Gb/s signal"; } + identity SFP_DD { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "SFP-DD electrical interfaces will employ 2 lanes that operate up + 25 Gbps NRZ modulation or 56 Gbps PAM4 modulation, providing + solutions up to 50 Gbps or 112 Gbps PAM4 aggregate"; + reference "http://sfp-dd.com"; + } + + identity DSFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "A transceiver implementing the DSFP Transceiver specification"; + reference "https://dsfpmsa.org/"; + } + identity XFP { base TRANSCEIVER_FORM_FACTOR_TYPE; description From e5ce68cb12ed6fe7e06bbd768721965bf3ae974e Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 25 Jul 2023 09:27:36 -0700 Subject: [PATCH 018/201] Add multicast counters to ip interface, remove physical counters from subinterface (#905) * add multicast to ip if, remove physical counters from subinterface * add in deprecated leaves to subif for backwards compat * use common grouping for if counters --- .../models/interfaces/openconfig-if-ip.yang | 111 +--- .../interfaces/openconfig-interfaces.yang | 622 ++++++++++-------- 2 files changed, 364 insertions(+), 369 deletions(-) diff --git a/release/models/interfaces/openconfig-if-ip.yang b/release/models/interfaces/openconfig-if-ip.yang index 498a90bec..90510e9e7 100644 --- a/release/models/interfaces/openconfig-if-ip.yang +++ b/release/models/interfaces/openconfig-if-ip.yang @@ -44,7 +44,14 @@ module openconfig-if-ip { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; + + revision "2023-07-14" { + description + "Move counters which apply to both interfaces and subinterfaces to + a common grouping. Deprecate physical counters from subinterface"; + reference "3.5.0"; + } revision "2023-06-30" { description @@ -230,42 +237,6 @@ module openconfig-if-ip { "Packet and byte counters for IP transmission and reception for the address family."; - - leaf in-pkts { - type oc-yang:counter64; - description - "The total number of IP packets received for the specified - address family, including those received in error"; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } - - leaf in-octets { - type oc-yang:counter64; - description - "The total number of octets received in input IP packets - for the specified address family, including those received - in error."; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } - - leaf in-error-pkts { - // TODO: this counter combines several error conditions -- - // could consider breaking them out to separate leaf nodes - type oc-yang:counter64; - description - "Number of IP packets discarded due to errors for the - specified address family, including errors in the IP - header, no route found to the IP destination, invalid - address, unknown protocol, etc."; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } - leaf in-forwarded-pkts { type oc-yang:counter64; description @@ -291,57 +262,6 @@ module openconfig-if-ip { Internet Protocol (IP)"; } - leaf in-discarded-pkts { - type oc-yang:counter64; - description - "The number of input IP packets for the - specified address family, for which no problems were - encountered to prevent their continued processing, but - were discarded (e.g., for lack of buffer space)."; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } - - leaf out-pkts { - type oc-yang:counter64; - description - "The total number of IP packets for the - specified address family that the device supplied - to the lower layers for transmission. This includes - packets generated locally and those forwarded by the - device."; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } - - leaf out-octets { - type oc-yang:counter64; - description - "The total number of octets in IP packets for the - specified address family that the device - supplied to the lower layers for transmission. This - includes packets generated locally and those forwarded by - the device."; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } - - leaf out-error-pkts { - // TODO: this counter combines several error conditions -- - // could consider breaking them out to separate leaf nodes - type oc-yang:counter64; - description - "Number of IP packets for the specified address family - locally generated and discarded due to errors, including - no route found to the IP destination."; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } - leaf out-forwarded-pkts { type oc-yang:counter64; description @@ -363,25 +283,10 @@ module openconfig-if-ip { "RFC 4293 - Management Information Base for the Internet Protocol (IP)"; } - - leaf out-discarded-pkts { - type oc-yang:counter64; - description - "The number of output IP packets for the - specified address family for which no problem was - encountered to prevent their transmission to their - destination, but were discarded (e.g., for lack of - buffer space)."; - reference - "RFC 4293 - Management Information Base for the - Internet Protocol (IP)"; - } } - } - grouping ipv4-global-config { description "Configuration data for IPv4 interfaces across diff --git a/release/models/interfaces/openconfig-interfaces.yang b/release/models/interfaces/openconfig-interfaces.yang index 7d349a07c..9517a92ab 100644 --- a/release/models/interfaces/openconfig-interfaces.yang +++ b/release/models/interfaces/openconfig-interfaces.yang @@ -51,9 +51,16 @@ module openconfig-interfaces { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.0.2"; + oc-ext:openconfig-version "3.5.0"; -revision "2023-02-06" { + revision "2023-07-14" { + description + "Move counters which apply to both interfaces and subinterfaces to + a common grouping. Deprecate physical counters from subinterface"; + reference "3.5.0"; + } + + revision "2023-02-06" { description "Add further specification to interface-ref type to clarify that the interface and subinterface leaves @@ -637,298 +644,365 @@ revision "2023-02-06" { } } - - grouping interface-counters-state { +grouping interface-common-counters-state { description - "Operational state representing interface counters - and statistics."; + "Operational state representing interface counters and statistics + applicable to (physical) interfaces and (logical) subinterfaces."; - //TODO: we may need to break this list of counters into those - //that would appear for physical vs. subinterface or logical - //interfaces. For now, just replicating the full stats - //grouping to both interface and subinterface. + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received on the interface, + including framing characters. - oc-ext:operational; + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - container counters { + leaf in-pkts { + type oc-yang:counter64; description - "A collection of interface-related statistics objects."; + "The total number of packets received on the interface, + including all unicast, multicast, broadcast and bad packets + etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information Base. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-octets { - type oc-yang:counter64; - description - "The total number of octets received on the interface, - including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; - } + leaf in-unicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-pkts { - type oc-yang:counter64; - description - "The total number of packets received on the interface, - including all unicast, multicast, broadcast and bad packets - etc."; - reference - "RFC 2819: Remote Network Monitoring Management Information - Base"; - } + leaf in-broadcast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInBroadcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-unicast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were not addressed to a - multicast or broadcast address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; - } + leaf in-multicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInMulticastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-broadcast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a broadcast - address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInBroadcastPkts"; - } + leaf in-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-multicast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a multicast - address at this sub-layer. For a MAC-layer protocol, - this includes both Group and Functional addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInMulticastPkts"; - } + leaf in-discards { + type oc-yang:counter64; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. - leaf in-discards { - type oc-yang:counter64; - description - "The number of inbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being deliverable to a higher-layer - protocol. One possible reason for discarding such a - packet could be to free up buffer space. + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - reference - "RFC 2863: The Interfaces Group MIB - ifInDiscards"; - } + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets transmitted out of the + interface, including framing characters. - leaf in-errors { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of inbound - packets that contained errors preventing them from being - deliverable to a higher-layer protocol. For character- - oriented or fixed-length interfaces, the number of - inbound transmission units that contained errors - preventing them from being deliverable to a higher-layer - protocol. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInErrors"; - } + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-unknown-protos { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of packets - received via the interface that were discarded because - of an unknown or unsupported protocol. For - character-oriented or fixed-length interfaces that - support protocol multiplexing, the number of - transmission units received via the interface that were - discarded because of an unknown or unsupported protocol. - For any interface that does not support protocol - multiplexing, this counter is not present. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; - } + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of packets transmitted out of the + interface, including all unicast, multicast, broadcast, + and bad packets etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information Base. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-fcs-errors { - type oc-yang:counter64; - description - "Number of received packets which had errors in the - frame check sequence (FCS), i.e., framing errors. + leaf out-unicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - Discontinuities in the value of this counter can occur - when the device is re-initialization as indicated by the - value of 'last-clear'."; - } + leaf out-broadcast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutBroadcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-octets { - type oc-yang:counter64; - description - "The total number of octets transmitted out of the - interface, including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; - } + leaf out-multicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutMulticastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-pkts { - type oc-yang:counter64; - description - "The total number of packets transmitted out of the - interface, including all unicast, multicast, broadcast, - and bad packets etc."; - reference - "RFC 2819: Remote Network Monitoring Management Information - Base"; - } + leaf out-discards { + type oc-yang:counter64; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-unicast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were not addressed - to a multicast or broadcast address at this sub-layer, - including those that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; - } + leaf out-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-broadcast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were addressed to a - broadcast address at this sub-layer, including those - that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutBroadcastPkts"; - } + leaf last-clear { + type oc-types:timeticks64; + description + "Timestamp of the last time the interface counters were + cleared. + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + oc-ext:telemetry-on-change; + } + } - leaf out-multicast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were addressed to a - multicast address at this sub-layer, including those - that were discarded or not sent. For a MAC-layer - protocol, this includes both Group and Functional - addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutMulticastPkts"; - } + grouping interface-counters-state { + description + "Operational state representing interface counters + and statistics."; - leaf out-discards { - type oc-yang:counter64; - description - "The number of outbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being transmitted. One possible reason - for discarding such a packet could be to free up buffer - space. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; - } + oc-ext:operational; - leaf out-errors { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of outbound - packets that could not be transmitted because of errors. - For character-oriented or fixed-length interfaces, the - number of outbound transmission units that could not be - transmitted because of errors. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutErrors"; - } + leaf in-unknown-protos { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } - leaf carrier-transitions { - type oc-yang:counter64; - description - "Number of times the interface state has transitioned - between up and down since the time the device restarted - or the last-clear time, whichever is most recent."; - oc-ext:telemetry-on-change; - } + leaf in-fcs-errors { + type oc-yang:counter64; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. - leaf last-clear { - type oc-types:timeticks64; - description - "Timestamp of the last time the interface counters were - cleared. + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } - The value is the timestamp in nanoseconds relative to - the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; - oc-ext:telemetry-on-change; - } + leaf carrier-transitions { + type oc-yang:counter64; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; + } + } + + grouping subinterfaces-counters-state { + description + "Operational state representing counters unique to subinterfaces"; + + oc-ext:operational; + leaf in-unknown-protos { + type oc-yang:counter64; + status deprecated; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; } + + leaf in-fcs-errors { + type oc-yang:counter64; + status deprecated; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. + + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } + + leaf carrier-transitions { + type oc-yang:counter64; + status deprecated; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; + } + } // data definition statements @@ -1020,7 +1094,15 @@ revision "2023-02-06" { } uses interface-common-state; - uses interface-counters-state; + + container counters { + description + "A collection of interface specific statistics entitites which are + not common to subinterfaces."; + + uses interface-common-counters-state; + uses subinterfaces-counters-state; + } } grouping subinterfaces-top { @@ -1119,7 +1201,15 @@ revision "2023-02-06" { uses interface-phys-config; uses interface-common-state; - uses interface-counters-state; + + container counters { + description + "A collection of interface specific statistics entitites which are + not common to subinterfaces."; + + uses interface-common-counters-state; + uses interface-counters-state; + } } uses interface-phys-holdtime-top; From e84d592563e15abef1b4b80760dd7ef0ebbcccad Mon Sep 17 00:00:00 2001 From: vivek-ilangovan <96305323+vivek-ilangovan@users.noreply.github.com> Date: Thu, 27 Jul 2023 02:29:11 +0530 Subject: [PATCH 019/201] Flex-algo model for IGP (#550) * Add flex-algo model * Associate the flex-algo binding to segment-routing * Add flex-algo-prefix-sids container to sr-igp-interface-top. This will associate flex-algo sid to a prefix * Added new global and interface specific attributes for flex-algo and detach it from TE attributes --- release/models/flex-algo/.spec.yml | 6 + .../models/flex-algo/openconfig-flexalgo.yang | 407 ++++++++++++++++++ .../openconfig-segment-routing.yang | 137 +++++- 3 files changed, 549 insertions(+), 1 deletion(-) create mode 100644 release/models/flex-algo/.spec.yml create mode 100644 release/models/flex-algo/openconfig-flexalgo.yang diff --git a/release/models/flex-algo/.spec.yml b/release/models/flex-algo/.spec.yml new file mode 100644 index 000000000..8b2e4b3ec --- /dev/null +++ b/release/models/flex-algo/.spec.yml @@ -0,0 +1,6 @@ +- name: openconfig-flexalgo + docs: + - yang/flex-algo/openconfig-flexalgo.yang + build: + - yang/flex-algo/openconfig-flexalgo.yang + run-ci: true diff --git a/release/models/flex-algo/openconfig-flexalgo.yang b/release/models/flex-algo/openconfig-flexalgo.yang new file mode 100644 index 000000000..2fd904b86 --- /dev/null +++ b/release/models/flex-algo/openconfig-flexalgo.yang @@ -0,0 +1,407 @@ +module openconfig-flexalgo { + yang-version 1.1; + namespace "http://openconfig.net/yang/flexalgo"; + prefix "oc-flexalgo"; + + import openconfig-network-instance { + prefix "oc-ni"; + } + import openconfig-extensions { + prefix oc-ext; + } + import openconfig-interfaces { + prefix oc-if; + } + oc-ext:openconfig-version "0.1.0"; + + organization + "OpenConfig working group"; + contact + "OpenConfig working group + www.openconfig.net "; + description + "This YANG module defines the configurational and operational + parameters related to IGP Flex-Algorithms"; + + revision 2023-05-24 { + description + "Initial revision of flexalgo module"; + reference + "0.1.0"; + } + + /* Types definitions */ + + typedef flex-algo-metric-type { + type enumeration { + enum IGP { + value 0; + description + "IGP metric to be used during the calculation."; + } + enum MIN_DELAY { + value 1; + description + "Min Unidirectional Link Delay as defined in [RFC7810] to + be used during the calculation."; + } + enum TE_METRIC { + value 2; + description + "TE default metric as defined in [RFC5305] to be used + during the calculation."; + } + } + description + "Type of metric to be used during a Flex Algo path + computation"; + } + + typedef flex-algo-id { + type uint8 { + range "128..255"; + } + description + "Flex-Algorithm identifies which algorithm should be used during + path computation"; + } + + typedef flex-algo-calc-type { + type uint8 { + range "0..127"; + } + default "0"; + description + "Calculation type value ranges from 0 to 127 both inclusive + from the IGP Algorithm Types registry defined under + Interior Gateway Protocol (IGP) + Parameters IANA registries. + If the required calculation type is Shortest Path First, + the value 0 SHOULD appear in this field."; + } + + grouping algorithm-attributes { + description + "All of the possible attributes for an flexible algorithm + definition"; + leaf flex-algo-id { + type flex-algo-id; + mandatory true; + description + "Flex Algorithm Identifier"; + } + leaf flex-algo-name { + type string; + description + "Flexible Algorithm name"; + } + leaf flex-algo-description { + type string; + description + "Description of this flex-algo"; + } + leaf metric-type { + type flex-algo-metric-type; + default "IGP"; + description + "Indicates which is the corresponding metric type for + this algorithm"; + } + leaf calc-type { + type flex-algo-calc-type; + description + "Indicates the calculation type, if advertised"; + } + leaf priority { + type uint8; + default "237"; + description + "Indicates the priority for this algorithm"; + } + + leaf-list exclude { + type leafref { + path "../../../../flex-algo-global-attributes/flex-algo-admin-groups/" + + "admin-group/admin-group-name"; + } + description + "extended-admin-groups to exclude in path calculation."; + } + leaf-list include-all { + type leafref { + path "../../../../flex-algo-global-attributes/flex-algo-admin-groups/" + + "admin-group/admin-group-name"; + } + description + "extended-admin-groups, all of which must be included"; + } + leaf-list include-any { + type leafref { + path "../../../../flex-algo-global-attributes/flex-algo-admin-groups/" + + "admin-group/admin-group-name"; + } + description + "extended-admin-groups, one of which must be included"; + } + leaf-list srlg-exclude { + type leafref { + path "../../../../flex-algo-global-attributes/srlgs/srlg/name"; + } + description + "list of references to named SRLGs to be excluded"; + } + leaf algo-flags { + type boolean; + description + "Advertise flex-algo definition flags"; + } + } + + grouping flex-algo-definition-top { + description + "Top level grouping for flexible Algorithms and their definitions"; + list algorithm { + key "flex-algo-id"; + description + "List of Flexible Algorithms"; + leaf flex-algo-id { + type leafref { + path "../config/flex-algo-id"; + } + description + "Name for a Flexible Algorithm"; + } + container config { + description + "Attributes for a Flexible Algorithm"; + uses algorithm-attributes; + } + container state { + config false; + description + "Attributes for a Flexible Algorithm"; + uses algorithm-attributes; + } + } + } + + grouping flex-algo-interface-attributes-config { + description + "global level definitions for interfaces + on which TE is run"; + + leaf interface-id { + type oc-if:interface-id; + description + "Id of the interface"; + } + + leaf te-metric { + type uint32; + description + "TE specific metric for the link"; + } + + leaf min-delay { + type uint32; + description + "Min delay for the link"; + } + + leaf-list srlg-membership { + type leafref { + path "../../../../flex-algo-global-attributes/srlgs/srlg/name"; + } + description + "list of references to named shared risk link groups that the + interface belongs to."; + } + + leaf-list admin-group { + type leafref { + path "../../../../flex-algo-global-attributes/flex-algo-admin-groups/" + + "admin-group/admin-group-name"; + } + description + "list of admin groups (by name) on the interface"; + } + } + + grouping flex-algo-interface-attributes-top { + description "Top level grouping for flex Algorithm attributes for interfaces"; + + list interface { + key "interface-id"; + description + "List of flex-algo interfaces"; + + leaf interface-id { + type leafref { + path "../config/interface-id"; + } + description + "Reference to the interface id list key"; + } + + container config { + description + "Configuration parameters related to flex-algo interfaces:"; + uses flex-algo-interface-attributes-config; + } + + container state { + config false; + description + "State parameters related to flex-algo interfaces"; + uses flex-algo-interface-attributes-config; + } + } + } + + grouping flex-algo-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"; + } + } + + grouping flex-algo-srlg-top { + description + "Top level grouping for flex algo 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"; + } + description + "The SRLG group identifier"; + } + + container config { + description + "Configuration parameters related to the SRLG"; + uses flex-algo-srlg-config; + } + + container state { + config false; + description + "State parameters related to the SRLG"; + uses flex-algo-srlg-config; + } + } + } + } + + grouping flex-algo-admin-group-config { + description + "configuration data for MPLS link admin groups"; + + leaf admin-group-name { + type string; + description + "name for mpls admin-group"; + } + + leaf bit-position { + type uint32; + description + "bit-position value for mpls admin-group. The value + for the admin group is an integer that represents one + of the bit positions in the admin-group bitmask. Values + between 0 and 31 are interpreted as the original limit + of 32 admin groups. Values >=32 are interpreted as + extended admin group values as per RFC7308."; + } + } + + grouping flex-algo-admin-groups-top { + description + "top-level mpls admin-groups config + and state containers"; + + container flex-algo-admin-groups { + description + "Top-level container for admin-groups configuration + and state"; + + list admin-group { + key "admin-group-name"; + description + "configuration of value to name mapping + for mpls affinities/admin-groups"; + + leaf admin-group-name { + type leafref { + path "../config/admin-group-name"; + } + description + "name for mpls admin-group"; + } + container config { + description + "Configurable items for admin-groups"; + uses flex-algo-admin-group-config; + } + + container state { + config false; + description + "Operational state for admin-groups"; + uses flex-algo-admin-group-config; + } + } + } + } + + grouping flex-algo-top { + description + "Top level grouping for Flexible Algorithm Definitions"; + + container flex-algorithm { + description "Flex Algorithms definitions and the attributes"; + + container flex-algorithm-definition { + description "Flexible Algorithms and their definitions"; + uses flex-algo-definition-top; + } + + container flex-algo-global-attributes { + description "Flexible Algorithm global attributes"; + uses flex-algo-srlg-top; + uses flex-algo-admin-groups-top; + } + + container flex-algo-interface-attributes { + description "Flexible Algorithm attributes for interfaces"; + uses flex-algo-interface-attributes-top; + } + } + } + + augment "/oc-ni:network-instances/oc-ni:network-instance" { + description + "List of Flexible Algorithms and their definitions"; + + uses flex-algo-top; + } +} + diff --git a/release/models/segment-routing/openconfig-segment-routing.yang b/release/models/segment-routing/openconfig-segment-routing.yang index e40e57bda..b88ffb3b7 100644 --- a/release/models/segment-routing/openconfig-segment-routing.yang +++ b/release/models/segment-routing/openconfig-segment-routing.yang @@ -14,6 +14,7 @@ module openconfig-segment-routing { import ietf-yang-types { prefix "yang"; } import openconfig-segment-routing-types { prefix "oc-srt"; } import openconfig-srte-policy { prefix "oc-srte"; } + import openconfig-isis-types { prefix "oc-isis-types"; } // meta organization "OpenConfig working group"; @@ -35,7 +36,13 @@ module openconfig-segment-routing { - SR SID advertisements - instantiated within the relevant IGP. - SR-specific counters - instantied within the relevant dataplane."; - oc-ext:openconfig-version "0.3.2"; + oc-ext:openconfig-version "0.4.0"; + + revision "2023-05-24" { + description + "Add flex-algo model"; + reference "0.4.0"; + } revision "2023-02-06" { description @@ -556,6 +563,36 @@ module openconfig-segment-routing { } } + grouping flex-algo-binding-attributes { + description + "Attributes for Flexible Algorithm bindings"; + leaf flex-algo-id { + type uint8 { + range "128..255"; + } + description + "Flexible Algorithm identifier"; + } + leaf isis-level { + type oc-isis-types:level-type; + default "LEVEL_1_2"; + description + "IS-IS Level associated with this Flex Algorithm"; + } + leaf advertised { + type boolean; + default "false"; + description + "Indicates if the Flex Algorithm definition is advertised by this node"; + } + leaf participate { + type boolean; + default "false"; + description + "Indicates if the node participates in this Flex Algorithm"; + } + } + grouping sr-igp-top { description "Per-instance configuration and state parameters for Segment Routing @@ -579,6 +616,34 @@ module openconfig-segment-routing { IGP instance."; uses sr-igp-config; } + + container flex-algorithm-bindings { + description + "Flex Algorithm bindings"; + list flex-algorithm-binding { + key "flex-algo-id"; + description + "Flex Algorithm binding"; + leaf flex-algo-id { + type leafref { + path "../config/flex-algo-id"; + } + description + "Flex Algorithm identifier used by IGP"; + } + container config { + description + "Attributes of a FAD binding"; + uses flex-algo-binding-attributes; + } + container state { + config false; + description + "Attributes of a FAD binding"; + uses flex-algo-binding-attributes; + } + } + } } } @@ -687,6 +752,32 @@ module openconfig-segment-routing { } } + grouping sr-igp-interface-flex-algo-prefix-sid-config { + description + "Configuration parameters relating to an IGP prefix SID advertisement for + Flexible Algorithms"; + leaf prefix { + type inet:ip-prefix; + description + "The IP prefix for which the IGP prefix SID should be advertised. The + value specified is a local prefix on the interface which is advertised + into the IGP."; + } + leaf flex-algo-id { + type uint8 { + range "128..255"; + } + description + "Flexible Algorithm identifier for the prefix segment."; + } + leaf sid-id { + type oc-srt:sr-sid-type; + description + "The Segment Identifier to be used when advertising the IGP Prefix SID for + the Flexible Algorithm."; + } + } + grouping sr-igp-interface-top { description "Per-interface configuration and operational state relating to an @@ -736,6 +827,50 @@ module openconfig-segment-routing { } } + container flex-algo-prefix-sids { + description + "Configuration and operational state parameters relating to segment + routing flexible algorithm for an interface within the IGP."; + + list flex-algo-prefix-sid { + key "prefix flex-algo-id"; + + description + "IGP prefix segments allocated for Flexible Algorithms"; + + leaf prefix { + type leafref { + path "../config/prefix"; + } + description + "Reference to the prefix for which Flexible Algorithm Prefix SID is to be + advertised."; + } + + leaf flex-algo-id { + type leafref { + path "../config/flex-algo-id"; + } + description + "Reference to the Flexible Algorithm for which Flexible Algorithm Prefix + SID is to be advertised."; + } + + container config { + description + "Configuration parameters for the IGP Flexible Algorithm Prefix SID."; + uses sr-igp-interface-flex-algo-prefix-sid-config; + } + + container state { + config false; + description + "Operational state parameters for the IGP Flexible Algorithm Prefix SID."; + uses sr-igp-interface-flex-algo-prefix-sid-config; + } + } + } + container adjacency-sids { description "Configuration and operational state parameters relating to From ce227e79d030f9aa52747156daf79e99bb16ad15 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Fri, 28 Jul 2023 14:30:43 -0700 Subject: [PATCH 020/201] Revert "Add multicast counters to ip interface, remove physical counters from subinterface (#905)" (#933) This reverts commit e5ce68cb12ed6fe7e06bbd768721965bf3ae974e. --- .../models/interfaces/openconfig-if-ip.yang | 111 +++- .../interfaces/openconfig-interfaces.yang | 622 ++++++++---------- 2 files changed, 369 insertions(+), 364 deletions(-) diff --git a/release/models/interfaces/openconfig-if-ip.yang b/release/models/interfaces/openconfig-if-ip.yang index 90510e9e7..498a90bec 100644 --- a/release/models/interfaces/openconfig-if-ip.yang +++ b/release/models/interfaces/openconfig-if-ip.yang @@ -44,14 +44,7 @@ module openconfig-if-ip { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.5.0"; - - revision "2023-07-14" { - description - "Move counters which apply to both interfaces and subinterfaces to - a common grouping. Deprecate physical counters from subinterface"; - reference "3.5.0"; - } + oc-ext:openconfig-version "3.4.0"; revision "2023-06-30" { description @@ -237,6 +230,42 @@ module openconfig-if-ip { "Packet and byte counters for IP transmission and reception for the address family."; + + leaf in-pkts { + type oc-yang:counter64; + description + "The total number of IP packets received for the specified + address family, including those received in error"; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received in input IP packets + for the specified address family, including those received + in error."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-error-pkts { + // TODO: this counter combines several error conditions -- + // could consider breaking them out to separate leaf nodes + type oc-yang:counter64; + description + "Number of IP packets discarded due to errors for the + specified address family, including errors in the IP + header, no route found to the IP destination, invalid + address, unknown protocol, etc."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + leaf in-forwarded-pkts { type oc-yang:counter64; description @@ -262,6 +291,57 @@ module openconfig-if-ip { Internet Protocol (IP)"; } + leaf in-discarded-pkts { + type oc-yang:counter64; + description + "The number of input IP packets for the + specified address family, for which no problems were + encountered to prevent their continued processing, but + were discarded (e.g., for lack of buffer space)."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of IP packets for the + specified address family that the device supplied + to the lower layers for transmission. This includes + packets generated locally and those forwarded by the + device."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets in IP packets for the + specified address family that the device + supplied to the lower layers for transmission. This + includes packets generated locally and those forwarded by + the device."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-error-pkts { + // TODO: this counter combines several error conditions -- + // could consider breaking them out to separate leaf nodes + type oc-yang:counter64; + description + "Number of IP packets for the specified address family + locally generated and discarded due to errors, including + no route found to the IP destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + leaf out-forwarded-pkts { type oc-yang:counter64; description @@ -283,10 +363,25 @@ module openconfig-if-ip { "RFC 4293 - Management Information Base for the Internet Protocol (IP)"; } + + leaf out-discarded-pkts { + type oc-yang:counter64; + description + "The number of output IP packets for the + specified address family for which no problem was + encountered to prevent their transmission to their + destination, but were discarded (e.g., for lack of + buffer space)."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } } + } + grouping ipv4-global-config { description "Configuration data for IPv4 interfaces across diff --git a/release/models/interfaces/openconfig-interfaces.yang b/release/models/interfaces/openconfig-interfaces.yang index 9517a92ab..7d349a07c 100644 --- a/release/models/interfaces/openconfig-interfaces.yang +++ b/release/models/interfaces/openconfig-interfaces.yang @@ -51,16 +51,9 @@ module openconfig-interfaces { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.5.0"; + oc-ext:openconfig-version "3.0.2"; - revision "2023-07-14" { - description - "Move counters which apply to both interfaces and subinterfaces to - a common grouping. Deprecate physical counters from subinterface"; - reference "3.5.0"; - } - - revision "2023-02-06" { +revision "2023-02-06" { description "Add further specification to interface-ref type to clarify that the interface and subinterface leaves @@ -644,365 +637,298 @@ module openconfig-interfaces { } } -grouping interface-common-counters-state { - description - "Operational state representing interface counters and statistics - applicable to (physical) interfaces and (logical) subinterfaces."; - - leaf in-octets { - type oc-yang:counter64; - description - "The total number of octets received on the interface, - including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInOctets. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } - - leaf in-pkts { - type oc-yang:counter64; - description - "The total number of packets received on the interface, - including all unicast, multicast, broadcast and bad packets - etc."; - reference - "RFC 2819: Remote Network Monitoring Management Information Base. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } - - leaf in-unicast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were not addressed to a - multicast or broadcast address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } - leaf in-broadcast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a broadcast - address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInBroadcastPkts. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + grouping interface-counters-state { + description + "Operational state representing interface counters + and statistics."; - leaf in-multicast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a multicast - address at this sub-layer. For a MAC-layer protocol, - this includes both Group and Functional addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInMulticastPkts. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + //TODO: we may need to break this list of counters into those + //that would appear for physical vs. subinterface or logical + //interfaces. For now, just replicating the full stats + //grouping to both interface and subinterface. - leaf in-errors { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of inbound - packets that contained errors preventing them from being - deliverable to a higher-layer protocol. For character- - oriented or fixed-length interfaces, the number of - inbound transmission units that contained errors - preventing them from being deliverable to a higher-layer - protocol. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInErrors. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + oc-ext:operational; - leaf in-discards { - type oc-yang:counter64; + container counters { description - "The number of inbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being deliverable to a higher-layer - protocol. One possible reason for discarding such a - packet could be to free up buffer space. + "A collection of interface-related statistics objects."; - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received on the interface, + including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; + } + leaf in-pkts { + type oc-yang:counter64; + description + "The total number of packets received on the interface, + including all unicast, multicast, broadcast and bad packets + etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information + Base"; + } - reference - "RFC 2863: The Interfaces Group MIB - ifInDiscards. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + leaf in-unicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; + } - leaf out-octets { - type oc-yang:counter64; - description - "The total number of octets transmitted out of the - interface, including framing characters. + leaf in-broadcast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInBroadcastPkts"; + } - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutOctets. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + leaf in-multicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInMulticastPkts"; + } - leaf out-pkts { - type oc-yang:counter64; - description - "The total number of packets transmitted out of the - interface, including all unicast, multicast, broadcast, - and bad packets etc."; - reference - "RFC 2819: Remote Network Monitoring Management Information Base. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + leaf in-discards { + type oc-yang:counter64; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. - leaf out-unicast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were not addressed - to a multicast or broadcast address at this sub-layer, - including those that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; - leaf out-broadcast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were addressed to a - broadcast address at this sub-layer, including those - that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutBroadcastPkts. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } - leaf out-multicast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were addressed to a - multicast address at this sub-layer, including those - that were discarded or not sent. For a MAC-layer - protocol, this includes both Group and Functional - addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutMulticastPkts. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards"; + } - leaf out-discards { - type oc-yang:counter64; - description - "The number of outbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being transmitted. One possible reason - for discarding such a packet could be to free up buffer - space. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutDiscards. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + leaf in-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors"; + } - leaf out-errors { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of outbound - packets that could not be transmitted because of errors. - For character-oriented or fixed-length interfaces, the - number of outbound transmission units that could not be - transmitted because of errors. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutErrors. - RFC 4293: Management Information Base for the - Internet Protocol (IP)."; - } + leaf in-unknown-protos { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } - leaf last-clear { - type oc-types:timeticks64; - description - "Timestamp of the last time the interface counters were - cleared. + leaf in-fcs-errors { + type oc-yang:counter64; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. - The value is the timestamp in nanoseconds relative to - the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; - oc-ext:telemetry-on-change; - } - } + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } - grouping interface-counters-state { - description - "Operational state representing interface counters - and statistics."; + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets transmitted out of the + interface, including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; + } - oc-ext:operational; + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of packets transmitted out of the + interface, including all unicast, multicast, broadcast, + and bad packets etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information + Base"; + } - leaf in-unknown-protos { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of packets - received via the interface that were discarded because - of an unknown or unsupported protocol. For - character-oriented or fixed-length interfaces that - support protocol multiplexing, the number of - transmission units received via the interface that were - discarded because of an unknown or unsupported protocol. - For any interface that does not support protocol - multiplexing, this counter is not present. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; - } + leaf out-unicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; + } - leaf in-fcs-errors { - type oc-yang:counter64; - description - "Number of received packets which had errors in the - frame check sequence (FCS), i.e., framing errors. + leaf out-broadcast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutBroadcastPkts"; + } - Discontinuities in the value of this counter can occur - when the device is re-initialization as indicated by the - value of 'last-clear'."; - } - leaf carrier-transitions { - type oc-yang:counter64; - description - "Number of times the interface state has transitioned - between up and down since the time the device restarted - or the last-clear time, whichever is most recent."; - oc-ext:telemetry-on-change; - } - } + leaf out-multicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutMulticastPkts"; + } - grouping subinterfaces-counters-state { - description - "Operational state representing counters unique to subinterfaces"; + leaf out-discards { + type oc-yang:counter64; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; + } - oc-ext:operational; - leaf in-unknown-protos { - type oc-yang:counter64; - status deprecated; - description - "For packet-oriented interfaces, the number of packets - received via the interface that were discarded because - of an unknown or unsupported protocol. For - character-oriented or fixed-length interfaces that - support protocol multiplexing, the number of - transmission units received via the interface that were - discarded because of an unknown or unsupported protocol. - For any interface that does not support protocol - multiplexing, this counter is not present. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; - } + leaf out-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors"; + } - leaf in-fcs-errors { - type oc-yang:counter64; - status deprecated; - description - "Number of received packets which had errors in the - frame check sequence (FCS), i.e., framing errors. + leaf carrier-transitions { + type oc-yang:counter64; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; + } - Discontinuities in the value of this counter can occur - when the device is re-initialization as indicated by the - value of 'last-clear'."; - } + leaf last-clear { + type oc-types:timeticks64; + description + "Timestamp of the last time the interface counters were + cleared. - leaf carrier-transitions { - type oc-yang:counter64; - status deprecated; - description - "Number of times the interface state has transitioned - between up and down since the time the device restarted - or the last-clear time, whichever is most recent."; - oc-ext:telemetry-on-change; + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + oc-ext:telemetry-on-change; + } } - } // data definition statements @@ -1094,15 +1020,7 @@ grouping interface-common-counters-state { } uses interface-common-state; - - container counters { - description - "A collection of interface specific statistics entitites which are - not common to subinterfaces."; - - uses interface-common-counters-state; - uses subinterfaces-counters-state; - } + uses interface-counters-state; } grouping subinterfaces-top { @@ -1201,15 +1119,7 @@ grouping interface-common-counters-state { uses interface-phys-config; uses interface-common-state; - - container counters { - description - "A collection of interface specific statistics entitites which are - not common to subinterfaces."; - - uses interface-common-counters-state; - uses interface-counters-state; - } + uses interface-counters-state; } uses interface-phys-holdtime-top; From 293774ea6f0f73e722991e0dc2e1b107af9bc14d Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 1 Aug 2023 12:53:22 -0700 Subject: [PATCH 021/201] Test CI --- cloudbuild.yaml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 88148e530..8e0eb834c 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,8 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - branch=$(git tag -l 'v10.*' | sort -V | tail -1) + #branch=$(git tag -l 'v10.*' | sort -V | tail -1) + branch=fail-at-generator-pull git checkout $branch volumes: - name: 'ssh' @@ -213,16 +214,6 @@ steps: id: 'oc-pyang' ############### GOYANG/YGOT ############### -- name: 'golang' - entrypoint: 'go' - args: ['install', 'github.com/openconfig/ygot/generator@latest'] - volumes: - - name: 'gopath' - path: /go - env: - - 'GOPATH=/go' - waitFor: ['go path creation'] - id: 'goyang-ygot prep' - name: 'us-west1-docker.pkg.dev/$PROJECT_ID/models-ci/models-ci-image' entrypoint: 'bash' args: ['-c', "/go/src/github.com/openconfig/models-ci/validators/goyang-ygot/test.sh"] @@ -237,7 +228,7 @@ steps: - 'COMMIT_SHA=$COMMIT_SHA' - '_REPO_SLUG=$_REPO_SLUG' - 'BRANCH_NAME=$BRANCH_NAME' - waitFor: ['validator prep', 'goyang-ygot prep', 'oc-pyang'] + waitFor: ['validator prep', 'go path creation', 'oc-pyang'] id: 'goyang-ygot' ############### PYANG ############### From 502f9946bde83d6cbe95244469898dce23dba4b9 Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 1 Aug 2023 13:10:29 -0700 Subject: [PATCH 022/201] Trigger Build From ec4a4ef1673e5a6676eaec42bcc880c5f95b3cd8 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:10:50 -0700 Subject: [PATCH 023/201] Try diff script --- .github/workflows/diff.yaml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/diff.yaml diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml new file mode 100644 index 000000000..fcbd08665 --- /dev/null +++ b/.github/workflows/diff.yaml @@ -0,0 +1,29 @@ +name: OpenConfig YANG Diff + +on: + pull_request: + branches: [ master ] + +jobs: + build: + name: Backward Incompatibility Check + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Make sure all backward-incompatible changes are covered by version changes. + run: | + readonly HEAD=${{ github.event.pull_request.head.sha }} + readonly BASE="$(git merge-base origin/main "${HEAD}")" + + BASEREPODIR=public_base + git clone "git@github.com:public.git" "${BASEREPODIR}" --branch "${BASE}" + oldroot="${BASEREPODIR}" + newroot=. + oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') + newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') + + go install github.com/openconfig/models-ci@diff-cli + models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" From 291f74ea88a0d132359b469cc0709d436246a8ed Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:11:44 -0700 Subject: [PATCH 024/201] try --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index fcbd08665..20ac34339 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -19,7 +19,7 @@ jobs: readonly BASE="$(git merge-base origin/main "${HEAD}")" BASEREPODIR=public_base - git clone "git@github.com:public.git" "${BASEREPODIR}" --branch "${BASE}" + git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" --branch "${BASE}" oldroot="${BASEREPODIR}" newroot=. oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') From aaf661b9b07f30a3402f254d4150298d03d81ed4 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:13:53 -0700 Subject: [PATCH 025/201] Debug --- .github/workflows/diff.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 20ac34339..02306c71a 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -17,6 +17,8 @@ jobs: run: | readonly HEAD=${{ github.event.pull_request.head.sha }} readonly BASE="$(git merge-base origin/main "${HEAD}")" + echo $HEAD + echo $BASE BASEREPODIR=public_base git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" --branch "${BASE}" From f5ea3ac9812c64dec4e56179c08dc3fafde23729 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:14:47 -0700 Subject: [PATCH 026/201] Debug --- .github/workflows/diff.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 02306c71a..134de3787 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -17,8 +17,8 @@ jobs: run: | readonly HEAD=${{ github.event.pull_request.head.sha }} readonly BASE="$(git merge-base origin/main "${HEAD}")" - echo $HEAD - echo $BASE + echo "HEAD is $HEAD" + echo "BASE is $BASE" BASEREPODIR=public_base git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" --branch "${BASE}" From 0de612907df0995166f23955d9ddafbc472f8028 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:17:20 -0700 Subject: [PATCH 027/201] Debug --- .github/workflows/diff.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 134de3787..266e67aff 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -11,14 +11,14 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v3 + with: + fetch-depth: 0 - name: Make sure all backward-incompatible changes are covered by version changes. run: | readonly HEAD=${{ github.event.pull_request.head.sha }} readonly BASE="$(git merge-base origin/main "${HEAD}")" - echo "HEAD is $HEAD" - echo "BASE is $BASE" BASEREPODIR=public_base git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" --branch "${BASE}" From 9b15f0763d2eab33304349be99c2dacb3cbc8af3 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:18:31 -0700 Subject: [PATCH 028/201] Debug --- .github/workflows/diff.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 266e67aff..5ba395ecc 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -10,6 +10,11 @@ jobs: runs-on: ubuntu-latest steps: + - name: Install go + uses: actions/setup-go@v2 + with: + go-version: '1.20' + - name: Check out code uses: actions/checkout@v3 with: From 913be2c47ead2b494cf2404234114cd223b52bfa Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:18:48 -0700 Subject: [PATCH 029/201] Debug --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 5ba395ecc..c8bfcd77e 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -23,7 +23,7 @@ jobs: - name: Make sure all backward-incompatible changes are covered by version changes. run: | readonly HEAD=${{ github.event.pull_request.head.sha }} - readonly BASE="$(git merge-base origin/main "${HEAD}")" + readonly BASE="$(git merge-base origin/master "${HEAD}")" BASEREPODIR=public_base git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" --branch "${BASE}" From 3a4766ae1dd8a4eadc4812c9ed6e4b433170cbc0 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:21:45 -0700 Subject: [PATCH 030/201] Debug --- .github/workflows/diff.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index c8bfcd77e..d32a59697 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -26,7 +26,10 @@ jobs: readonly BASE="$(git merge-base origin/master "${HEAD}")" BASEREPODIR=public_base - git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" --branch "${BASE}" + git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" + cd "${BASEREPODIR}" + git checkout "${BASE}" + cd .. oldroot="${BASEREPODIR}" newroot=. oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') From fd6309a2d3d9be49187036e86c458fd8728f75ec Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:23:35 -0700 Subject: [PATCH 031/201] Debug --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index d32a59697..a4b5ac2a4 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -35,5 +35,5 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - go install github.com/openconfig/models-ci@diff-cli + go install github.com/openconfig/models-ci@fca2350 models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" From 40f20640e1fa2be30315ce749616452fda9a00aa Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:35:41 -0700 Subject: [PATCH 032/201] Debug --- .github/workflows/diff.yaml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index a4b5ac2a4..ba052b0a5 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -26,10 +26,13 @@ jobs: readonly BASE="$(git merge-base origin/master "${HEAD}")" BASEREPODIR=public_base - git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" - cd "${BASEREPODIR}" + #git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" + #cd "${BASEREPODIR}" + mkdir "${BASEREPODIR}" git checkout "${BASE}" - cd .. + cp release/models third_party "${BASEREPODIR}" + git checkout "${HEAD}" + #cd .. oldroot="${BASEREPODIR}" newroot=. oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') From 8ee9284f1b29c70b98e53670bde9411ad124f692 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:36:13 -0700 Subject: [PATCH 033/201] Debug --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index ba052b0a5..046fffefd 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -30,7 +30,7 @@ jobs: #cd "${BASEREPODIR}" mkdir "${BASEREPODIR}" git checkout "${BASE}" - cp release/models third_party "${BASEREPODIR}" + cp -r release/models third_party "${BASEREPODIR}" git checkout "${HEAD}" #cd .. oldroot="${BASEREPODIR}" From 1a1de47b6f003e761bf78d57319ff1c13e0a060d Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:37:17 -0700 Subject: [PATCH 034/201] Debug --- .github/workflows/diff.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 046fffefd..10f4bdf8b 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -30,7 +30,8 @@ jobs: #cd "${BASEREPODIR}" mkdir "${BASEREPODIR}" git checkout "${BASE}" - cp -r release/models third_party "${BASEREPODIR}" + cp -r release/models "${BASEREPODIR}/release" + cp -r third_party "${BASEREPODIR}" git checkout "${HEAD}" #cd .. oldroot="${BASEREPODIR}" From fa46e18747346192a2b546d867c20ad74de861a5 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:39:12 -0700 Subject: [PATCH 035/201] Remove a leaf without updating major version --- release/models/acl/openconfig-acl.yang | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 6b3977907..03d09c1bb 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.3"; + oc-ext:openconfig-version "1.3.4"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.3"; + reference "1.3.4"; } revision "2023-01-29" { @@ -293,16 +293,16 @@ module openconfig-acl { must be specified for each ACL entry"; } - leaf log-action { - type identityref { - base LOG_ACTION; - } - default LOG_NONE; - description - "Specifies the log action and destination for - matched packets. The default is not to log the - packet."; - } + //leaf log-action { + // type identityref { + // base LOG_ACTION; + // } + // default LOG_NONE; + // description + // "Specifies the log action and destination for + // matched packets. The default is not to log the + // packet."; + //} } From 5ce9702bf0dfe33a1e55671e46c431ca7456d94e Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:41:45 -0700 Subject: [PATCH 036/201] Remove a leaf without updating major version --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 10f4bdf8b..264e3b8d6 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -28,7 +28,7 @@ jobs: BASEREPODIR=public_base #git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" #cd "${BASEREPODIR}" - mkdir "${BASEREPODIR}" + mkdir -p "${BASEREPODIR}/release" git checkout "${BASE}" cp -r release/models "${BASEREPODIR}/release" cp -r third_party "${BASEREPODIR}" From 9089ca47f6bb83bd331a9919eb901a06bc8d90c9 Mon Sep 17 00:00:00 2001 From: wenovus Date: Wed, 2 Aug 2023 13:42:49 -0700 Subject: [PATCH 037/201] Now update major version --- release/models/acl/openconfig-acl.yang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 03d09c1bb..b8d557367 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.4"; + oc-ext:openconfig-version "2.0.0"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.4"; + reference "2.0.0"; } revision "2023-01-29" { From 74738929acfd3981b09512d0d4d7f6cff07fc402 Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Wed, 2 Aug 2023 17:00:16 -0700 Subject: [PATCH 038/201] Update openconfig-network-instance-policy.yang (#925) * Clarify `/routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-protocol-instance/config/protocol-name` --- .../openconfig-network-instance-policy.yang | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/release/models/network-instance/openconfig-network-instance-policy.yang b/release/models/network-instance/openconfig-network-instance-policy.yang index a2897dcbd..d72e8f008 100644 --- a/release/models/network-instance/openconfig-network-instance-policy.yang +++ b/release/models/network-instance/openconfig-network-instance-policy.yang @@ -25,9 +25,16 @@ module openconfig-network-instance-policy { actions) for the network instance model. These statements are generally added to the routing policy model."; - oc-ext:openconfig-version "0.1.1"; + oc-ext:openconfig-version "0.1.2"; - revision "2018-11-21" { + revision "2023-07-25" { + description + "Expand description of + match-protocol-instance/protocol-name."; + reference "0.1.2"; + } + +revision "2018-11-21" { description "Add OpenConfig module metadata extensions."; reference "0.1.1"; @@ -64,7 +71,11 @@ module openconfig-network-instance-policy { type string; description "The name of the protocol instance to match - on in the local network instance"; + on in the local network instance. The string + must match one of /network-instances/ + network-instance/protocols/ + protocol/identifier in the local network + instance."; } } From 65dc8af1b51c33ad974267bbbf696c3b89c872e4 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:40:50 -0700 Subject: [PATCH 039/201] Revert YANG changes --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 264e3b8d6..b1303fcf9 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -39,5 +39,5 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - go install github.com/openconfig/models-ci@fca2350 + go install github.com/openconfig/models-ci@94a63b5 models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" From f00518c30a34e9acbe4faf94301bde6c0cd7cf8d Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:42:51 -0700 Subject: [PATCH 040/201] now test just minor version increment again --- release/models/acl/openconfig-acl.yang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index b8d557367..03d09c1bb 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "2.0.0"; + oc-ext:openconfig-version "1.3.4"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "2.0.0"; + reference "1.3.4"; } revision "2023-01-29" { From 77b0dae76856b0dcc25ad4505b3efd970450c156 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:47:18 -0700 Subject: [PATCH 041/201] Remove useless output --- .github/workflows/diff.yaml | 5 +---- release/models/acl/openconfig-acl.yang | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index b1303fcf9..3270afb71 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -26,18 +26,15 @@ jobs: readonly BASE="$(git merge-base origin/master "${HEAD}")" BASEREPODIR=public_base - #git clone "https://github.com/openconfig/public.git" "${BASEREPODIR}" - #cd "${BASEREPODIR}" mkdir -p "${BASEREPODIR}/release" git checkout "${BASE}" cp -r release/models "${BASEREPODIR}/release" cp -r third_party "${BASEREPODIR}" git checkout "${HEAD}" - #cd .. oldroot="${BASEREPODIR}" newroot=. oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - go install github.com/openconfig/models-ci@94a63b5 + go install github.com/openconfig/models-ci@94a63b5 > /dev/null models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 03d09c1bb..6b3977907 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.4"; + oc-ext:openconfig-version "1.3.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.4"; + reference "1.3.3"; } revision "2023-01-29" { @@ -293,16 +293,16 @@ module openconfig-acl { must be specified for each ACL entry"; } - //leaf log-action { - // type identityref { - // base LOG_ACTION; - // } - // default LOG_NONE; - // description - // "Specifies the log action and destination for - // matched packets. The default is not to log the - // packet."; - //} + leaf log-action { + type identityref { + base LOG_ACTION; + } + default LOG_NONE; + description + "Specifies the log action and destination for + matched packets. The default is not to log the + packet."; + } } From 03381398be7e0434cebecab691f8f816fc317933 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:51:20 -0700 Subject: [PATCH 042/201] Test --- .github/workflows/diff.yaml | 2 +- release/models/acl/openconfig-acl.yang | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 3270afb71..bea6c452f 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -36,5 +36,5 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - go install github.com/openconfig/models-ci@94a63b5 > /dev/null + go install github.com/openconfig/models-ci@94a63b5 &> /dev/null models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 6b3977907..03d09c1bb 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.3"; + oc-ext:openconfig-version "1.3.4"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.3"; + reference "1.3.4"; } revision "2023-01-29" { @@ -293,16 +293,16 @@ module openconfig-acl { must be specified for each ACL entry"; } - leaf log-action { - type identityref { - base LOG_ACTION; - } - default LOG_NONE; - description - "Specifies the log action and destination for - matched packets. The default is not to log the - packet."; - } + //leaf log-action { + // type identityref { + // base LOG_ACTION; + // } + // default LOG_NONE; + // description + // "Specifies the log action and destination for + // matched packets. The default is not to log the + // packet."; + //} } From be0fb1a8f0f9f473e90ec103bb345eee1ffe6324 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:52:46 -0700 Subject: [PATCH 043/201] Test --- .github/workflows/diff.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index bea6c452f..3c5de2a90 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -36,5 +36,8 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - go install github.com/openconfig/models-ci@94a63b5 &> /dev/null + go install github.com/openconfig/models-ci@94a63b5 + + - name: Make sure all backward-incompatible changes are covered by version changes. + run: | models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" From 276f2522f1d9620fadcaa666de1fa9cad931fe74 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:54:08 -0700 Subject: [PATCH 044/201] Test --- .github/workflows/diff.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 3c5de2a90..f347763fe 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -20,6 +20,10 @@ jobs: with: fetch-depth: 0 + - name: Install models-ci + run: | + go install github.com/openconfig/models-ci@94a63b5 + - name: Make sure all backward-incompatible changes are covered by version changes. run: | readonly HEAD=${{ github.event.pull_request.head.sha }} @@ -36,8 +40,4 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - go install github.com/openconfig/models-ci@94a63b5 - - - name: Make sure all backward-incompatible changes are covered by version changes. - run: | models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" From f8a1c31697f47661d55e5539b6202c57b7316ab3 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:55:19 -0700 Subject: [PATCH 045/201] Test --- .github/workflows/diff.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index f347763fe..1b83577bb 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -20,7 +20,7 @@ jobs: with: fetch-depth: 0 - - name: Install models-ci + - name: Install models-ci CLI run: | go install github.com/openconfig/models-ci@94a63b5 @@ -40,4 +40,5 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') + echo "-----------------------------" models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" From fc2edf2cf6df700e3c4a08f517cbafbca2a11156 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:56:38 -0700 Subject: [PATCH 046/201] Test --- .github/workflows/diff.yaml | 1 + release/models/acl/openconfig-acl.yang | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 1b83577bb..a5bc6247a 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -42,3 +42,4 @@ jobs: echo "-----------------------------" models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" + echo "-----------------------------" diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 03d09c1bb..6b3977907 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.4"; + oc-ext:openconfig-version "1.3.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.4"; + reference "1.3.3"; } revision "2023-01-29" { @@ -293,16 +293,16 @@ module openconfig-acl { must be specified for each ACL entry"; } - //leaf log-action { - // type identityref { - // base LOG_ACTION; - // } - // default LOG_NONE; - // description - // "Specifies the log action and destination for - // matched packets. The default is not to log the - // packet."; - //} + leaf log-action { + type identityref { + base LOG_ACTION; + } + default LOG_NONE; + description + "Specifies the log action and destination for + matched packets. The default is not to log the + packet."; + } } From 7b1da0f065e082b0837050e46bcb7b1ba6b76bc4 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:58:32 -0700 Subject: [PATCH 047/201] Test --- .github/workflows/diff.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index a5bc6247a..0da972a3e 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install models-ci CLI run: | - go install github.com/openconfig/models-ci@94a63b5 + go install github.com/openconfig/models-ci@15b19a4 - name: Make sure all backward-incompatible changes are covered by version changes. run: | @@ -40,6 +40,4 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - echo "-----------------------------" models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" - echo "-----------------------------" From 5c3a0bde0bdd5afef5cf964c809b77f158cc7ef4 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 10:58:54 -0700 Subject: [PATCH 048/201] Test --- release/models/acl/openconfig-acl.yang | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 6b3977907..03d09c1bb 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.3"; + oc-ext:openconfig-version "1.3.4"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.3"; + reference "1.3.4"; } revision "2023-01-29" { @@ -293,16 +293,16 @@ module openconfig-acl { must be specified for each ACL entry"; } - leaf log-action { - type identityref { - base LOG_ACTION; - } - default LOG_NONE; - description - "Specifies the log action and destination for - matched packets. The default is not to log the - packet."; - } + //leaf log-action { + // type identityref { + // base LOG_ACTION; + // } + // default LOG_NONE; + // description + // "Specifies the log action and destination for + // matched packets. The default is not to log the + // packet."; + //} } From a5be467bcdef2cb777cce65b01b548f4f12c69b0 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 11:19:41 -0700 Subject: [PATCH 049/201] Test comment --- .github/workflows/diff.yaml | 14 ++++++++++++++ release/models/acl/openconfig-acl.yang | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 0da972a3e..0c3fe26a6 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -41,3 +41,17 @@ jobs: newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" + + leafchanges=$(models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}") + echo "{leafchanges}={${leafchanges}}" >> "$GITHUB_ENV" + + - name: Post comment listing YANG leaf changes + uses: actions/github-script@v6 + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: "${{ env.leafchanges }}" + }) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 03d09c1bb..b8d557367 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.4"; + oc-ext:openconfig-version "2.0.0"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.4"; + reference "2.0.0"; } revision "2023-01-29" { From 419a681f08f122c6955998552fa16e373a2beffa Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 11:21:13 -0700 Subject: [PATCH 050/201] Test comment --- .github/workflows/diff.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 0c3fe26a6..b5fa5ec6c 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -45,13 +45,13 @@ jobs: leafchanges=$(models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}") echo "{leafchanges}={${leafchanges}}" >> "$GITHUB_ENV" - - name: Post comment listing YANG leaf changes - uses: actions/github-script@v6 - with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: "${{ env.leafchanges }}" - }) + - name: Post comment listing YANG leaf changes + uses: actions/github-script@v6 + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: "${{ env.leafchanges }}" + }) From 6fbad9795f28f0b84cfe2af78ac1c4460e121842 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 11:22:37 -0700 Subject: [PATCH 051/201] Test comment --- .github/workflows/diff.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index b5fa5ec6c..2381fdbf7 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -43,15 +43,15 @@ jobs: models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" leafchanges=$(models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}") - echo "{leafchanges}={${leafchanges}}" >> "$GITHUB_ENV" - - - name: Post comment listing YANG leaf changes - uses: actions/github-script@v6 - with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: "${{ env.leafchanges }}" - }) + echo "{leafchanges}={${leafchanges}}" >> "$GITHUB_ENV" + + - name: Post comment listing YANG leaf changes + uses: actions/github-script@v6 + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: "${{ env.leafchanges }}" + }) From 86559cde48ff4ca02523b9bc9bc91d993f1b2072 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 11:28:16 -0700 Subject: [PATCH 052/201] Test comment --- .github/workflows/diff.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 2381fdbf7..6d8ca1e69 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -42,8 +42,10 @@ jobs: models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" - leafchanges=$(models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}") - echo "{leafchanges}={${leafchanges}}" >> "$GITHUB_ENV" + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + echo "leafchanges<<$EOF" >> "$GITHUB_ENV" + models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" + echo "$EOF" >> "$GITHUB_ENV" - name: Post comment listing YANG leaf changes uses: actions/github-script@v6 From bf49e173d819e0209e3cc318647b845d2cb90efd Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 11:33:09 -0700 Subject: [PATCH 053/201] Test comment --- .github/workflows/diff.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 6d8ca1e69..086ce8d5c 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -55,5 +55,6 @@ jobs: issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: "${{ env.leafchanges }}" + #body: "${{ env.leafchanges }}" + body: "Just a test" }) From c19d317aef747c4e8c5576b5cf6dd4c750bcfea3 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 11:34:32 -0700 Subject: [PATCH 054/201] Test comment --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 086ce8d5c..ea6fb1f6f 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -46,6 +46,7 @@ jobs: echo "leafchanges<<$EOF" >> "$GITHUB_ENV" models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" echo "$EOF" >> "$GITHUB_ENV" + #body: "${{ env.leafchanges }}" - name: Post comment listing YANG leaf changes uses: actions/github-script@v6 @@ -55,6 +56,5 @@ jobs: issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - #body: "${{ env.leafchanges }}" body: "Just a test" }) From 60469ec1dc9a31cf463069369652316f715cc8c0 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 11:58:30 -0700 Subject: [PATCH 055/201] Test comment --- .github/workflows/diff.yaml | 30 +++++++++++++++++--------- release/models/acl/openconfig-acl.yang | 8 +++---- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index ea6fb1f6f..1c822abed 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,9 +22,10 @@ jobs: - name: Install models-ci CLI run: | - go install github.com/openconfig/models-ci@15b19a4 + go install github.com/openconfig/models-ci/openconfig-ci@65fa792 - name: Make sure all backward-incompatible changes are covered by version changes. + id: check run: | readonly HEAD=${{ github.event.pull_request.head.sha }} readonly BASE="$(git merge-base origin/master "${HEAD}")" @@ -42,19 +43,28 @@ jobs: models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" + #echo "-----------List of all YANG node changes-----------" >> "$GITHUB_OUTPUT" + #models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_OUTPUT" EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" echo "$EOF" >> "$GITHUB_ENV" #body: "${{ env.leafchanges }}" - - name: Post comment listing YANG leaf changes - uses: actions/github-script@v6 + - name: Find Comment + uses: peter-evans/find-comment@v2 + id: fc with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: "Just a test" - }) + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: -----------List of all YANG node changes----------- + + - name: Create or update comment + uses: peter-evans/create-or-update-comment@v3 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + -----------List of all YANG node changes----------- + ${{ env.leafchanges }} + edit-mode: replace diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index b8d557367..78a540718 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "2.0.0"; + oc-ext:openconfig-version "1.4.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "2.0.0"; + reference "1.4.3"; } revision "2023-01-29" { @@ -284,9 +284,7 @@ module openconfig-acl { leaf forwarding-action { - type identityref { - base FORWARDING_ACTION; - } + type string; mandatory true; description "Specifies the forwarding action. One forwarding action From 1890815ca004049c6332de96f518ff586b08cb3f Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 12:00:50 -0700 Subject: [PATCH 056/201] Test comment --- .github/workflows/diff.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 1c822abed..b6dcea44a 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -8,6 +8,7 @@ jobs: build: name: Backward Incompatibility Check runs-on: ubuntu-latest + continue-on-error: true steps: - name: Install go @@ -20,7 +21,7 @@ jobs: with: fetch-depth: 0 - - name: Install models-ci CLI + - name: Install openconfig-ci CLI run: | go install github.com/openconfig/models-ci/openconfig-ci@65fa792 @@ -41,13 +42,13 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - models-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" + openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" #echo "-----------List of all YANG node changes-----------" >> "$GITHUB_OUTPUT" - #models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_OUTPUT" + #openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_OUTPUT" EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" - models-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" + openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" echo "$EOF" >> "$GITHUB_ENV" #body: "${{ env.leafchanges }}" From 33f5349a91af973cabaa6d08625e73ea4917b5c8 Mon Sep 17 00:00:00 2001 From: Leon Wang Date: Thu, 3 Aug 2023 12:10:02 -0700 Subject: [PATCH 057/201] Add support for QSFP56 and QSFP56_DD form factor identities (#564) Add QSFP56_DD and QSFP56 form-factor identities --- .../openconfig-transport-types.yang | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index 4eecd6b53..0818d2d35 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,14 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.19.0"; + oc-ext:openconfig-version "0.20.0"; + + revision "2023-08-03" { + description + "Add QSFP56 and QSFP56_DD form factor identities and + deprecated QSFP56_DD_TYPE1 and QSFP56_DD_TYPE2 form factor identities."; + reference "0.20.0"; + } revision "2023-07-24" { description @@ -824,8 +831,25 @@ module openconfig-transport-types { channels"; } + identity QSFP56 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "QSFP pluggable optic with support for up to 4x56G physical + channels"; + } + + identity QSFP56_DD { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "QSFP-DD electrical interfaces will employ 8 lanes that operate up to + 25 Gbps NRZ modulation or 50 Gbps PAM4 modulation, providing + solutions up to 200 Gbps or 400 Gbps aggregate"; + reference "http://qsfp-dd.com"; + } + identity QSFP56_DD_TYPE1 { base TRANSCEIVER_FORM_FACTOR_TYPE; + status deprecated; description "QSFP DD pluggable optic with support for up to 8x56G physical channels. Type 1 uses eight optical and electrical signals."; @@ -833,6 +857,7 @@ module openconfig-transport-types { identity QSFP56_DD_TYPE2 { base TRANSCEIVER_FORM_FACTOR_TYPE; + status deprecated; description "QSFP DD pluggable optic with support for up to 4x112G physical channels. Type 2 uses four optical and eight electrical @@ -876,7 +901,7 @@ module openconfig-transport-types { identity SFP_DD { base TRANSCEIVER_FORM_FACTOR_TYPE; description - "SFP-DD electrical interfaces will employ 2 lanes that operate up + "SFP-DD electrical interfaces will employ 2 lanes that operate up to 25 Gbps NRZ modulation or 56 Gbps PAM4 modulation, providing solutions up to 50 Gbps or 112 Gbps PAM4 aggregate"; reference "http://sfp-dd.com"; From dcefed0c2d0eb9ac277f7c920a70f94186ae8805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20de=20Dios?= Date: Thu, 3 Aug 2023 21:11:06 +0200 Subject: [PATCH 058/201] Move ethernet segments to top-level container (EVPN) (#768) * Move Ethernet segments to top-level container --- release/models/ethernet-segments/.spec.yml | 6 + .../openconfig-ethernet-segments.yang | 250 ++++++++++++++++++ .../network-instance/openconfig-evpn.yang | 219 +-------------- .../openconfig-network-instance-l2.yang | 9 +- .../openconfig-network-instance.yang | 10 +- 5 files changed, 279 insertions(+), 215 deletions(-) create mode 100644 release/models/ethernet-segments/.spec.yml create mode 100644 release/models/ethernet-segments/openconfig-ethernet-segments.yang diff --git a/release/models/ethernet-segments/.spec.yml b/release/models/ethernet-segments/.spec.yml new file mode 100644 index 000000000..f41f4ff79 --- /dev/null +++ b/release/models/ethernet-segments/.spec.yml @@ -0,0 +1,6 @@ +- name: openconfig-ethernet-segments + docs: + - yang/ethernet-segments/openconfig-ethernet-segments.yang + build: + - yang/ethernet-segments/openconfig-ethernet-segments.yang + run-ci: true diff --git a/release/models/ethernet-segments/openconfig-ethernet-segments.yang b/release/models/ethernet-segments/openconfig-ethernet-segments.yang new file mode 100644 index 000000000..b09357564 --- /dev/null +++ b/release/models/ethernet-segments/openconfig-ethernet-segments.yang @@ -0,0 +1,250 @@ +module openconfig-ethernet-segments { + + // namespace + namespace "http://openconfig.net/yang/ethernet-segments"; + + prefix "oc-es"; + + + import openconfig-extensions { prefix oc-ext; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-evpn-types { prefix oc-evpn-types; } + + // meta + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module contains definitions of ethernet segements. + The ethernet segments are used in EVPN services are + defined for the whole device"; + + oc-ext:openconfig-version "0.1.0"; + + revision "2021-06-28" { + description + "First Version"; + reference "0.1.0"; + } + + +grouping evpn-ethernet-segment-df-config { + description + "Configuration parameters for the Designated forwarding + Election"; + + leaf df-election-method { + type enumeration { + enum DEFAULT { + value 0; + description + "The default Designated Forwarder Election election method"; + } + enum HIGHEST_RANDOM_WEIGHT { + value 1; + description + "The highest random weight (HRW) method"; + reference + "RFC8584: Framework for Ethernet VPN Designated Forwarder + Election Extensibility"; + } + enum PREFERENCE { + value 2; + description + "The preference based method"; + reference + "RFC8584: Framework for Ethernet VPN Designated Forwarder + Election Extensibility"; + } + } + description + "Select the Designated Forwarder Election (DF) election method"; + reference + "RFC 7432: BGP MPLS-Based Ethernet VPN. + RFC 8584:Framework for Ethernet VPN Designated Forwarder + Election Extensibility"; + } + + leaf preference { + when "../df-election-method = 'PREFERENCE'" { + description + "The preference value is only applicable + to the preference based method"; + } + type uint16; + description + "Defines a 2-octet value that indicates the PE + preference to become the DF in the Ethernet-Segment."; + reference + "RFC8584: Framework for Ethernet VPN Designated Forwarder + Election Extensibility"; + } + + leaf revertive { + when "../df-election-method = 'PREFERENCE'" { + description + "The revertive value is only applicable + to the preference method"; + } + type boolean; + default true; + description + "The 'preempt' or 'revertive' behavior. This option will allow a + non-revertive behavior in the DF election."; + reference + "RFC8584: Framework for Ethernet VPN Designated Forwarder + Election Extensibility"; + } + + leaf election-wait-time { + when "../df-election-method = 'PREFERENCE'" { + description + "The Designated Forwarder Election wait-time is only applicable + to the preference method"; + } + type uint32; + description + "Designated Forwarder Election wait-time. When the DF timer expires, + the PE device selects the DF based on the highest preference value"; + reference + "RFC8584: Framework for Ethernet VPN Designated Forwarder + Election Extensibility"; + } + } + + grouping evpn-ethernet-segment-df-top { + description + "Top grouping for the configuration and state parameters + for the Designated forwarding Election"; + + container df-election { + description + "Top container for the configuration and state parameters + for the Designated forwarding Election"; + + container config { + description + "Configuration parameters for the Designated forwarding Election"; + + uses evpn-ethernet-segment-df-config; + } + + container state { + description + "Configuration parameters for the Designated forwarding Election"; + config false; + + uses evpn-ethernet-segment-df-config; + } + } + } + + grouping evpn-ethernet-segment-config { + description + "Configuration attributes for the Ethernet + Segment."; + + leaf name { + type string; + description + "Ethernet Segment name"; + } + + leaf esi-type { + type oc-evpn-types:esi-type; + default "TYPE_0_OPERATOR_CONFIGURED"; + description + "ESI Type is a 1-octet field (most significant octet) that + specifies the format of the remaining 9 octets (ESI Value)."; + reference + "RFC 7432: BGP MPLS-Based Ethernet VPN page-16"; + } + + leaf esi { + type union { + type oc-evpn-types:esi; + type enumeration { + enum AUTO { + description + "This ESI type indicates an auto-generated ESI value."; + reference + "RFC 7432: BGP MPLS-Based Ethernet VPN"; + } + } + } + description + "Ethernet Segment Identifier (ESI) value. + For ESI Type 0: The esi leaf value is directly configured by the operator. + For ESI Type 1: The AUTO enum must be used. + For ESI Type 2: The AUTO enum must be used. + For ESI Type 3: The directly configured or AUTO enum must be used. + For ESI Type 4: The directly configured or AUTO enum must be used. + For ESI Type 5: The directly configured or AUTO enum must be used."; + reference + "RFC 7432: BGP MPLS-Based Ethernet VPN."; + } + + leaf redundancy-mode { + type identityref { + base oc-evpn-types:EVPN_REDUNDANCY_MODE; + } + description + "Multihoming options for load balancing of + traffic in the Ethernet Segment."; + reference + "RFC 7432: BGP MPLS-Based Ethernet VPN"; + } + + uses oc-if:interface-ref-common; + } + + grouping evpn-ethernet-segment-top { + description + "Top-level grouping for ethernet segments. An Ethernet Segment + is referenced by a name and an ESI"; + + container ethernet-segments { + description + "Top-level container for ethernet segments. An Ethernet Segment + is referenced by a name and an ESI"; + + list ethernet-segment { + key "name"; + description + "List of Ethernet Segments."; + + leaf name { + type leafref { + path '../config/name'; + } + description + "Ethernet Segment Name "; + } + + container config { + description + "Configuration data for the Ethernet Segments."; + + uses evpn-ethernet-segment-config; + } + + container state { + config false; + description + "Operational state data for the Ethernet Segments."; + + uses evpn-ethernet-segment-config; + } + + uses evpn-ethernet-segment-df-top; + } + } + } + + uses evpn-ethernet-segment-top; + +} \ No newline at end of file diff --git a/release/models/network-instance/openconfig-evpn.yang b/release/models/network-instance/openconfig-evpn.yang index a2fbdd7f8..ef61d758e 100644 --- a/release/models/network-instance/openconfig-evpn.yang +++ b/release/models/network-instance/openconfig-evpn.yang @@ -40,7 +40,13 @@ module openconfig-evpn { domains, this is not currently supported and requires an extension of the model."; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.6.0"; + + revision "2023-07-12" { + description + "Removed ethernet segment"; + reference "0.6.0"; + } revision "2023-03-08" { description @@ -161,218 +167,7 @@ module openconfig-evpn { } } - grouping evpn-ethernet-segment-df-config { - description - "Configuration parameters for the Designated forwarding - Election"; - - leaf df-election-method { - type enumeration { - enum DEFAULT { - value 0; - description - "The default Designated Forwarder Election election method"; - } - enum HIGHEST_RANDOM_WEIGHT { - value 1; - description - "The highest random weight (HRW) method"; - reference - "RFC8584: Framework for Ethernet VPN Designated Forwarder - Election Extensibility"; - } - enum PREFERENCE { - value 2; - description - "The preference based method"; - reference - "RFC8584: Framework for Ethernet VPN Designated Forwarder - Election Extensibility"; - } - } - description - "Select the Designated Forwarder Election (DF) election method"; - reference - "RFC 7432: BGP MPLS-Based Ethernet VPN. - RFC 8584:Framework for Ethernet VPN Designated Forwarder - Election Extensibility"; - } - - leaf preference { - when "../df-election-method = 'PREFERENCE'" { - description - "The preference value is only applicable - to the preference based method"; - } - type uint16; - description - "Defines a 2-octet value that indicates the PE - preference to become the DF in the Ethernet-Segment."; - reference - "RFC8584: Framework for Ethernet VPN Designated Forwarder - Election Extensibility"; - } - - leaf revertive { - when "../df-election-method = 'PREFERENCE'" { - description - "The revertive value is only applicable - to the preference method"; - } - type boolean; - default true; - description - "The 'preempt' or 'revertive' behavior. This option will allow a - non-revertive behavior in the DF election."; - reference - "RFC8584: Framework for Ethernet VPN Designated Forwarder - Election Extensibility"; - } - - leaf election-wait-time { - when "../df-election-method = 'PREFERENCE'" { - description - "The Designated Forwarder Election wait-time is only applicable - to the preference method"; - } - type uint32; - description - "Designated Forwarder Election wait-time. When the DF timer expires, - the PE device selects the DF based on the highest preference value"; - reference - "RFC8584: Framework for Ethernet VPN Designated Forwarder - Election Extensibility"; - } - } - - grouping evpn-ethernet-segment-df-top { - description - "Top grouping for the configuration and state parameters - for the Designated forwarding Election"; - - container df-election { - description - "Top container for the configuration and state parameters - for the Designated forwarding Election"; - - container config { - description - "Configuration parameters for the Designated forwarding Election"; - - uses evpn-ethernet-segment-df-config; - } - - container state { - description - "Configuration parameters for the Designated forwarding Election"; - config false; - - uses evpn-ethernet-segment-df-config; - } - } - } - - grouping evpn-ethernet-segment-config { - description - "Configuration attributes for the Ethernet - Segment."; - - leaf name { - type string; - description - "Ethernet Segment name"; - } - - leaf esi-type { - type oc-evpn-types:esi-type; - default "TYPE_0_OPERATOR_CONFIGURED"; - description - "ESI Type is a 1-octet field (most significant octet) that - specifies the format of the remaining 9 octets (ESI Value)."; - reference - "RFC 7432: BGP MPLS-Based Ethernet VPN page-16"; - } - - leaf esi { - type union { - type oc-evpn-types:esi; - type enumeration { - enum AUTO { - description - "This ESI type indicates an auto-generated ESI value."; - reference - "RFC 7432: BGP MPLS-Based Ethernet VPN"; - } - } - } - description - "Ethernet Segment Identifier (ESI) value. - For ESI Type 0: The esi leaf value is directly configured by the operator. - For ESI Type 1: The AUTO enum must be used. - For ESI Type 2: The AUTO enum must be used. - For ESI Type 3: The directly configured or AUTO enum must be used. - For ESI Type 4: The directly configured or AUTO enum must be used. - For ESI Type 5: The directly configured or AUTO enum must be used."; - reference - "RFC 7432: BGP MPLS-Based Ethernet VPN."; - } - - leaf redundancy-mode { - type identityref { - base oc-evpn-types:EVPN_REDUNDANCY_MODE; - } - description - "Multihoming options for load balancing of - traffic in the Ethernet Segment."; - reference - "RFC 7432: BGP MPLS-Based Ethernet VPN"; - } - - uses oc-if:interface-ref-common; - } - - grouping evpn-ethernet-segment-top { - description - "Top-level grouping for ethernet segments. An Ethernet Segment - is referenced by a name and an ESI"; - - container ethernet-segments { - description - "Top-level container for ethernet segments. An Ethernet Segment - is referenced by a name and an ESI"; - - list ethernet-segment { - key "name"; - description - "List of Ethernet Segments."; - - leaf name { - type leafref { - path '../config/name'; - } - description - "Ethernet Segment Name "; - } - - container config { - description - "Configuration data for the Ethernet Segments."; - - uses evpn-ethernet-segment-config; - } - - container state { - config false; - description - "Operational state data for the Ethernet Segments."; - - uses evpn-ethernet-segment-config; - } - uses evpn-ethernet-segment-df-top; - } - } - } /* Groupings related to the Layer 2 forwarding (aka MAC-VRF)*/ diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index 3c422d96f..8e805e92a 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,14 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.0.3"; + oc-ext:openconfig-version "4.1.0"; + + revision "2023-07-12" { + description + "Moved ethernet-segments to top level + container."; + reference "4.1.0"; + } revision "2023-04-25" { description diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index e1710f31e..418582fe1 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,14 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.0.3"; + oc-ext:openconfig-version "4.1.0"; + + revision "2023-07-12" { + description + "Moved ethernet-segments to top-level + container."; + reference "4.1.0"; + } revision "2023-04-25" { description @@ -385,7 +392,6 @@ module openconfig-network-instance { "Configuration of parameters for EVPN related bridge domains (MAC VRFs) and layer3 VRFs (IP VRFs)"; uses oc-evpn:evpn-config-top; - uses oc-evpn:evpn-ethernet-segment-top; } container encapsulation { From 32c1d193f6186cfb7da7ea895601c5a80b03a2c9 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 13:18:29 -0700 Subject: [PATCH 059/201] Test comment --- .github/workflows/diff.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index b6dcea44a..9cb47d546 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -8,7 +8,6 @@ jobs: build: name: Backward Incompatibility Check runs-on: ubuntu-latest - continue-on-error: true steps: - name: Install go @@ -53,6 +52,7 @@ jobs: #body: "${{ env.leafchanges }}" - name: Find Comment + if: always() uses: peter-evans/find-comment@v2 id: fc with: @@ -61,6 +61,7 @@ jobs: body-includes: -----------List of all YANG node changes----------- - name: Create or update comment + if: always() uses: peter-evans/create-or-update-comment@v3 with: comment-id: ${{ steps.fc.outputs.comment-id }} From 00b1b3052aff57ef45ae4762e117693f2bd542d1 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:00:27 -0700 Subject: [PATCH 060/201] Test comment --- .github/workflows/diff.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 9cb47d546..464d03ebb 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@65fa792 + go install github.com/openconfig/models-ci/openconfig-ci@312f8d6 - name: Make sure all backward-incompatible changes are covered by version changes. id: check @@ -68,5 +68,5 @@ jobs: issue-number: ${{ github.event.pull_request.number }} body: | -----------List of all YANG node changes----------- - ${{ env.leafchanges }} + "${{ env.leafchanges }}" edit-mode: replace From d2b47a3e7d82b414e4f7dc42c825a8bd6502465f Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:03:48 -0700 Subject: [PATCH 061/201] Test comment --- .github/workflows/diff.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 464d03ebb..ca7a4f25c 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -48,6 +48,7 @@ jobs: EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" + openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" echo "$EOF" >> "$GITHUB_ENV" #body: "${{ env.leafchanges }}" From 6aac83d4aea019ffd73125510420a70fbf96874c Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:07:16 -0700 Subject: [PATCH 062/201] Test comment --- .github/workflows/diff.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index ca7a4f25c..f9498186f 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -41,17 +41,16 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" - #echo "-----------List of all YANG node changes-----------" >> "$GITHUB_OUTPUT" #openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_OUTPUT" EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" - openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" echo "$EOF" >> "$GITHUB_ENV" #body: "${{ env.leafchanges }}" + openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" + - name: Find Comment if: always() uses: peter-evans/find-comment@v2 From 1cd5a1d61b7a048f1e0930c5a8460f9de8d9438d Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:34:19 -0700 Subject: [PATCH 063/201] Test comment --- .github/workflows/diff.yaml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index f9498186f..ce1c5dd53 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@312f8d6 + go install github.com/openconfig/models-ci/openconfig-ci@742647c - name: Make sure all backward-incompatible changes are covered by version changes. id: check @@ -41,13 +41,10 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - #echo "-----------List of all YANG node changes-----------" >> "$GITHUB_OUTPUT" - #openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_OUTPUT" EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" echo "$EOF" >> "$GITHUB_ENV" - #body: "${{ env.leafchanges }}" openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" @@ -68,5 +65,5 @@ jobs: issue-number: ${{ github.event.pull_request.number }} body: | -----------List of all YANG node changes----------- - "${{ env.leafchanges }}" + ${{ env.leafchanges }} edit-mode: replace From 17f4992ea2225ca90e0dfb7c3a3f435f0500fed5 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:36:48 -0700 Subject: [PATCH 064/201] Test comment --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index ce1c5dd53..871e67e1d 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -43,7 +43,7 @@ jobs: EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" - openconfig-ci diff --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" + openconfig-ci diff --github-comment --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" echo "$EOF" >> "$GITHUB_ENV" openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" From af64f5f33bd7ae84e4d9b4707aee18680e3f8810 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:37:09 -0700 Subject: [PATCH 065/201] Test comment --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 871e67e1d..45a166757 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -64,6 +64,6 @@ jobs: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} body: | - -----------List of all YANG node changes----------- + \#\# -----------List of all YANG node changes----------- ${{ env.leafchanges }} edit-mode: replace From 0472eb2cdb45b73d0b5bd6eab1f35286a44a8d34 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:40:04 -0700 Subject: [PATCH 066/201] Test comment --- .github/workflows/diff.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 45a166757..036205adf 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -41,6 +41,8 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') + echo "yang-changes-title='## List of all YANG node changes'" >> "$GITHUB_ENV" + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" openconfig-ci diff --github-comment --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" @@ -55,7 +57,7 @@ jobs: with: issue-number: ${{ github.event.pull_request.number }} comment-author: 'github-actions[bot]' - body-includes: -----------List of all YANG node changes----------- + body-includes: ${{ env.yang-changes-title }} - name: Create or update comment if: always() @@ -64,6 +66,6 @@ jobs: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} body: | - \#\# -----------List of all YANG node changes----------- + ${{ env.yang-changes-title }} ${{ env.leafchanges }} edit-mode: replace From aae449738d79d57eef50acdbb12d43c7884201ba Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:41:11 -0700 Subject: [PATCH 067/201] Test comment --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 036205adf..4415fe74f 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -41,7 +41,7 @@ jobs: oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') - echo "yang-changes-title='## List of all YANG node changes'" >> "$GITHUB_ENV" + echo "yang-changes-title=## List of all YANG node changes" >> "$GITHUB_ENV" EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" From dfcca7080c8c43dbdaa0fb40db5f0d95f8141d2f Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 14:47:57 -0700 Subject: [PATCH 068/201] Test comment --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 4415fe74f..ee1d2c030 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@742647c + go install github.com/openconfig/models-ci/openconfig-ci@46f4f97 - name: Make sure all backward-incompatible changes are covered by version changes. id: check From bb5b0ffe338a7cc86d880f33484a77672497d542 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 16:12:29 -0700 Subject: [PATCH 069/201] Test comment --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index ee1d2c030..b0af9ab07 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@46f4f97 + go install github.com/openconfig/models-ci/openconfig-ci@2401790 - name: Make sure all backward-incompatible changes are covered by version changes. id: check From f0b510c033ee9e84ee67f3a714abbc487e540ddb Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 16:50:32 -0700 Subject: [PATCH 070/201] Test comment --- .github/workflows/diff.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index b0af9ab07..bc7577758 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@2401790 + go install github.com/openconfig/models-ci/openconfig-ci@88da8da - name: Make sure all backward-incompatible changes are covered by version changes. id: check @@ -38,17 +38,15 @@ jobs: git checkout "${HEAD}" oldroot="${BASEREPODIR}" newroot=. - oldfiles=$(find "${oldroot}"/release/models -name '*.yang' | tr '\n' ',') - newfiles=$(find "${newroot}"/release/models -name '*.yang' | tr '\n' ',') echo "yang-changes-title=## List of all YANG node changes" >> "$GITHUB_ENV" EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) echo "leafchanges<<$EOF" >> "$GITHUB_ENV" - openconfig-ci diff --github-comment --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" >> "$GITHUB_ENV" + openconfig-ci diff --github-comment --oldp "${oldroot}/third_party" --oldroot "${oldroot}/release/models" --newp "${newroot}/third_party" --newroot "${newroot}/release/models" >> "$GITHUB_ENV" echo "$EOF" >> "$GITHUB_ENV" - openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldfiles "${oldfiles}" --newp "${newroot}/third_party" --newfiles "${newfiles}" + openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldroot "${oldroot}/release/models" --newp "${newroot}/third_party" --newroot "${newroot}/release/models" - name: Find Comment if: always() From 00edd231bbea239e0e64df2fb9fa4020a0120d51 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 16:54:26 -0700 Subject: [PATCH 071/201] Test comment --- release/models/acl/openconfig-acl.yang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 78a540718..79bca7c46 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -284,7 +284,7 @@ module openconfig-acl { leaf forwarding-action { - type string; + type binary; mandatory true; description "Specifies the forwarding action. One forwarding action From eeed78169aaa14248192588bbc9406a958540a79 Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 16:57:06 -0700 Subject: [PATCH 072/201] Now revert all model changes --- release/models/acl/openconfig-acl.yang | 28 ++++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 79bca7c46..6b3977907 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.4.3"; + oc-ext:openconfig-version "1.3.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.4.3"; + reference "1.3.3"; } revision "2023-01-29" { @@ -284,23 +284,25 @@ module openconfig-acl { leaf forwarding-action { - type binary; + type identityref { + base FORWARDING_ACTION; + } mandatory true; description "Specifies the forwarding action. One forwarding action must be specified for each ACL entry"; } - //leaf log-action { - // type identityref { - // base LOG_ACTION; - // } - // default LOG_NONE; - // description - // "Specifies the log action and destination for - // matched packets. The default is not to log the - // packet."; - //} + leaf log-action { + type identityref { + base LOG_ACTION; + } + default LOG_NONE; + description + "Specifies the log action and destination for + matched packets. The default is not to log the + packet."; + } } From 01c13d8d8d825cca757bf857de3ed8c6e53a759b Mon Sep 17 00:00:00 2001 From: wenovus Date: Thu, 3 Aug 2023 17:06:52 -0700 Subject: [PATCH 073/201] Now revert all model changes --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index bc7577758..a5a34d0e4 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@88da8da + go install github.com/openconfig/models-ci/openconfig-ci@5ef41fc - name: Make sure all backward-incompatible changes are covered by version changes. id: check From c87676035b901f584a610b690d2205b082dda512 Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 09:36:22 -0700 Subject: [PATCH 074/201] test --- .github/workflows/diff.yaml | 2 +- cloudbuild.yaml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index a5a34d0e4..805bcc93f 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@5ef41fc + go install github.com/openconfig/models-ci/openconfig-ci@c880ed2 - name: Make sure all backward-incompatible changes are covered by version changes. id: check diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 8e0eb834c..4cece6fd6 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -53,7 +53,7 @@ steps: cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. #branch=$(git tag -l 'v10.*' | sort -V | tail -1) - branch=fail-at-generator-pull + branch=c880ed2 git checkout $branch volumes: - name: 'ssh' @@ -110,7 +110,8 @@ steps: git clone git@github.com:openconfig/pattern-regex-tests.git /go/src/github.com/openconfig/pattern-regex-tests cd /go/src/github.com/openconfig/pattern-regex-tests # Modify the major version to update regexp version. - branch=$(git tag -l 'v2.0*' | sort -V | tail -1) + #branch=$(git tag -l 'v2.0*' | sort -V | tail -1) + branch=use-common-workflow git checkout $branch volumes: - name: 'ssh' From 4f9f55486f3f0fb2d97a0242c073c1a19882a8a8 Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 09:55:42 -0700 Subject: [PATCH 075/201] prep for submission --- cloudbuild.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 4cece6fd6..0fac691b2 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,7 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - #branch=$(git tag -l 'v10.*' | sort -V | tail -1) + branch=$(git tag -l 'v11.*' | sort -V | tail -1) branch=c880ed2 git checkout $branch volumes: @@ -110,8 +110,7 @@ steps: git clone git@github.com:openconfig/pattern-regex-tests.git /go/src/github.com/openconfig/pattern-regex-tests cd /go/src/github.com/openconfig/pattern-regex-tests # Modify the major version to update regexp version. - #branch=$(git tag -l 'v2.0*' | sort -V | tail -1) - branch=use-common-workflow + branch=$(git tag -l 'v2.0*' | sort -V | tail -1) git checkout $branch volumes: - name: 'ssh' From 61a372b85fa5943c7a5a50e1e407a19515086ed8 Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 10:00:10 -0700 Subject: [PATCH 076/201] double check --- .github/workflows/diff.yaml | 27 ------------------------- release/models/acl/openconfig-acl.yang | 28 ++++++++++++-------------- 2 files changed, 13 insertions(+), 42 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 805bcc93f..526c42c45 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -39,31 +39,4 @@ jobs: oldroot="${BASEREPODIR}" newroot=. - echo "yang-changes-title=## List of all YANG node changes" >> "$GITHUB_ENV" - - EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) - echo "leafchanges<<$EOF" >> "$GITHUB_ENV" - openconfig-ci diff --github-comment --oldp "${oldroot}/third_party" --oldroot "${oldroot}/release/models" --newp "${newroot}/third_party" --newroot "${newroot}/release/models" >> "$GITHUB_ENV" - echo "$EOF" >> "$GITHUB_ENV" - openconfig-ci diff --disallowed-incompats --oldp "${oldroot}/third_party" --oldroot "${oldroot}/release/models" --newp "${newroot}/third_party" --newroot "${newroot}/release/models" - - - name: Find Comment - if: always() - uses: peter-evans/find-comment@v2 - id: fc - with: - issue-number: ${{ github.event.pull_request.number }} - comment-author: 'github-actions[bot]' - body-includes: ${{ env.yang-changes-title }} - - - name: Create or update comment - if: always() - uses: peter-evans/create-or-update-comment@v3 - with: - comment-id: ${{ steps.fc.outputs.comment-id }} - issue-number: ${{ github.event.pull_request.number }} - body: | - ${{ env.yang-changes-title }} - ${{ env.leafchanges }} - edit-mode: replace diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 6b3977907..79bca7c46 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.3"; + oc-ext:openconfig-version "1.4.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.3"; + reference "1.4.3"; } revision "2023-01-29" { @@ -284,25 +284,23 @@ module openconfig-acl { leaf forwarding-action { - type identityref { - base FORWARDING_ACTION; - } + type binary; mandatory true; description "Specifies the forwarding action. One forwarding action must be specified for each ACL entry"; } - leaf log-action { - type identityref { - base LOG_ACTION; - } - default LOG_NONE; - description - "Specifies the log action and destination for - matched packets. The default is not to log the - packet."; - } + //leaf log-action { + // type identityref { + // base LOG_ACTION; + // } + // default LOG_NONE; + // description + // "Specifies the log action and destination for + // matched packets. The default is not to log the + // packet."; + //} } From 54162d23682773d401ec2bfff1553ab47b3a441a Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 10:00:33 -0700 Subject: [PATCH 077/201] revert YANG changes --- release/models/acl/openconfig-acl.yang | 28 ++++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 79bca7c46..6b3977907 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.4.3"; + oc-ext:openconfig-version "1.3.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.4.3"; + reference "1.3.3"; } revision "2023-01-29" { @@ -284,23 +284,25 @@ module openconfig-acl { leaf forwarding-action { - type binary; + type identityref { + base FORWARDING_ACTION; + } mandatory true; description "Specifies the forwarding action. One forwarding action must be specified for each ACL entry"; } - //leaf log-action { - // type identityref { - // base LOG_ACTION; - // } - // default LOG_NONE; - // description - // "Specifies the log action and destination for - // matched packets. The default is not to log the - // packet."; - //} + leaf log-action { + type identityref { + base LOG_ACTION; + } + default LOG_NONE; + description + "Specifies the log action and destination for + matched packets. The default is not to log the + packet."; + } } From 82f67d4e50bb83bf24c99b08caf2974134d88d90 Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 11:08:37 -0700 Subject: [PATCH 078/201] double check error msg --- cloudbuild.yaml | 1 - release/models/acl/openconfig-acl.yang | 28 ++++++++++++-------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 0fac691b2..f746bf7c0 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -53,7 +53,6 @@ steps: cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. branch=$(git tag -l 'v11.*' | sort -V | tail -1) - branch=c880ed2 git checkout $branch volumes: - name: 'ssh' diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 6b3977907..79bca7c46 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.3.3"; + oc-ext:openconfig-version "1.4.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.3.3"; + reference "1.4.3"; } revision "2023-01-29" { @@ -284,25 +284,23 @@ module openconfig-acl { leaf forwarding-action { - type identityref { - base FORWARDING_ACTION; - } + type binary; mandatory true; description "Specifies the forwarding action. One forwarding action must be specified for each ACL entry"; } - leaf log-action { - type identityref { - base LOG_ACTION; - } - default LOG_NONE; - description - "Specifies the log action and destination for - matched packets. The default is not to log the - packet."; - } + //leaf log-action { + // type identityref { + // base LOG_ACTION; + // } + // default LOG_NONE; + // description + // "Specifies the log action and destination for + // matched packets. The default is not to log the + // packet."; + //} } From 666537ab7083bd302829d7139ae60b8d93906654 Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 11:38:52 -0700 Subject: [PATCH 079/201] Try fixing ygot --- cloudbuild.yaml | 1 + release/models/acl/openconfig-acl.yang | 28 ++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index f746bf7c0..ee73030ca 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -53,6 +53,7 @@ steps: cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. branch=$(git tag -l 'v11.*' | sort -V | tail -1) + branch=fix-ygot git checkout $branch volumes: - name: 'ssh' diff --git a/release/models/acl/openconfig-acl.yang b/release/models/acl/openconfig-acl.yang index 79bca7c46..6b3977907 100644 --- a/release/models/acl/openconfig-acl.yang +++ b/release/models/acl/openconfig-acl.yang @@ -34,12 +34,12 @@ module openconfig-acl { packets should be handled. Entries have a type that indicates the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; - oc-ext:openconfig-version "1.4.3"; + oc-ext:openconfig-version "1.3.3"; revision "2023-02-06" { description "Add clarifying comments on use of interface-ref."; - reference "1.4.3"; + reference "1.3.3"; } revision "2023-01-29" { @@ -284,23 +284,25 @@ module openconfig-acl { leaf forwarding-action { - type binary; + type identityref { + base FORWARDING_ACTION; + } mandatory true; description "Specifies the forwarding action. One forwarding action must be specified for each ACL entry"; } - //leaf log-action { - // type identityref { - // base LOG_ACTION; - // } - // default LOG_NONE; - // description - // "Specifies the log action and destination for - // matched packets. The default is not to log the - // packet."; - //} + leaf log-action { + type identityref { + base LOG_ACTION; + } + default LOG_NONE; + description + "Specifies the log action and destination for + matched packets. The default is not to log the + packet."; + } } From b7e1fad95db22bfd27753736dbddc6868dac9200 Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 12:29:39 -0700 Subject: [PATCH 080/201] should work now --- cloudbuild.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index ee73030ca..f746bf7c0 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -53,7 +53,6 @@ steps: cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. branch=$(git tag -l 'v11.*' | sort -V | tail -1) - branch=fix-ygot git checkout $branch volumes: - name: 'ssh' From 76383aa318eff6b549c8f35fd015f3b87c01bd6f Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 12:43:08 -0700 Subject: [PATCH 081/201] Improve Actions job name --- .github/workflows/diff.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 526c42c45..53eefac0d 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -1,4 +1,4 @@ -name: OpenConfig YANG Diff +name: Breaking Changes on: pull_request: @@ -6,7 +6,7 @@ on: jobs: build: - name: Backward Incompatibility Check + name: major version update check runs-on: ubuntu-latest steps: From 098e81c78e1e104ef132449aba550d4e786817af Mon Sep 17 00:00:00 2001 From: wenovus Date: Tue, 8 Aug 2023 12:53:07 -0700 Subject: [PATCH 082/201] Use latest version of Go during go setup --- .github/workflows/diff.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 53eefac0d..0a39c6487 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -11,9 +11,9 @@ jobs: steps: - name: Install go - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.x' - name: Check out code uses: actions/checkout@v3 From ab27fae8cebdd3f181ef815edcc49c4ad46bb3fa Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 8 Aug 2023 14:21:03 -0700 Subject: [PATCH 083/201] Clarify CAK counters (#937) Resolves #683 --- release/models/macsec/openconfig-macsec.yang | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/release/models/macsec/openconfig-macsec.yang b/release/models/macsec/openconfig-macsec.yang index 5554f695f..2b2d4e51e 100644 --- a/release/models/macsec/openconfig-macsec.yang +++ b/release/models/macsec/openconfig-macsec.yang @@ -18,12 +18,18 @@ module openconfig-macsec { "This module defines configuration and state data for MACsec IEEE Std 802.1AE-2018."; - oc-ext:openconfig-version "1.1.0"; + oc-ext:openconfig-version "1.1.1"; oc-ext:regexp-posix; oc-ext:catalog-organization "openconfig"; oc-ext:origin "openconfig"; - revision "2023-06-08" { + revision "2023-08-03" { + description + "Clarify in-cak and out-cak leaf descriptions."; + reference "1.1.1"; + } + +revision "2023-06-08" { description "Support rx-late-pkts leaf."; reference "1.1.0"; @@ -190,7 +196,9 @@ module openconfig-macsec { leaf in-cak-mkpdu { type oc-yang:counter64; description - "Validated MKPDU received CAK count"; + "Count of validated MKPDU connectivity association key (CAK) pdus + received. This counter is related to the group-cak feature in the + 802.1X-2010 standard."; } leaf out-mkpdu { @@ -208,7 +216,9 @@ module openconfig-macsec { leaf out-cak-mkpdu { type oc-yang:counter64; description - "MKPDU CAK sent count"; + "Count of MKPDU connectivity association key (CAK) pdu's sent. + This counter is related to the group-cak feature in the + 802.1X-2010 standard."; } } From face342aaf2f65988b1bbd21a08faee72ec0d736 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Fri, 11 Aug 2023 14:30:46 -0700 Subject: [PATCH 084/201] multicast counters to subinterface, remove physical counters from subinterface (#934) * add multicast to ip if, remove physical counters from subinterface * add in deprecated leaves to subif for backwards compat * trim whitespace * add if common submodule * update spec.yml * use common grouping for if counters * cleanup * bump versions * bump versions * merge submodule to openconfig-interfaces * revert oc-if-ip counters * revert oc-if-ip counters * add counter container to wifi ap if model * update wifi version, fix indent --- .../interfaces/openconfig-interfaces.yang | 631 ++++++++++-------- .../models/wifi/openconfig-ap-interfaces.yang | 19 +- 2 files changed, 382 insertions(+), 268 deletions(-) diff --git a/release/models/interfaces/openconfig-interfaces.yang b/release/models/interfaces/openconfig-interfaces.yang index 7d349a07c..9589c2cb2 100644 --- a/release/models/interfaces/openconfig-interfaces.yang +++ b/release/models/interfaces/openconfig-interfaces.yang @@ -51,9 +51,16 @@ module openconfig-interfaces { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.0.2"; + oc-ext:openconfig-version "3.5.0"; -revision "2023-02-06" { + revision "2023-07-14" { + description + "Move counters which apply to both interfaces and subinterfaces to + a common grouping. Deprecate physical counters from subinterface"; + reference "3.5.0"; + } + + revision "2023-02-06" { description "Add further specification to interface-ref type to clarify that the interface and subinterface leaves @@ -637,298 +644,374 @@ revision "2023-02-06" { } } - - grouping interface-counters-state { + grouping interface-common-counters-state { description - "Operational state representing interface counters - and statistics."; + "Operational state representing interface counters and statistics + applicable to (physical) interfaces and (logical) subinterfaces."; - //TODO: we may need to break this list of counters into those - //that would appear for physical vs. subinterface or logical - //interfaces. For now, just replicating the full stats - //grouping to both interface and subinterface. + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received on the interface, + including framing characters. - oc-ext:operational; + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - container counters { + leaf in-pkts { + type oc-yang:counter64; description - "A collection of interface-related statistics objects."; + "The total number of packets received on the interface, + including all unicast, multicast, broadcast and bad packets + etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information Base. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-octets { - type oc-yang:counter64; - description - "The total number of octets received on the interface, - including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; - } + leaf in-unicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-pkts { - type oc-yang:counter64; - description - "The total number of packets received on the interface, - including all unicast, multicast, broadcast and bad packets - etc."; - reference - "RFC 2819: Remote Network Monitoring Management Information - Base"; - } + leaf in-broadcast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInBroadcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-unicast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were not addressed to a - multicast or broadcast address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; - } + leaf in-multicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInMulticastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-broadcast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a broadcast - address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInBroadcastPkts"; - } + leaf in-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-multicast-pkts { - type oc-yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a multicast - address at this sub-layer. For a MAC-layer protocol, - this includes both Group and Functional addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInMulticastPkts"; - } + leaf in-discards { + type oc-yang:counter64; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. - leaf in-discards { - type oc-yang:counter64; - description - "The number of inbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being deliverable to a higher-layer - protocol. One possible reason for discarding such a - packet could be to free up buffer space. + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - reference - "RFC 2863: The Interfaces Group MIB - ifInDiscards"; - } + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets transmitted out of the + interface, including framing characters. - leaf in-errors { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of inbound - packets that contained errors preventing them from being - deliverable to a higher-layer protocol. For character- - oriented or fixed-length interfaces, the number of - inbound transmission units that contained errors - preventing them from being deliverable to a higher-layer - protocol. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInErrors"; - } + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-unknown-protos { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of packets - received via the interface that were discarded because - of an unknown or unsupported protocol. For - character-oriented or fixed-length interfaces that - support protocol multiplexing, the number of - transmission units received via the interface that were - discarded because of an unknown or unsupported protocol. - For any interface that does not support protocol - multiplexing, this counter is not present. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; - } + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of packets transmitted out of the + interface, including all unicast, multicast, broadcast, + and bad packets etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information Base. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf in-fcs-errors { - type oc-yang:counter64; - description - "Number of received packets which had errors in the - frame check sequence (FCS), i.e., framing errors. + leaf out-unicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - Discontinuities in the value of this counter can occur - when the device is re-initialization as indicated by the - value of 'last-clear'."; - } + leaf out-broadcast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutBroadcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-octets { - type oc-yang:counter64; - description - "The total number of octets transmitted out of the - interface, including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; - } + leaf out-multicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutMulticastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-pkts { - type oc-yang:counter64; - description - "The total number of packets transmitted out of the - interface, including all unicast, multicast, broadcast, - and bad packets etc."; - reference - "RFC 2819: Remote Network Monitoring Management Information - Base"; - } + leaf out-discards { + type oc-yang:counter64; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-unicast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were not addressed - to a multicast or broadcast address at this sub-layer, - including those that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; - } + leaf out-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } - leaf out-broadcast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were addressed to a - broadcast address at this sub-layer, including those - that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutBroadcastPkts"; - } + leaf last-clear { + type oc-types:timeticks64; + description + "Timestamp of the last time the interface counters were + cleared. + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + oc-ext:telemetry-on-change; + } + } - leaf out-multicast-pkts { - type oc-yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted, and that were addressed to a - multicast address at this sub-layer, including those - that were discarded or not sent. For a MAC-layer - protocol, this includes both Group and Functional - addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutMulticastPkts"; - } + grouping interface-counters-state { + description + "Operational state representing interface counters + and statistics."; - leaf out-discards { - type oc-yang:counter64; - description - "The number of outbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being transmitted. One possible reason - for discarding such a packet could be to free up buffer - space. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; - } + oc-ext:operational; - leaf out-errors { - type oc-yang:counter64; - description - "For packet-oriented interfaces, the number of outbound - packets that could not be transmitted because of errors. - For character-oriented or fixed-length interfaces, the - number of outbound transmission units that could not be - transmitted because of errors. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by the value of - 'last-clear'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutErrors"; - } + leaf in-unknown-protos { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } - leaf carrier-transitions { - type oc-yang:counter64; - description - "Number of times the interface state has transitioned - between up and down since the time the device restarted - or the last-clear time, whichever is most recent."; - oc-ext:telemetry-on-change; - } + leaf in-fcs-errors { + type oc-yang:counter64; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. - leaf last-clear { - type oc-types:timeticks64; - description - "Timestamp of the last time the interface counters were - cleared. + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } - The value is the timestamp in nanoseconds relative to - the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; - oc-ext:telemetry-on-change; - } + leaf carrier-transitions { + type oc-yang:counter64; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; + } + + leaf resets { + type oc-yang:counter64; + description + "Number of times the interface hardware has been reset. The + triggers and effects of this event are hardware-specifc."; + oc-ext:telemetry-on-change; + + } + } + + grouping subinterfaces-counters-state { + description + "Operational state representing counters unique to subinterfaces"; + + oc-ext:operational; + leaf in-unknown-protos { + type oc-yang:counter64; + status deprecated; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf in-fcs-errors { + type oc-yang:counter64; + status deprecated; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. + + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } + + leaf carrier-transitions { + type oc-yang:counter64; + status deprecated; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; } + } // data definition statements @@ -1020,7 +1103,15 @@ revision "2023-02-06" { } uses interface-common-state; - uses interface-counters-state; + + container counters { + description + "A collection of interface specific statistics entitites which are + not common to subinterfaces."; + + uses interface-common-counters-state; + uses subinterfaces-counters-state; + } } grouping subinterfaces-top { @@ -1119,7 +1210,15 @@ revision "2023-02-06" { uses interface-phys-config; uses interface-common-state; - uses interface-counters-state; + + container counters { + description + "A collection of interface specific statistics entitites which are + not common to subinterfaces."; + + uses interface-common-counters-state; + uses interface-counters-state; + } } uses interface-phys-holdtime-top; diff --git a/release/models/wifi/openconfig-ap-interfaces.yang b/release/models/wifi/openconfig-ap-interfaces.yang index 913520165..49f7f0a00 100644 --- a/release/models/wifi/openconfig-ap-interfaces.yang +++ b/release/models/wifi/openconfig-ap-interfaces.yang @@ -32,7 +32,14 @@ module openconfig-ap-interfaces { "This module defines the configuration and state data for non-radio interfaces on WiFi Access Points."; - oc-ext:openconfig-version "1.2.0"; + oc-ext:openconfig-version "1.3.0"; + + revision "2023-08-10" { + description + "Add container to make compatible with changes in + openconfig-interfaces"; + reference "1.3.0"; + } revision "2023-06-26" { description @@ -105,7 +112,15 @@ module openconfig-ap-interfaces { uses oc-if:interface-phys-config; uses oc-if:interface-common-state; - uses oc-if:interface-counters-state; + + container counters { + description + "A collection of interface specific statistics entitites which are + not common to subinterfaces."; + + uses oc-if:interface-common-counters-state; + uses oc-if:interface-counters-state; + } } } } From 5ef541dd3d468239f07d69fb05a4dbc9e3f7476b Mon Sep 17 00:00:00 2001 From: Roland Phung <414053+rolandphung@users.noreply.github.com> Date: Tue, 22 Aug 2023 09:23:21 -0700 Subject: [PATCH 085/201] Update string type keys to use interface-id type (#938) For the sake of consistency, certain keys were supposed to be oc-if:interface-id type --- release/models/bfd/openconfig-bfd.yang | 10 ++++++++-- .../openconfig-network-instance-l2.yang | 8 +++++++- .../network-instance/openconfig-network-instance.yang | 10 ++++++++-- .../models/ospf/openconfig-ospfv2-area-interface.yang | 10 ++++++++-- release/models/ospf/openconfig-ospfv2-area.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-common.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-global.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-lsdb.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2.yang | 8 +++++++- .../segment-routing/openconfig-segment-routing.yang | 10 ++++++++-- 10 files changed, 74 insertions(+), 14 deletions(-) diff --git a/release/models/bfd/openconfig-bfd.yang b/release/models/bfd/openconfig-bfd.yang index 400d7ab00..481021d33 100644 --- a/release/models/bfd/openconfig-bfd.yang +++ b/release/models/bfd/openconfig-bfd.yang @@ -26,7 +26,13 @@ module openconfig-bfd { "An OpenConfig model of Bi-Directional Forwarding Detection (BFD) configuration and operational state."; - oc-ext:openconfig-version "0.2.5"; + oc-ext:openconfig-version "0.2.6"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.2.6"; + } revision "2023-02-06" { description @@ -194,7 +200,7 @@ module openconfig-bfd { "Top-level per-interface configuration parameters for BFD."; leaf id { - type string; + type oc-if:interface-id; description "A unique identifier for the interface."; } diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index 8e805e92a..b9f4ede2f 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,13 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.1.0"; + oc-ext:openconfig-version "4.1.1"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "4.1.1"; + } revision "2023-07-12" { description diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index 418582fe1..8f104d175 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,13 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.1.0"; + oc-ext:openconfig-version "4.1.1"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "4.1.1"; + } revision "2023-07-12" { description @@ -1097,7 +1103,7 @@ module openconfig-network-instance { with the network instance"; leaf id { - type string; + type oc-if:interface-id; description "A unique identifier for this interface - this is expressed as a free-text string"; diff --git a/release/models/ospf/openconfig-ospfv2-area-interface.yang b/release/models/ospf/openconfig-ospfv2-area-interface.yang index 52d560bad..60a1293d1 100644 --- a/release/models/ospf/openconfig-ospfv2-area-interface.yang +++ b/release/models/ospf/openconfig-ospfv2-area-interface.yang @@ -25,7 +25,13 @@ submodule openconfig-ospfv2-area-interface { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.4.2"; + oc-ext:openconfig-version "0.4.3"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.4.3"; + } revision "2023-07-05" { description @@ -110,7 +116,7 @@ submodule openconfig-ospfv2-area-interface { "Configuration parameters for an OSPF interface"; leaf id { - type string; + type oc-if:interface-id; description "An operator-specified string utilised to uniquely reference this interface"; diff --git a/release/models/ospf/openconfig-ospfv2-area.yang b/release/models/ospf/openconfig-ospfv2-area.yang index 1cc2a9520..fa7fa0660 100644 --- a/release/models/ospf/openconfig-ospfv2-area.yang +++ b/release/models/ospf/openconfig-ospfv2-area.yang @@ -23,7 +23,13 @@ submodule openconfig-ospfv2-area { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.4.2"; + oc-ext:openconfig-version "0.4.3"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.4.3"; + } revision "2023-07-05" { description diff --git a/release/models/ospf/openconfig-ospfv2-common.yang b/release/models/ospf/openconfig-ospfv2-common.yang index d5c2fd945..460729a87 100644 --- a/release/models/ospf/openconfig-ospfv2-common.yang +++ b/release/models/ospf/openconfig-ospfv2-common.yang @@ -17,7 +17,13 @@ submodule openconfig-ospfv2-common { "This submodule provides OSPFv2 configuration and operational state parameters that are shared across multiple contexts"; - oc-ext:openconfig-version "0.4.2"; + oc-ext:openconfig-version "0.4.3"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.4.3"; + } revision "2023-07-05" { description diff --git a/release/models/ospf/openconfig-ospfv2-global.yang b/release/models/ospf/openconfig-ospfv2-global.yang index 832bf1103..2b7cc47b9 100644 --- a/release/models/ospf/openconfig-ospfv2-global.yang +++ b/release/models/ospf/openconfig-ospfv2-global.yang @@ -23,7 +23,13 @@ submodule openconfig-ospfv2-global { "This submodule provides OSPFv2 configuration and operational state parameters that are global to a particular OSPF instance"; - oc-ext:openconfig-version "0.4.2"; + oc-ext:openconfig-version "0.4.3"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.4.3"; + } revision "2023-07-05" { description diff --git a/release/models/ospf/openconfig-ospfv2-lsdb.yang b/release/models/ospf/openconfig-ospfv2-lsdb.yang index 5a39769fb..a3c493abd 100644 --- a/release/models/ospf/openconfig-ospfv2-lsdb.yang +++ b/release/models/ospf/openconfig-ospfv2-lsdb.yang @@ -22,7 +22,13 @@ submodule openconfig-ospfv2-lsdb { "An OpenConfig model for the Open Shortest Path First (OSPF) version 2 link-state database (LSDB)"; - oc-ext:openconfig-version "0.4.2"; + oc-ext:openconfig-version "0.4.3"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.4.3"; + } revision "2023-07-05" { description diff --git a/release/models/ospf/openconfig-ospfv2.yang b/release/models/ospf/openconfig-ospfv2.yang index f75a207bd..d43a4fd01 100644 --- a/release/models/ospf/openconfig-ospfv2.yang +++ b/release/models/ospf/openconfig-ospfv2.yang @@ -34,7 +34,13 @@ module openconfig-ospfv2 { "An OpenConfig model for Open Shortest Path First (OSPF) version 2"; - oc-ext:openconfig-version "0.4.2"; + oc-ext:openconfig-version "0.4.3"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.4.3"; + } revision "2023-07-05" { description diff --git a/release/models/segment-routing/openconfig-segment-routing.yang b/release/models/segment-routing/openconfig-segment-routing.yang index b88ffb3b7..a687f0bfb 100644 --- a/release/models/segment-routing/openconfig-segment-routing.yang +++ b/release/models/segment-routing/openconfig-segment-routing.yang @@ -36,7 +36,13 @@ module openconfig-segment-routing { - SR SID advertisements - instantiated within the relevant IGP. - SR-specific counters - instantied within the relevant dataplane."; - oc-ext:openconfig-version "0.4.0"; + oc-ext:openconfig-version "0.4.1"; + + revision "2023-08-09" { + description + "Update interface key to use interface-id type"; + reference "0.4.1"; + } revision "2023-05-24" { description @@ -449,7 +455,7 @@ module openconfig-segment-routing { "MPLS-specific Segment Routing configuration for an interface"; leaf interface-id { - type string; + type oc-if:interface-id; description "A unique identifier for the interface."; } From 0cf5581646df1f26c5e8f9eabb22648ec7cbdb72 Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Wed, 23 Aug 2023 16:47:38 -0700 Subject: [PATCH 086/201] Temporal qos buffer size definition (#928) Adding buffer management leafs for minimum buffer allocation and maximum static shared buffer alocatione expressed in microseconds Co-authored-by: Darren Loher --- .../models/qos/openconfig-qos-elements.yang | 9 +++- .../models/qos/openconfig-qos-interfaces.yang | 17 ++++++-- .../models/qos/openconfig-qos-mem-mgmt.yang | 41 +++++++++++++++++-- release/models/qos/openconfig-qos.yang | 9 +++- 4 files changed, 68 insertions(+), 8 deletions(-) diff --git a/release/models/qos/openconfig-qos-elements.yang b/release/models/qos/openconfig-qos-elements.yang index e679f6fe6..5c87eb5b4 100644 --- a/release/models/qos/openconfig-qos-elements.yang +++ b/release/models/qos/openconfig-qos-elements.yang @@ -35,7 +35,14 @@ submodule openconfig-qos-elements { packets for transmission, including policer and shaper functions"; - oc-ext:openconfig-version "0.9.1"; + oc-ext:openconfig-version "0.10.0"; + + revision "2023-07-26" { + description + "Add buffer management parameters in time unts (microseconds). + Make profiles reusable across LAGs and PHY of different speed"; + reference "0.10.0"; + } revision "2023-04-25" { description diff --git a/release/models/qos/openconfig-qos-interfaces.yang b/release/models/qos/openconfig-qos-interfaces.yang index eca7a5e21..1f11cfda6 100644 --- a/release/models/qos/openconfig-qos-interfaces.yang +++ b/release/models/qos/openconfig-qos-interfaces.yang @@ -25,7 +25,14 @@ submodule openconfig-qos-interfaces { configuration and operational state associated with interfaces."; - oc-ext:openconfig-version "0.9.1"; + oc-ext:openconfig-version "0.10.0"; + + revision "2023-07-26" { + description + "Add buffer management parameters in time unts (microseconds). + Make profiles reusable across LAGs and PHY of different speed"; + reference "0.10.0"; + } revision "2023-04-25" { description @@ -362,13 +369,17 @@ submodule openconfig-qos-interfaces { leaf dropped-pkts { type oc-yang:counter64; description - "Number of packets dropped by the queue due to overrun"; + "Number of packets dropped by the queue due to overrun, that is tail-drop + or AMQ (RED, WRED, etc) induced drops as indicated by the attached + queue-management-profile"; } leaf dropped-octets { type oc-yang:counter64; description - "Number of octets dropped by the queue due to overrun"; + "Number of octets dropped by the queue due to overrun, that is tail-drop + or AMQ (RED, WRED, etc) induced drops as indicated by the attached + queue-management-profile"; } } diff --git a/release/models/qos/openconfig-qos-mem-mgmt.yang b/release/models/qos/openconfig-qos-mem-mgmt.yang index ef7b324f6..13479ee88 100644 --- a/release/models/qos/openconfig-qos-mem-mgmt.yang +++ b/release/models/qos/openconfig-qos-mem-mgmt.yang @@ -29,7 +29,14 @@ submodule openconfig-qos-mem-mgmt { per-queue basis, and determine how packets are marked/dropped within the queue instantiation."; - oc-ext:openconfig-version "0.9.1"; + oc-ext:openconfig-version "0.10.0"; + + revision "2023-07-26" { + description + "Add buffer management parameters in time unts (microseconds). + Make profiles reusable across LAGs and PHY of different speed"; + reference "0.10.0"; + } revision "2023-04-25" { description @@ -221,7 +228,20 @@ submodule openconfig-qos-mem-mgmt { units bytes; description "This is the dedicated buffer that is carved for the queue, this is the minimum - number of bytes reserved for this queue."; + number of bytes reserved for this queue. + This leaf is mutualy exclusive with dedicated-buffer-temporal leaf"; + } + + leaf dedicated-buffer-temporal { + type uint64; + units microseconds; + description + "This is the dedicated buffer that is carved for the queue. The the minimum + number of bytes reserved for this queue is calculated by multiplying by interface speed + queue is attached to and queues minimum, guarantaed transmit share (derived + form WRR schedulers weights). + This leaf shouldbot be used for strict priority scheduled queues. + This leaf is mutualy exclusive with dedicated-buffer leaf"; } leaf use-shared-buffer { @@ -246,7 +266,22 @@ submodule openconfig-qos-mem-mgmt { description "If the shared-buffer-limit-type is STATIC, then static-shared-buffer-limit is the maximum number of bytes that the queue is allowed to use from the shared - pool."; + pool. + This leaf is mutualy exclusive with static-shared-buffer-limit-temporal leaf."; + } + + leaf static-shared-buffer-limit-temporal { + type uint32; + units microseconds; + description + "If the shared-buffer-limit-type is STATIC, then static-shared-buffer-limit-temporal is + the maximum number of bytes that the queue is allowed to use from the shared + pool. + The the number of bytes is calculated by multiplying static-shared-buffer-limit-temporal + by interface speed the queue is attached to and queues minimum, guarantaed transmit share + (derived form WRR schedulers weights). + This leaf shouldbot be used for strict priority scheduled queues. + This leaf is mutualy exclusive with static-shared-buffer-limit leaf."; } leaf dynamic-limit-scaling-factor { diff --git a/release/models/qos/openconfig-qos.yang b/release/models/qos/openconfig-qos.yang index a01610cfe..62302d706 100644 --- a/release/models/qos/openconfig-qos.yang +++ b/release/models/qos/openconfig-qos.yang @@ -27,7 +27,14 @@ module openconfig-qos { "This module defines configuration and operational state data related to network quality-of-service."; - oc-ext:openconfig-version "0.9.1"; + oc-ext:openconfig-version "0.10.0"; + + revision "2023-07-26" { + description + "Add buffer management parameters in time unts (microseconds). + Make profiles reusable across LAGs and PHY of different speed"; + reference "0.10.0"; + } revision "2023-04-25" { description From b75925aff7416a8bca1b02d0b5e9a4a64fbc09da Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Fri, 25 Aug 2023 18:08:32 -0700 Subject: [PATCH 087/201] Add OSPF summary-lsa metric (#916) * add summary-lsa/state/metric --- .../ospf/openconfig-ospfv2-area-interface.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-area.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-common.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-global.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-lsdb.yang | 14 +++++++++++++- release/models/ospf/openconfig-ospfv2.yang | 8 +++++++- t.txt | 0 7 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 t.txt diff --git a/release/models/ospf/openconfig-ospfv2-area-interface.yang b/release/models/ospf/openconfig-ospfv2-area-interface.yang index 60a1293d1..92cfdd7f9 100644 --- a/release/models/ospf/openconfig-ospfv2-area-interface.yang +++ b/release/models/ospf/openconfig-ospfv2-area-interface.yang @@ -25,7 +25,13 @@ submodule openconfig-ospfv2-area-interface { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.4.3"; + oc-ext:openconfig-version "0.5.0"; + + revision "2023-08-25" { + description + "Add leaf metric to lsdb-summary-lsa-state."; + reference "0.5.0"; + } revision "2023-08-09" { description diff --git a/release/models/ospf/openconfig-ospfv2-area.yang b/release/models/ospf/openconfig-ospfv2-area.yang index fa7fa0660..1ff82db2b 100644 --- a/release/models/ospf/openconfig-ospfv2-area.yang +++ b/release/models/ospf/openconfig-ospfv2-area.yang @@ -23,7 +23,13 @@ submodule openconfig-ospfv2-area { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.4.3"; + oc-ext:openconfig-version "0.5.0"; + + revision "2023-08-25" { + description + "Add leaf metric to lsdb-summary-lsa-state."; + reference "0.5.0"; +} revision "2023-08-09" { description diff --git a/release/models/ospf/openconfig-ospfv2-common.yang b/release/models/ospf/openconfig-ospfv2-common.yang index 460729a87..8a90fcc58 100644 --- a/release/models/ospf/openconfig-ospfv2-common.yang +++ b/release/models/ospf/openconfig-ospfv2-common.yang @@ -17,7 +17,13 @@ submodule openconfig-ospfv2-common { "This submodule provides OSPFv2 configuration and operational state parameters that are shared across multiple contexts"; - oc-ext:openconfig-version "0.4.3"; + oc-ext:openconfig-version "0.5.0"; + + revision "2023-08-25" { + description + "Add leaf metric to lsdb-summary-lsa-state."; + reference "0.5.0"; +} revision "2023-08-09" { description diff --git a/release/models/ospf/openconfig-ospfv2-global.yang b/release/models/ospf/openconfig-ospfv2-global.yang index 2b7cc47b9..73007d05e 100644 --- a/release/models/ospf/openconfig-ospfv2-global.yang +++ b/release/models/ospf/openconfig-ospfv2-global.yang @@ -23,7 +23,13 @@ submodule openconfig-ospfv2-global { "This submodule provides OSPFv2 configuration and operational state parameters that are global to a particular OSPF instance"; - oc-ext:openconfig-version "0.4.3"; + oc-ext:openconfig-version "0.5.0"; + + revision "2023-08-25" { + description + "Add leaf metric to lsdb-summary-lsa-state."; + reference "0.5.0"; +} revision "2023-08-09" { description diff --git a/release/models/ospf/openconfig-ospfv2-lsdb.yang b/release/models/ospf/openconfig-ospfv2-lsdb.yang index a3c493abd..35599a961 100644 --- a/release/models/ospf/openconfig-ospfv2-lsdb.yang +++ b/release/models/ospf/openconfig-ospfv2-lsdb.yang @@ -22,8 +22,13 @@ submodule openconfig-ospfv2-lsdb { "An OpenConfig model for the Open Shortest Path First (OSPF) version 2 link-state database (LSDB)"; - oc-ext:openconfig-version "0.4.3"; + oc-ext:openconfig-version "0.5.0"; + revision "2023-08-25" { + description + "Add leaf metric to lsdb-summary-lsa-state."; + reference "0.5.0"; +} revision "2023-08-09" { description "Update interface key to use interface-id type"; @@ -1218,6 +1223,13 @@ submodule openconfig-ospfv2-lsdb { "The mask of the network described by the Summary LSA represented as a CIDR mask."; } + + leaf metric { + type oc-ospf-types:ospf-metric; + description + "The cost of utilising the summary link specified independent of TOS."; + } + } grouping ospfv2-lsdb-asexternal-lsa-common-parameters { diff --git a/release/models/ospf/openconfig-ospfv2.yang b/release/models/ospf/openconfig-ospfv2.yang index d43a4fd01..bce9391ac 100644 --- a/release/models/ospf/openconfig-ospfv2.yang +++ b/release/models/ospf/openconfig-ospfv2.yang @@ -34,7 +34,13 @@ module openconfig-ospfv2 { "An OpenConfig model for Open Shortest Path First (OSPF) version 2"; - oc-ext:openconfig-version "0.4.3"; + oc-ext:openconfig-version "0.5.0"; + + revision "2023-08-25" { + description + "Add leaf metric to lsdb-summary-lsa-state."; + reference "0.5.0"; +} revision "2023-08-09" { description diff --git a/t.txt b/t.txt new file mode 100644 index 000000000..e69de29bb From f48bae357903afc41e49123746f2c0536f6d0254 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Fri, 25 Aug 2023 18:10:42 -0700 Subject: [PATCH 088/201] Delete t.txt Delete unintential file --- t.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 t.txt diff --git a/t.txt b/t.txt deleted file mode 100644 index e69de29bb..000000000 From b6bff9d192c7a1cf396c157c0b4918d17530a15f Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Wed, 30 Aug 2023 11:49:04 -0700 Subject: [PATCH 089/201] add mcast counters ipv4,6 (#941) --- .../models/interfaces/openconfig-if-ip.yang | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/release/models/interfaces/openconfig-if-ip.yang b/release/models/interfaces/openconfig-if-ip.yang index 498a90bec..6ab1ddc24 100644 --- a/release/models/interfaces/openconfig-if-ip.yang +++ b/release/models/interfaces/openconfig-if-ip.yang @@ -44,9 +44,15 @@ module openconfig-if-ip { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; - revision "2023-06-30" { + revision "2023-08-14" { + description + "Add multicast counters for IPv4, IPv6."; + reference "3.5.0"; + } + +revision "2023-06-30" { description "Deprecate IPv6 router advertisment config suppress leaf and add config mode leaf."; @@ -252,6 +258,31 @@ module openconfig-if-ip { Internet Protocol (IP)"; } + leaf in-multicast-pkts { + type oc-yang:counter64; + description + "The number of IP packets received for the specified + address family that are multicast packets. + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 4293: Management Information Base for the Internet + Protocol (IP) - ipSystemStatsHCInMcastPkts"; + } + + leaf in-multicast-octets { + type oc-yang:counter64; + description + "The total number of octets received in input IP + multicast packets for the specified address + family, including those received in error."; + reference + "RFC 4293: Management Information Base for the Internet + Protocol (IP) - ipSystemStatsHCInMcastOctets"; + } + leaf in-error-pkts { // TODO: this counter combines several error conditions -- // could consider breaking them out to separate leaf nodes @@ -329,6 +360,32 @@ module openconfig-if-ip { Internet Protocol (IP)"; } + leaf out-multicast-pkts { + type oc-yang:counter64; + description + "The total number of IP multicast packets transmitted. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP) + - ipSystemStatsHCOutMcastPkts"; + } + + leaf out-multicast-octets { + type oc-yang:counter64; + description + "The total number of IP multicast octets transmitted. This + includes packets generated locally and those forwarded by + the device."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + leaf out-error-pkts { // TODO: this counter combines several error conditions -- // could consider breaking them out to separate leaf nodes From a6fd34d743f3419a795c0e347e9d03eaf36d2276 Mon Sep 17 00:00:00 2001 From: Yue Zhang <19193057+mryuezhang@users.noreply.github.com> Date: Wed, 6 Sep 2023 17:53:51 -0400 Subject: [PATCH 090/201] Update openconfig-mpls-te.yang (#926) * Update openconfig-mpls-te.yang Added leaf record-record-enabled under grouping tunnel-p2p-attributes-config. --- release/models/mpls/openconfig-mpls-igp.yang | 8 +++++++- release/models/mpls/openconfig-mpls-static.yang | 8 +++++++- release/models/mpls/openconfig-mpls-te.yang | 13 ++++++++++++- release/models/mpls/openconfig-mpls.yang | 7 ++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/release/models/mpls/openconfig-mpls-igp.yang b/release/models/mpls/openconfig-mpls-igp.yang index 157d443b8..e71c26657 100644 --- a/release/models/mpls/openconfig-mpls-igp.yang +++ b/release/models/mpls/openconfig-mpls-igp.yang @@ -21,7 +21,13 @@ submodule openconfig-mpls-igp { "Configuration generic configuration parameters for IGP-congruent LSPs"; - oc-ext:openconfig-version "3.3.2"; + oc-ext:openconfig-version "3.4.0"; + + revision "2023-07-25" { + description + "Added record-route-enabled to MPLS p2p tunnel config"; + reference "3.4.0"; + } revision "2023-04-28" { description diff --git a/release/models/mpls/openconfig-mpls-static.yang b/release/models/mpls/openconfig-mpls-static.yang index 268d643a5..0a60e9628 100644 --- a/release/models/mpls/openconfig-mpls-static.yang +++ b/release/models/mpls/openconfig-mpls-static.yang @@ -23,7 +23,13 @@ submodule openconfig-mpls-static { "Defines static LSP configuration"; - oc-ext:openconfig-version "3.3.2"; + oc-ext:openconfig-version "3.4.0"; + + revision "2023-07-25" { + description + "Added record-route-enabled to MPLS p2p tunnel config"; + reference "3.4.0"; + } revision "2023-04-28" { description diff --git a/release/models/mpls/openconfig-mpls-te.yang b/release/models/mpls/openconfig-mpls-te.yang index 9553b7d86..2fe988e1a 100644 --- a/release/models/mpls/openconfig-mpls-te.yang +++ b/release/models/mpls/openconfig-mpls-te.yang @@ -30,7 +30,13 @@ submodule openconfig-mpls-te { signaling protocol or mechanism (see related submodules for signaling protocol-specific configuration)."; - oc-ext:openconfig-version "3.3.2"; + oc-ext:openconfig-version "3.4.0"; + + revision "2023-07-25" { + description + "Added record-route-enabled to MPLS p2p tunnel config"; + reference "3.4.0"; + } revision "2023-04-28" { description @@ -804,6 +810,11 @@ submodule openconfig-mpls-te { description "P2P tunnel destination address"; } + leaf record-route-enabled { + type boolean; + description + "Enables recording a path on an LSP using the record route object (RRO)"; + } } grouping p2p-path-state { diff --git a/release/models/mpls/openconfig-mpls.yang b/release/models/mpls/openconfig-mpls.yang index 85ca939dd..dde71fba3 100644 --- a/release/models/mpls/openconfig-mpls.yang +++ b/release/models/mpls/openconfig-mpls.yang @@ -70,8 +70,13 @@ module openconfig-mpls { +------+ |ROUTING| +-----+ +-------+ "; + oc-ext:openconfig-version "3.4.0"; - oc-ext:openconfig-version "3.3.2"; + revision "2023-07-25" { + description + "Added record-route-enabled to MPLS p2p tunnel config"; + reference "3.4.0"; + } revision "2023-04-28" { description From 98d48c3aae850cde0b504ded0f35c372612dc6a7 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Thu, 7 Sep 2023 16:46:17 -0700 Subject: [PATCH 091/201] Add graceful shutdown as BGP_WELL_KNOWN_STD_COMMUNITY (#954) * add graceful shutdown as BGP_WELL_KNOWN_STD_COMMUNITY --- release/models/bgp/openconfig-bgp-errors.yang | 8 +++++++- release/models/bgp/openconfig-bgp-types.yang | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-errors.yang b/release/models/bgp/openconfig-bgp-errors.yang index d76233820..d4b9ba5a8 100644 --- a/release/models/bgp/openconfig-bgp-errors.yang +++ b/release/models/bgp/openconfig-bgp-errors.yang @@ -18,7 +18,13 @@ submodule openconfig-bgp-errors { "This module defines BGP NOTIFICATION message error codes and subcodes"; - oc-ext:openconfig-version "5.4.0"; + oc-ext:openconfig-version "5.5.0"; + + revision "2023-09-06" { + description + "Add GRACEFUL_SHUTDOWN as a BGP_WELL_KNOWN_STD_COMMUNITY"; + reference "5.5.0"; + } revision "2023-03-31" { description diff --git a/release/models/bgp/openconfig-bgp-types.yang b/release/models/bgp/openconfig-bgp-types.yang index c9a7d01ad..447537c5d 100644 --- a/release/models/bgp/openconfig-bgp-types.yang +++ b/release/models/bgp/openconfig-bgp-types.yang @@ -25,7 +25,13 @@ module openconfig-bgp-types { policy. It can be imported by modules that make use of BGP attributes"; - oc-ext:openconfig-version "5.4.0"; + oc-ext:openconfig-version "5.5.0"; + + revision "2023-09-06" { + description + "Add GRACEFUL_SHUTDOWN as a BGP_WELL_KNOWN_STD_COMMUNITY"; + reference "5.5.0"; + } revision "2023-03-31" { description @@ -361,6 +367,16 @@ module openconfig-bgp-types { reference "RFC3765"; } + identity GRACEFUL_SHUTDOWN { + base BGP_WELL_KNOWN_STD_COMMUNITY; + description + "An autonomous system which supports the graceful shutdown + receiver procedure receiving NLRI tagged with this community + will set LOCAL_PREF to a low value for those NLRI. This + community has a value of 0xFFFF0000."; + reference "RFC8326"; + } + typedef bgp-session-direction { type enumeration { enum INBOUND { From 1196fbf60a5e58616687ddf22e0b5735b776124f Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Wed, 13 Sep 2023 11:05:12 -0700 Subject: [PATCH 092/201] add transceiver module temp thresholds (#948) --- .../openconfig-platform-transceiver.yang | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/release/models/platform/openconfig-platform-transceiver.yang b/release/models/platform/openconfig-platform-transceiver.yang index e0af67e6e..195f56454 100644 --- a/release/models/platform/openconfig-platform-transceiver.yang +++ b/release/models/platform/openconfig-platform-transceiver.yang @@ -66,7 +66,13 @@ module openconfig-platform-transceiver { specify a physical-channel within a TRANSCEIVER component (i.e. gray optic) that it is associated with."; - oc-ext:openconfig-version "0.12.0"; + oc-ext:openconfig-version "0.13.0"; + +revision "2023-08-30" { + description + "Add transceiver module temperature thresholds"; + reference "0.13.0"; + } revision "2023-06-27" { description @@ -843,6 +849,22 @@ module openconfig-platform-transceiver { } units volts; } + leaf module-temperature-lower { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The lower temperature threshold for the transceiver module."; + } + leaf module-temperature-upper { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The upper temperature threshold for the transceiver module."; + } } grouping port-transceiver-top { From 5d38d8531ef9c5b998262207eb6dbdae8968f9fe Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Tue, 19 Sep 2023 11:44:21 -0700 Subject: [PATCH 093/201] ECN counters (#960) * Add ECN marked and selected counters --- .../models/qos/openconfig-qos-elements.yang | 8 +++- .../models/qos/openconfig-qos-interfaces.yang | 44 ++++++++++++++++++- .../models/qos/openconfig-qos-mem-mgmt.yang | 10 ++++- release/models/qos/openconfig-qos.yang | 10 ++++- 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/release/models/qos/openconfig-qos-elements.yang b/release/models/qos/openconfig-qos-elements.yang index 5c87eb5b4..d2de615d4 100644 --- a/release/models/qos/openconfig-qos-elements.yang +++ b/release/models/qos/openconfig-qos-elements.yang @@ -35,7 +35,13 @@ submodule openconfig-qos-elements { packets for transmission, including policer and shaper functions"; - oc-ext:openconfig-version "0.10.0"; + oc-ext:openconfig-version "0.11.0"; + + revision "2023-09-15" { + description + "Add support for ECN counters"; + reference "0.11.0"; + } revision "2023-07-26" { description diff --git a/release/models/qos/openconfig-qos-interfaces.yang b/release/models/qos/openconfig-qos-interfaces.yang index 1f11cfda6..571414b81 100644 --- a/release/models/qos/openconfig-qos-interfaces.yang +++ b/release/models/qos/openconfig-qos-interfaces.yang @@ -25,7 +25,13 @@ submodule openconfig-qos-interfaces { configuration and operational state associated with interfaces."; - oc-ext:openconfig-version "0.10.0"; + oc-ext:openconfig-version "0.11.0"; + + revision "2023-09-15" { + description + "Add support for ECN counters"; + reference "0.11.0"; + } revision "2023-07-26" { description @@ -381,6 +387,42 @@ submodule openconfig-qos-interfaces { or AMQ (RED, WRED, etc) induced drops as indicated by the attached queue-management-profile"; } + + leaf ecn-marked-pkts { + type oc-yang:counter64; + description + "number of packets for which ECN codepoint has been changed from ECT to CE"; + } + + leaf ecn-marked-octets { + type oc-yang:counter64; + description + "Number of octets for which ECN codepoint has been changed from ECT to CE"; + } + + leaf ecn-selected-pkts { + type oc-yang:counter64; + description + "Number of packets selected by AQM + + For RED/WRED AQM this counter counts: + - all packets enqueued while queue utilization was greater then max-threshold + - packs enqueued while queue utilization was between min-threshold and max-threshold, with probability derived from RED/WRED slope + + Packets are counted regardless of its ECN codepoint"; + } + + leaf ecn-selected-octets { + type oc-yang:counter64; + description + "Number of octets of packets selected by AQM + + For RED/WRED AQM this counter counts: + - all octets enqueued while queue utilization was greater then max-threshold + - octets enqueued while queue utilization was between min-threshold and max-threshold, with probability derived from RED/WRED slope + + Octets are counted regardless of its ECN codepoint"; + } } grouping qos-interface-queue-top { diff --git a/release/models/qos/openconfig-qos-mem-mgmt.yang b/release/models/qos/openconfig-qos-mem-mgmt.yang index 13479ee88..70272520b 100644 --- a/release/models/qos/openconfig-qos-mem-mgmt.yang +++ b/release/models/qos/openconfig-qos-mem-mgmt.yang @@ -29,9 +29,15 @@ submodule openconfig-qos-mem-mgmt { per-queue basis, and determine how packets are marked/dropped within the queue instantiation."; - oc-ext:openconfig-version "0.10.0"; + oc-ext:openconfig-version "0.11.0"; - revision "2023-07-26" { + revision "2023-09-15" { + description + "Add support for ECN counters"; + reference "0.11.0"; + } + +revision "2023-07-26" { description "Add buffer management parameters in time unts (microseconds). Make profiles reusable across LAGs and PHY of different speed"; diff --git a/release/models/qos/openconfig-qos.yang b/release/models/qos/openconfig-qos.yang index 62302d706..2d57bf267 100644 --- a/release/models/qos/openconfig-qos.yang +++ b/release/models/qos/openconfig-qos.yang @@ -27,9 +27,15 @@ module openconfig-qos { "This module defines configuration and operational state data related to network quality-of-service."; - oc-ext:openconfig-version "0.10.0"; + oc-ext:openconfig-version "0.11.0"; - revision "2023-07-26" { + revision "2023-09-15" { + description + "Add support for ECN counters"; + reference "0.11.0"; + } + +revision "2023-07-26" { description "Add buffer management parameters in time unts (microseconds). Make profiles reusable across LAGs and PHY of different speed"; From 323a3e2e43c60aafa2bf78ec7c955c00f6cfac4d Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 3 Oct 2023 11:42:29 -0700 Subject: [PATCH 094/201] Add pipeline no-route counter (#967) --- .../openconfig-platform-pipeline-counters.yang | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/release/models/platform/openconfig-platform-pipeline-counters.yang b/release/models/platform/openconfig-platform-pipeline-counters.yang index e4bad82a6..b7d81c962 100644 --- a/release/models/platform/openconfig-platform-pipeline-counters.yang +++ b/release/models/platform/openconfig-platform-pipeline-counters.yang @@ -65,10 +65,16 @@ module openconfig-platform-pipeline-counters { 5 blocks, is to have the abililty to receive all drop counters from all 5 blocks, for example, with one request."; - oc-ext:openconfig-version "0.4.0"; + oc-ext:openconfig-version "0.5.0"; oc-ext:catalog-organization "openconfig"; oc-ext:origin "openconfig"; + revision "2023-09-26" { + description + "Add no-route aggregate drop counter."; + reference "0.5.0"; + } + revision "2023-02-03" { description "Add vendor-specific control-plane traffic queue counters"; @@ -1116,6 +1122,16 @@ module openconfig-platform-pipeline-counters { for each uRPF packet drop."; } + leaf no-route { + type oc-yang:counter64; + description + "This aggregation of counters represents the conditions in which + packets are dropped due to no FIB entry for this ipv4 or ipv6 lookup. + + This counter and the packet-processing-aggregate counter should be + incremented for each no-route packet drop."; + } + } grouping pipeline-vendor-drop-packets { From 9b3eed1f1ede0824e9a3af42d7f7ccb52d75c127 Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Mon, 9 Oct 2023 18:54:14 -0700 Subject: [PATCH 095/201] Update openconfig-qos-mem-mgmt.yang (#953) * Update openconfig-qos-mem-mgmt.yang Clarification of expected behaviour if WRED weight leaf is not present. --- release/models/qos/openconfig-qos-elements.yang | 8 +++++++- release/models/qos/openconfig-qos-interfaces.yang | 8 +++++++- release/models/qos/openconfig-qos-mem-mgmt.yang | 13 +++++++++++-- release/models/qos/openconfig-qos.yang | 8 +++++++- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/release/models/qos/openconfig-qos-elements.yang b/release/models/qos/openconfig-qos-elements.yang index d2de615d4..613b50768 100644 --- a/release/models/qos/openconfig-qos-elements.yang +++ b/release/models/qos/openconfig-qos-elements.yang @@ -35,7 +35,13 @@ submodule openconfig-qos-elements { packets for transmission, including policer and shaper functions"; - oc-ext:openconfig-version "0.11.0"; + oc-ext:openconfig-version "0.11.1"; + + revision "2023-09-06" { + description + "Clarification on WRED weight in case it is not present"; + reference "0.11.1"; + } revision "2023-09-15" { description diff --git a/release/models/qos/openconfig-qos-interfaces.yang b/release/models/qos/openconfig-qos-interfaces.yang index 571414b81..28959856b 100644 --- a/release/models/qos/openconfig-qos-interfaces.yang +++ b/release/models/qos/openconfig-qos-interfaces.yang @@ -25,7 +25,13 @@ submodule openconfig-qos-interfaces { configuration and operational state associated with interfaces."; - oc-ext:openconfig-version "0.11.0"; + oc-ext:openconfig-version "0.11.1"; + + revision "2023-09-06" { + description + "Clarification on WRED weight in case it is not present"; + reference "0.11.1"; + } revision "2023-09-15" { description diff --git a/release/models/qos/openconfig-qos-mem-mgmt.yang b/release/models/qos/openconfig-qos-mem-mgmt.yang index 70272520b..75086eadb 100644 --- a/release/models/qos/openconfig-qos-mem-mgmt.yang +++ b/release/models/qos/openconfig-qos-mem-mgmt.yang @@ -29,7 +29,13 @@ submodule openconfig-qos-mem-mgmt { per-queue basis, and determine how packets are marked/dropped within the queue instantiation."; - oc-ext:openconfig-version "0.11.0"; + oc-ext:openconfig-version "0.11.1"; + + revision "2023-09-06" { + description + "Clarification on WRED weight in case it is not present"; + reference "0.11.1"; + } revision "2023-09-15" { description @@ -403,7 +409,10 @@ revision "2023-07-26" { The previous average is more important for high values of n. Peaks and lows in queue size are smoothed by a high value. For low values - of n, the average queue size is close to the current queue size."; + of n, the average queue size is close to the current queue size. + + When this leaf is not present, implementation default value is + applied."; } leaf max-drop-probability-percent { diff --git a/release/models/qos/openconfig-qos.yang b/release/models/qos/openconfig-qos.yang index 2d57bf267..5a63029ad 100644 --- a/release/models/qos/openconfig-qos.yang +++ b/release/models/qos/openconfig-qos.yang @@ -27,7 +27,13 @@ module openconfig-qos { "This module defines configuration and operational state data related to network quality-of-service."; - oc-ext:openconfig-version "0.11.0"; + oc-ext:openconfig-version "0.11.1"; + + revision "2023-09-06" { + description + "Clarification on WRED weight in case it is not present"; + reference "0.11.1"; + } revision "2023-09-15" { description From 11e580e2665b5384ade412c507d41d6e616ed192 Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Tue, 10 Oct 2023 10:25:21 -0700 Subject: [PATCH 096/201] Vty files logging (#921) * Add vty and file destinations for syslog --------- Co-authored-by: Darren Loher --- .../system/openconfig-system-logging.yang | 166 +++++++++++++++++- 1 file changed, 162 insertions(+), 4 deletions(-) diff --git a/release/models/system/openconfig-system-logging.yang b/release/models/system/openconfig-system-logging.yang index 3fcc7c5cd..f845547cb 100644 --- a/release/models/system/openconfig-system-logging.yang +++ b/release/models/system/openconfig-system-logging.yang @@ -23,7 +23,13 @@ module openconfig-system-logging { "This module defines configuration and operational state data for common logging facilities on network systems."; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.6.0"; + +revision "2023-07-20" { + description + "adding VTY and local files as logging destinations"; + reference "0.6.0"; + } revision "2023-05-04" { description @@ -354,12 +360,12 @@ module openconfig-system-logging { grouping logging-console-config { description - "Configuration data for console logging"; + "Configuration data for console and vty logging"; } grouping logging-console-state { description - "Operational state data for console logging"; + "Operational state data for console and vty logging"; } grouping logging-console-top { @@ -436,7 +442,8 @@ module openconfig-system-logging { container remote-servers { description - "Enclosing container for the list of remote log servers"; + "Enclosing container for the list of remote log + servers"; list remote-server { key "host"; @@ -473,6 +480,154 @@ module openconfig-system-logging { } } + grouping logging-file-config { + description + "Configuration data for logfile"; + + leaf filename-prefix { + type string { + length 0..255; + } + description + "A name used for the file. It is expected that an + implementation may append timestamp, serial-number or + other identifier to the filename."; + } + + leaf path { + type string { + length 0..255; + } + description + "The fully specified path of the folder where the + logfile is stored. The path is implementation specific + and may include attributes such as a drive identifier."; + } + + leaf rotate { + type uint32; + default 0; + description + "Used for logfile rotation. + Log files are rotated the number of times defined by + this leaf. + The default value of 1 indicates that there will be one + rotation file and one active file. A 0 value indicates + old versions are removed rather than rotated."; + } + + leaf max-size { + type uint32; + default 1000; + description + "Used for logfile rotation. + Maximum size in Bytes, logfile may grow to. When logfile + reach this size it triggers log rotation. The log file need to + be save, closed, and new file open or future log storage. + If needed oldest logfile of same prefix shall be deleted to"; + } + + leaf max-open-time { + type uint32; + default 1440; + description + "Used for logfile rotation. + Maximum time, in minutes, the logfile can be open. When expires, + it triggers log rotation. + Actions are same ans when log file reaches its max-size. + it need to be closed, save, and new file open or future log + storage. If needed oldest logfile of same prefix shall be + deleted to "; + } + } + + grouping logging-file-state { + description + "Operational state data for logfile"; + leaf open-logfile { + type string{ + length 0..511; + } + description + "the currently active/open filename prepended by folder path + and including suffix appended to filename-prefix by system"; + } + } + + grouping logging-files-top { + description + "Top-level grouping for local log files"; + + container files { + description + "Enclosing container for the list of log files"; + + list file { + key "path filename-prefix"; + description + "List of logfiles"; + + leaf filename-prefix { + type leafref { + path "../config/filename-prefix"; + } + description + "Reference to the logfiles list key"; + } + + leaf path { + type leafref { + path "../config/path"; + } + description + "Reference to the logfiles list key"; + } + + container config { + description + "Configuration data for logfile"; + uses logging-file-config; + } + + container state { + config false; + description + "Operational state data for logfile servers"; + uses logging-file-config; + uses logging-file-state; + } + uses logging-selectors-top; + } + } + } + + grouping logging-vty-top { + description + "Top-level grouping for vty logging data"; + + container vty { + description + "Top-level container for data related to vty-based + logging (active sessions of ssh, telnet, etc )"; + + container config { + description + "Configuration data for vty logging"; + + uses logging-console-config; + } + + container state { + config false; + description + "Operational state data for console logging"; + uses logging-console-config; + uses logging-console-state; + } + uses logging-selectors-top; + } + } + grouping logging-top { description "Top-level grouping for logging data"; @@ -483,6 +638,9 @@ module openconfig-system-logging { uses logging-console-top; uses logging-remote-top; + uses logging-files-top; + uses logging-vty-top; + } } // data definition statements From 13260a464a0dde9a47cf8f3f10ef256922c566ae Mon Sep 17 00:00:00 2001 From: wenovus Date: Fri, 13 Oct 2023 12:49:24 -0700 Subject: [PATCH 097/201] Fix revision statements and enable pyangbind as regular checker --- cloudbuild.yaml | 1 - release/models/qos/openconfig-qos-elements.yang | 10 ++++++++-- release/models/qos/openconfig-qos-interfaces.yang | 10 ++++++++-- release/models/qos/openconfig-qos-mem-mgmt.yang | 10 ++++++++-- release/models/qos/openconfig-qos.yang | 10 ++++++++-- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index f746bf7c0..602afe21d 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -90,7 +90,6 @@ steps: -skipped-validators=confd,yanglint -extra-pyang-versions=2.2.1 -branch=$BRANCH_NAME - -compat-report=pyangbind secretEnv: ['GITHUB_ACCESS_TOKEN'] env: - 'GOPATH=/go' diff --git a/release/models/qos/openconfig-qos-elements.yang b/release/models/qos/openconfig-qos-elements.yang index 613b50768..6aee18d72 100644 --- a/release/models/qos/openconfig-qos-elements.yang +++ b/release/models/qos/openconfig-qos-elements.yang @@ -35,9 +35,15 @@ submodule openconfig-qos-elements { packets for transmission, including policer and shaper functions"; - oc-ext:openconfig-version "0.11.1"; + oc-ext:openconfig-version "0.11.2"; - revision "2023-09-06" { + revision "2023-10-13" { + description + "Fix revision statement date"; + reference "0.11.2"; + } + + revision "2023-10-08" { description "Clarification on WRED weight in case it is not present"; reference "0.11.1"; diff --git a/release/models/qos/openconfig-qos-interfaces.yang b/release/models/qos/openconfig-qos-interfaces.yang index 28959856b..c45c0974b 100644 --- a/release/models/qos/openconfig-qos-interfaces.yang +++ b/release/models/qos/openconfig-qos-interfaces.yang @@ -25,9 +25,15 @@ submodule openconfig-qos-interfaces { configuration and operational state associated with interfaces."; - oc-ext:openconfig-version "0.11.1"; + oc-ext:openconfig-version "0.11.2"; - revision "2023-09-06" { + revision "2023-10-13" { + description + "Fix revision statement date"; + reference "0.11.2"; + } + + revision "2023-10-08" { description "Clarification on WRED weight in case it is not present"; reference "0.11.1"; diff --git a/release/models/qos/openconfig-qos-mem-mgmt.yang b/release/models/qos/openconfig-qos-mem-mgmt.yang index 75086eadb..34c373d58 100644 --- a/release/models/qos/openconfig-qos-mem-mgmt.yang +++ b/release/models/qos/openconfig-qos-mem-mgmt.yang @@ -29,9 +29,15 @@ submodule openconfig-qos-mem-mgmt { per-queue basis, and determine how packets are marked/dropped within the queue instantiation."; - oc-ext:openconfig-version "0.11.1"; + oc-ext:openconfig-version "0.11.2"; - revision "2023-09-06" { + revision "2023-10-13" { + description + "Fix revision statement date"; + reference "0.11.2"; + } + + revision "2023-10-08" { description "Clarification on WRED weight in case it is not present"; reference "0.11.1"; diff --git a/release/models/qos/openconfig-qos.yang b/release/models/qos/openconfig-qos.yang index 5a63029ad..9feb9b3ba 100644 --- a/release/models/qos/openconfig-qos.yang +++ b/release/models/qos/openconfig-qos.yang @@ -27,9 +27,15 @@ module openconfig-qos { "This module defines configuration and operational state data related to network quality-of-service."; - oc-ext:openconfig-version "0.11.1"; + oc-ext:openconfig-version "0.11.2"; - revision "2023-09-06" { + revision "2023-10-13" { + description + "Fix revision statement date"; + reference "0.11.2"; + } + + revision "2023-10-08" { description "Clarification on WRED weight in case it is not present"; reference "0.11.1"; From 65254444ff74a8844e984691e553899807117f80 Mon Sep 17 00:00:00 2001 From: wenovus Date: Fri, 13 Oct 2023 14:17:29 -0700 Subject: [PATCH 098/201] Bump models-ci version --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 602afe21d..ff235983e 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,7 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - branch=$(git tag -l 'v11.*' | sort -V | tail -1) + branch=$(git tag -l 'v12.*' | sort -V | tail -1) git checkout $branch volumes: - name: 'ssh' From 57adeafc825d885b953eec1cd02663c095ccdf71 Mon Sep 17 00:00:00 2001 From: Jake Snyder Date: Tue, 17 Oct 2023 11:09:03 -0600 Subject: [PATCH 099/201] Adding FREQ_2_6_GHZ to wifi-types #923 (#950) --- release/models/wifi/openconfig-wifi-types.yang | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/release/models/wifi/openconfig-wifi-types.yang b/release/models/wifi/openconfig-wifi-types.yang index d2d62f038..30e358ae3 100644 --- a/release/models/wifi/openconfig-wifi-types.yang +++ b/release/models/wifi/openconfig-wifi-types.yang @@ -22,7 +22,13 @@ module openconfig-wifi-types { that are used in the openconfig-wifi modules. It can be imported by any module to make use of these types."; - oc-ext:openconfig-version "1.1.1"; + oc-ext:openconfig-version "1.1.2"; + + revision "2023-09-01" { + description + "Adding FREQ_2_6_GHZ."; + reference "1.1.2"; + } revision "2022-05-26" { description @@ -273,6 +279,12 @@ module openconfig-wifi-types { 6GHz frequencies."; } + identity FREQ_2_6_GHZ { + base OPERATING_FREQUENCY; + description "The Radio or SSID will be dual band; operating in 2.4 and + 6GHz frequencies."; + } + identity CLIENT_CAPABILITIES { description "Client capabilities, as reported by Association Request or From 771cd192d99e43ab8b1f55bdc0f33c443d63dfe1 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 17 Oct 2023 14:13:58 -0700 Subject: [PATCH 100/201] add NEXT-STATEMENT to policy-result-type (#949) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update release/models/policy/openconfig-routing-policy.yang * add continue to policy-result-type --------- Co-authored-by: Óscar González de Dios --- .../policy/openconfig-routing-policy.yang | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/release/models/policy/openconfig-routing-policy.yang b/release/models/policy/openconfig-routing-policy.yang index bf419b779..921e127e5 100644 --- a/release/models/policy/openconfig-routing-policy.yang +++ b/release/models/policy/openconfig-routing-policy.yang @@ -52,9 +52,14 @@ module openconfig-routing-policy { 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. + statement has a final disposition configured as policy result, either + accept-route or reject-route, evaluation of the current policy definition + stops, and no further policy statements are evaluated. In case there is a + policy chain, no further policy definitions in the chain are evaluated. + + If the action statement has the NEXT_STATEMENT policy result, all the + defined actions are executed and policy evaluation proceeds to the next + statement. The NEXT_STATEMENT is the default policy result action. If the condition is not satisfied, then evaluation proceeds to the next policy statement. If none of the policy statement @@ -77,7 +82,13 @@ module openconfig-routing-policy { the remaining conditions (using a modified route if the subroutine performed any changes to the route)."; - oc-ext:openconfig-version "3.3.0"; + oc-ext:openconfig-version "3.4.0"; + + revision "2023-10-11" { + description + "Add NEXT_STATEMENT policy-result-type enum value."; + reference "3.4.0"; + } revision "2022-05-24" { description @@ -162,12 +173,19 @@ module openconfig-routing-policy { typedef policy-result-type { type enumeration { enum ACCEPT_ROUTE { - description "Policy accepts the route"; + description "Policy accepts the route and evaluation of the + current policy definition stops."; } enum REJECT_ROUTE { - description "Policy rejects the route"; + description "Policy rejects the route and evaluation of the + current policy definition stops."; + } + enum NEXT_STATEMENT { + description "Any modifications of the route are preserved and the evaluation of the policy will continue to the + next statement."; } } + default NEXT_STATEMENT; description "Type used to specify route disposition in a policy chain"; From 0bd68159424078c8fbc3724a4bc1ef4e947eb3cf Mon Sep 17 00:00:00 2001 From: Mike Wiebe Date: Thu, 19 Oct 2023 14:15:50 -0400 Subject: [PATCH 101/201] Update to support multiple next-hops per L2RIB producer (#857) * Add L2RIB Per Producer Next-Hop Capability * Make next-hop-groups a leaf-list * mark l2rib next-hop property as deprecated --- .../openconfig-network-instance-l2.yang | 127 +++++++++++++++++- .../openconfig-network-instance.yang | 8 +- 2 files changed, 132 insertions(+), 3 deletions(-) diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index b9f4ede2f..46d433fd3 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,13 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.1.1"; + oc-ext:openconfig-version "4.2.0"; + + revision "2023-09-07" { + description + "Add L2RIB Per Producer Next-Hop Capability"; + reference "4.2.0"; + } revision "2023-08-09" { description @@ -545,6 +551,7 @@ submodule openconfig-network-instance-l2 { } } } + uses l2ni-l2rib-common-next-hop-group-state; uses l2ni-l2rib-common-next-hop-state; } @@ -606,6 +613,7 @@ submodule openconfig-network-instance-l2 { } } } + uses l2ni-l2rib-common-next-hop-group-state; uses l2ni-l2rib-common-next-hop-state; } } @@ -708,7 +716,10 @@ submodule openconfig-network-instance-l2 { leaf esi { type oc-evpn-types:esi; - description "Ethernet Segment Identifier for local and remote routes"; + description + "Ethernet Segment Identifier (ESI) for local and remote routes. + ESI is used to resolve the next-hop-group. All mac-addresses + learned with the same ESI should point to the same next-hop-group"; } leaf sticky { @@ -721,8 +732,16 @@ submodule openconfig-network-instance-l2 { type leafref { path "../../../../../../next-hops/next-hop/index"; } + status deprecated; description "Leafref next-hop for the MAC-IP table entry"; } + + leaf-list next-hop-group { + type leafref { + path "../../../../../../next-hop-groups/next-hop-group/id"; + } + description "Leafref next-hop-group for the MAC-IP table entry"; + } } grouping l2ni-l2rib-common-next-hop-state { @@ -757,11 +776,115 @@ submodule openconfig-network-instance-l2 { type oc-evpn-types:evi-id; description "Next hop label representing the l2vni for the route"; } + leaf esi { + type oc-evpn-types:esi; + description "Ethernet Segment Identifier (ESI)"; + reference "RFC7432: BGP MPLS-Based Ethernet VPN"; + } + leaf resolved { + type boolean; + description + "Indicates if the path is eligible for forwarding as per evpn mass + withdraw procedures as defined in RFC 7432"; + } uses oc-if:interface-ref-common; } } } } + + grouping l2ni-l2rib-common-next-hop-group-state { + description "L2RIB Common Next Hop Group Attributes Operational State Data Grouping"; + + container next-hop-groups { + description "Surrounding container for groups of L2RIB next-hops."; + list next-hop-group { + key "id"; + description + "An individual set of next-hops grouped into a common group. + Each entry within an L2RIB can optionally point to a + next-hop-group."; + + leaf id { + type leafref { + path "../state/id"; + } + description + "A reference to a unique identifier for the next-hop-group."; + } + container state { + description "State container for common next-hop-group attributes"; + config false; + leaf id { + type uint64; + description + "A unique identifier for the next-hop-group. This index is not + expected to be consistent across reboots, or reprogramming of + the next-hop-group. When updating a next-hop-group, if the group + is removed by the system or assigned an alternate identifier, the + system should send telemetry notifications deleting the previous + identifier. If the identifier of the next-hop-group is changed, + all L2RIB entries that reference it must also be updated."; + } + leaf esi { + type oc-evpn-types:esi; + description "Ethernet Segment Identifier (ESI)"; + reference "RFC7432: BGP MPLS-Based Ethernet VPN"; + } + leaf type { + type enumeration { + enum ESI { + description + "Per ESI pathlist next-hop-group used for evpn mass withdraw procedures as defined in RFC 7432"; + } + enum ESI_EVI { + description + "Per ESI,EVI pathlist next-hop-group used for evpn aliasing procedures as defined in RFC 7432"; + } + enum BASE_ECMP { + description + "Base ECMP next-hop-group used in absence of evpn aliasing"; + } + } + description "Type of next-hop-group"; + } + } + container next-hops { + description + "Surrounding container for the list of next-hops within the next-hop-group."; + list next-hop { + key "index"; + description + "An individual next-hop within the next-hop-group. Each next-hop is a + reference to an entry within the next-hop list."; + + leaf index { + type leafref { + path "../state/index"; + } + description + "A reference to the index for the next-hop within the the next-hop-group."; + } + container state { + description + "Operational state parameters related to a next-hop within the next-hop-group."; + config false; + leaf index { + type leafref { + path "../../../../../../next-hops/next-hop/index"; + } + description + "A reference to the identifier for the next-hop to which the entry in the + next-hop group corresponds."; + } + } + } + } + + } + } + } + grouping l2ni-l2rib-mac-table-producer-state { description "L2RIB MAC Table Operational State Data Grouping"; diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index 8f104d175..984425388 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,13 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.1.1"; + oc-ext:openconfig-version "4.2.0"; + + revision "2023-09-07" { + description + "Add L2RIB Per Producer Next-Hop Capability"; + reference "4.2.0"; + } revision "2023-08-09" { description From 0426774f2d7af0dc0a2b913893c8d45644176d65 Mon Sep 17 00:00:00 2001 From: romeyod <78448014+romeyod@users.noreply.github.com> Date: Fri, 27 Oct 2023 01:29:39 -0400 Subject: [PATCH 102/201] Add `next-hop-group-name` in NHG AFT entry state (#966) * * (M) aft/openconfig-aft-common.yang * (M) aft/openconfig-aft-common.yang * (M) aft/openconfig-aft-ethernet.yang * (M) aft/openconfig-aft-ipv4.yang * (M) aft/openconfig-aft-ipv6.yang * (M) aft/openconfig-aft-mpls.yang * (M) aft/openconfig-aft-pf.yang * (M) aft/openconfig-aft-state-synced.yang * (M) aft/openconfig-aft.yang - Add next-hop-group-name in NHG AFT entry state --- release/models/aft/openconfig-aft-common.yang | 16 +++++++++++++++- release/models/aft/openconfig-aft-ethernet.yang | 8 +++++++- release/models/aft/openconfig-aft-ipv4.yang | 8 +++++++- release/models/aft/openconfig-aft-ipv6.yang | 8 +++++++- release/models/aft/openconfig-aft-mpls.yang | 8 +++++++- release/models/aft/openconfig-aft-pf.yang | 8 +++++++- .../models/aft/openconfig-aft-state-synced.yang | 8 +++++++- release/models/aft/openconfig-aft.yang | 8 +++++++- 8 files changed, 64 insertions(+), 8 deletions(-) diff --git a/release/models/aft/openconfig-aft-common.yang b/release/models/aft/openconfig-aft-common.yang index b2c44dad6..51e527edd 100644 --- a/release/models/aft/openconfig-aft-common.yang +++ b/release/models/aft/openconfig-aft-common.yang @@ -23,7 +23,13 @@ submodule openconfig-aft-common { "Submodule containing definitions of groupings that are re-used across multiple contexts within the AFT model."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description @@ -579,6 +585,14 @@ submodule openconfig-aft-common { also be updated."; } + leaf next-hop-group-name { + type string; + description + "Where applicable, this leaf is a unique identifier string for the + next-hop-group. It is an arbitrary name for the group, that is + supported by vendors and is exposed for telemetry."; + } + leaf programmed-id { type uint64; description diff --git a/release/models/aft/openconfig-aft-ethernet.yang b/release/models/aft/openconfig-aft-ethernet.yang index d0b85dfc7..196447d97 100644 --- a/release/models/aft/openconfig-aft-ethernet.yang +++ b/release/models/aft/openconfig-aft-ethernet.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ethernet { "Submodule containing definitions of groupings for the abstract forwarding tables for Ethernet."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description diff --git a/release/models/aft/openconfig-aft-ipv4.yang b/release/models/aft/openconfig-aft-ipv4.yang index 04d4054c2..c887857cc 100644 --- a/release/models/aft/openconfig-aft-ipv4.yang +++ b/release/models/aft/openconfig-aft-ipv4.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ipv4 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv4."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description diff --git a/release/models/aft/openconfig-aft-ipv6.yang b/release/models/aft/openconfig-aft-ipv6.yang index 6b6cd1937..85ac46a97 100644 --- a/release/models/aft/openconfig-aft-ipv6.yang +++ b/release/models/aft/openconfig-aft-ipv6.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ipv6 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv6."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description diff --git a/release/models/aft/openconfig-aft-mpls.yang b/release/models/aft/openconfig-aft-mpls.yang index 4b4fd828c..6f07233e2 100644 --- a/release/models/aft/openconfig-aft-mpls.yang +++ b/release/models/aft/openconfig-aft-mpls.yang @@ -21,7 +21,13 @@ submodule openconfig-aft-mpls { "Submodule containing definitions of groupings for the abstract forwarding table for MPLS label forwarding."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description diff --git a/release/models/aft/openconfig-aft-pf.yang b/release/models/aft/openconfig-aft-pf.yang index 85ee9d78f..125b3d9a2 100644 --- a/release/models/aft/openconfig-aft-pf.yang +++ b/release/models/aft/openconfig-aft-pf.yang @@ -28,7 +28,13 @@ submodule openconfig-aft-pf { fields other than the destination address that is used in other forwarding tables."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description diff --git a/release/models/aft/openconfig-aft-state-synced.yang b/release/models/aft/openconfig-aft-state-synced.yang index a20dd9257..76f35975d 100644 --- a/release/models/aft/openconfig-aft-state-synced.yang +++ b/release/models/aft/openconfig-aft-state-synced.yang @@ -16,7 +16,13 @@ submodule openconfig-aft-state-synced { "Submodule containing definitions of groupings for the state synced signals corresponding to various abstract forwarding tables."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description diff --git a/release/models/aft/openconfig-aft.yang b/release/models/aft/openconfig-aft.yang index c204271de..4af67e426 100644 --- a/release/models/aft/openconfig-aft.yang +++ b/release/models/aft/openconfig-aft.yang @@ -42,7 +42,13 @@ module openconfig-aft { is referred to as an Abstract Forwarding Table (AFT), rather than the FIB."; - oc-ext:openconfig-version "2.3.0"; + oc-ext:openconfig-version "2.4.0"; + + revision "2023-09-26" { + description + "Add next-hop-group-name in NHG AFT entry state."; + reference "2.4.0"; + } revision "2023-04-19" { description From 34a30abbe10033b9f674939347dfde1ba03c7d9d Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 31 Oct 2023 09:59:20 -0700 Subject: [PATCH 103/201] Clarify default policy (#983) --- .../models/policy/openconfig-routing-policy.yang | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/release/models/policy/openconfig-routing-policy.yang b/release/models/policy/openconfig-routing-policy.yang index 921e127e5..2444f305d 100644 --- a/release/models/policy/openconfig-routing-policy.yang +++ b/release/models/policy/openconfig-routing-policy.yang @@ -80,9 +80,21 @@ module openconfig-routing-policy { 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)."; + subroutine performed any changes to the route). - oc-ext:openconfig-version "3.4.0"; + If a routing protocol is defined and the related + apply-policy/default-(import|export)-policy leaf is not set, the + default value for the default-(import|export)-policy leaf must be + applied. See RFC6020 7.6.1 which applies to this model."; + + oc-ext:openconfig-version "3.4.1"; + + revision "2023-10-24" { + description + "Clarify the use of default-(import|export)-policy when no policy + is applied to a protocol."; + reference "3.4.1"; + } revision "2023-10-11" { description From 5d8bc6a7006a29cfd91b2340ee57dc8d860ef178 Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Tue, 31 Oct 2023 18:16:03 -0400 Subject: [PATCH 104/201] Candidate Model for Repeated BGP set-communities/set-ext-communities (#968) * Change communiity-set-ref to leaf-list --- release/models/bgp/openconfig-bgp-policy.yang | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/release/models/bgp/openconfig-bgp-policy.yang b/release/models/bgp/openconfig-bgp-policy.yang index 05ae1bacb..c999d2941 100644 --- a/release/models/bgp/openconfig-bgp-policy.yang +++ b/release/models/bgp/openconfig-bgp-policy.yang @@ -28,7 +28,16 @@ module openconfig-bgp-policy { It augments the base routing-policy module with BGP-specific options for conditions and actions."; - oc-ext:openconfig-version "6.1.1"; + oc-ext:openconfig-version "6.2.0"; + + revision "2023-10-03" { + description + "Deprecate community-set-ref and ext-community-set-ref, + add the following leaf-list nodes: + * community-set-refs + * ext-community-set-refs"; + reference "6.2.0"; + } revision "2023-03-27" { description @@ -831,7 +840,19 @@ module openconfig-bgp-policy { "Configuration data for referening a community-set in the set-community action"; + leaf-list community-set-refs { + 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 list of defined community sets by name"; + } + leaf community-set-ref { + status deprecated; type leafref { path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" + "oc-bgp-pol:bgp-defined-sets/" + @@ -994,7 +1015,21 @@ module openconfig-bgp-policy { "Configuration data for referening a extended community-set in the set-ext-community action"; + leaf-list ext-community-set-refs { + 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 list of defined extended community sets by + name"; + } + leaf ext-community-set-ref { + status deprecated; type leafref { path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" + "oc-bgp-pol:bgp-defined-sets/" + From 1370303d273184569cad4e9c867933e66ff97406 Mon Sep 17 00:00:00 2001 From: Roland Phung Date: Wed, 1 Nov 2023 23:04:56 -0700 Subject: [PATCH 105/201] Add BGP default import/export policy into global config (#970) * Add the following paths into bgp/global and bgp/global/afi-safis/afi-safi/ * apply-policy/default-import-policy * Refactored apply-policy grouping to separate default from regular policy --- .../openconfig-bgp-common-multiprotocol.yang | 8 ++- .../bgp/openconfig-bgp-common-structure.yang | 8 ++- release/models/bgp/openconfig-bgp-common.yang | 8 ++- release/models/bgp/openconfig-bgp-global.yang | 11 ++- .../models/bgp/openconfig-bgp-neighbor.yang | 8 ++- .../models/bgp/openconfig-bgp-peer-group.yang | 8 ++- release/models/bgp/openconfig-bgp.yang | 8 ++- release/models/isis/openconfig-isis-lsp.yang | 9 ++- .../models/isis/openconfig-isis-routing.yang | 9 ++- release/models/isis/openconfig-isis.yang | 10 ++- .../openconfig-network-instance-l2.yang | 9 ++- .../openconfig-network-instance.yang | 10 ++- .../openconfig-ospfv2-area-interface.yang | 9 ++- .../models/ospf/openconfig-ospfv2-area.yang | 9 ++- .../models/ospf/openconfig-ospfv2-common.yang | 9 ++- .../models/ospf/openconfig-ospfv2-global.yang | 12 +++- .../models/ospf/openconfig-ospfv2-lsdb.yang | 9 ++- release/models/ospf/openconfig-ospfv2.yang | 11 ++- .../policy/openconfig-routing-policy.yang | 68 +++++++++++++++++-- 19 files changed, 209 insertions(+), 24 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang index 60f4d67d6..e85eca584 100644 --- a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang +++ b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang @@ -24,7 +24,13 @@ submodule openconfig-bgp-common-multiprotocol { for multiple protocols in BGP. The groupings are common across multiple contexts."; - oc-ext:openconfig-version "9.4.1"; + oc-ext:openconfig-version "9.5.0"; + + revision "2023-11-01" { + description + "Add default apply policy to global and per afi-safi config."; + reference "9.5.0"; + } revision "2023-06-27" { description diff --git a/release/models/bgp/openconfig-bgp-common-structure.yang b/release/models/bgp/openconfig-bgp-common-structure.yang index a73bc9d46..92ea39425 100644 --- a/release/models/bgp/openconfig-bgp-common-structure.yang +++ b/release/models/bgp/openconfig-bgp-common-structure.yang @@ -21,7 +21,13 @@ submodule openconfig-bgp-common-structure { "This sub-module contains groupings that are common across multiple BGP contexts and provide structure around other primitive groupings."; - oc-ext:openconfig-version "9.4.1"; + oc-ext:openconfig-version "9.5.0"; + + revision "2023-11-01" { + description + "Add default apply policy to global and per afi-safi config."; + reference "9.5.0"; + } revision "2023-06-27" { description diff --git a/release/models/bgp/openconfig-bgp-common.yang b/release/models/bgp/openconfig-bgp-common.yang index 7cad2ac6f..07d38a027 100644 --- a/release/models/bgp/openconfig-bgp-common.yang +++ b/release/models/bgp/openconfig-bgp-common.yang @@ -24,7 +24,13 @@ submodule openconfig-bgp-common { may be application to a subset of global, peer-group or neighbor contexts."; - oc-ext:openconfig-version "9.4.1"; + oc-ext:openconfig-version "9.5.0"; + + revision "2023-11-01" { + description + "Add default apply policy to global and per afi-safi config."; + reference "9.5.0"; + } revision "2023-06-27" { description diff --git a/release/models/bgp/openconfig-bgp-global.yang b/release/models/bgp/openconfig-bgp-global.yang index f3ceff357..761becbf1 100644 --- a/release/models/bgp/openconfig-bgp-global.yang +++ b/release/models/bgp/openconfig-bgp-global.yang @@ -7,6 +7,7 @@ submodule openconfig-bgp-global { import openconfig-extensions { prefix oc-ext; } import openconfig-yang-types { prefix oc-yang; } import openconfig-inet-types { prefix oc-inet; } + import openconfig-routing-policy { prefix oc-rpol; } // Include common submodules include openconfig-bgp-common; @@ -26,7 +27,13 @@ submodule openconfig-bgp-global { "This sub-module contains groupings that are specific to the global context of the OpenConfig BGP module"; - oc-ext:openconfig-version "9.4.1"; + oc-ext:openconfig-version "9.5.0"; + + revision "2023-11-01" { + description + "Add default apply policy to global and per afi-safi config."; + reference "9.5.0"; + } revision "2023-06-27" { description @@ -397,6 +404,7 @@ submodule openconfig-bgp-global { uses bgp-common-global-group-use-multiple-paths; uses bgp-common-structure-neighbor-group-add-paths; uses bgp-global-mp-all-afi-safi-list-contents; + uses oc-rpol:default-policy-group; } } @@ -482,6 +490,7 @@ submodule openconfig-bgp-global { } uses bgp-global-dynamic-neighbors; + uses oc-rpol:default-policy-group; } } diff --git a/release/models/bgp/openconfig-bgp-neighbor.yang b/release/models/bgp/openconfig-bgp-neighbor.yang index 1b76c81a6..830c76d91 100644 --- a/release/models/bgp/openconfig-bgp-neighbor.yang +++ b/release/models/bgp/openconfig-bgp-neighbor.yang @@ -30,7 +30,13 @@ submodule openconfig-bgp-neighbor { "This sub-module contains groupings that are specific to the neighbor context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.4.1"; + oc-ext:openconfig-version "9.5.0"; + + revision "2023-11-01" { + description + "Add default apply policy to global and per afi-safi config."; + reference "9.5.0"; + } revision "2023-06-27" { description diff --git a/release/models/bgp/openconfig-bgp-peer-group.yang b/release/models/bgp/openconfig-bgp-peer-group.yang index 438ee5005..84c12d090 100644 --- a/release/models/bgp/openconfig-bgp-peer-group.yang +++ b/release/models/bgp/openconfig-bgp-peer-group.yang @@ -25,7 +25,13 @@ submodule openconfig-bgp-peer-group { "This sub-module contains groupings that are specific to the peer-group context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.4.1"; + oc-ext:openconfig-version "9.5.0"; + + revision "2023-11-01" { + description + "Add default apply policy to global and per afi-safi config."; + reference "9.5.0"; + } revision "2023-06-27" { description diff --git a/release/models/bgp/openconfig-bgp.yang b/release/models/bgp/openconfig-bgp.yang index b9e9b2f07..6d28c872e 100644 --- a/release/models/bgp/openconfig-bgp.yang +++ b/release/models/bgp/openconfig-bgp.yang @@ -68,7 +68,13 @@ module openconfig-bgp { whereas leaf not present inherits its value from the leaf present at the next higher level in the hierarchy."; - oc-ext:openconfig-version "9.4.1"; + oc-ext:openconfig-version "9.5.0"; + + revision "2023-11-01" { + description + "Add default apply policy to global and per afi-safi config."; + reference "9.5.0"; + } revision "2023-06-27" { description diff --git a/release/models/isis/openconfig-isis-lsp.yang b/release/models/isis/openconfig-isis-lsp.yang index a8415a632..95d31837e 100644 --- a/release/models/isis/openconfig-isis-lsp.yang +++ b/release/models/isis/openconfig-isis-lsp.yang @@ -34,7 +34,14 @@ submodule openconfig-isis-lsp { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "1.6.0"; + oc-ext:openconfig-version "1.6.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "1.6.1"; + } revision "2023-05-01" { description diff --git a/release/models/isis/openconfig-isis-routing.yang b/release/models/isis/openconfig-isis-routing.yang index df8af637b..56f0faed4 100644 --- a/release/models/isis/openconfig-isis-routing.yang +++ b/release/models/isis/openconfig-isis-routing.yang @@ -20,7 +20,14 @@ submodule openconfig-isis-routing { description "This module describes YANG model for ISIS Routing"; - oc-ext:openconfig-version "1.6.0"; + oc-ext:openconfig-version "1.6.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "1.6.1"; + } revision "2023-05-01" { description diff --git a/release/models/isis/openconfig-isis.yang b/release/models/isis/openconfig-isis.yang index a27a82f76..fe99d4024 100644 --- a/release/models/isis/openconfig-isis.yang +++ b/release/models/isis/openconfig-isis.yang @@ -54,7 +54,14 @@ module openconfig-isis { +-> { levels config } +-> { level adjacencies }"; - oc-ext:openconfig-version "1.6.0"; + oc-ext:openconfig-version "1.6.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "1.6.1"; + } revision "2023-05-01" { description @@ -978,6 +985,7 @@ module openconfig-isis { "Policy governing the propagation of prefixes between levels."; uses oc-rpol:apply-policy-import-config; + uses oc-rpol:default-policy-import-config; } grouping isis-mpls-config { diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index 46d433fd3..2f93312ca 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,14 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.2.0"; + oc-ext:openconfig-version "4.2.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "4.2.1"; + } revision "2023-09-07" { description diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index 984425388..d680f4a9a 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,14 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.2.0"; + oc-ext:openconfig-version "4.2.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "4.2.1"; + } revision "2023-09-07" { description @@ -1223,6 +1230,7 @@ module openconfig-network-instance { } uses oc-rpol:apply-policy-import-config; + uses oc-rpol:default-policy-import-config; } grouping network-instance-config { diff --git a/release/models/ospf/openconfig-ospfv2-area-interface.yang b/release/models/ospf/openconfig-ospfv2-area-interface.yang index 92cfdd7f9..3045ad03c 100644 --- a/release/models/ospf/openconfig-ospfv2-area-interface.yang +++ b/release/models/ospf/openconfig-ospfv2-area-interface.yang @@ -25,7 +25,14 @@ submodule openconfig-ospfv2-area-interface { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.5.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "0.5.1"; + } revision "2023-08-25" { description diff --git a/release/models/ospf/openconfig-ospfv2-area.yang b/release/models/ospf/openconfig-ospfv2-area.yang index 1ff82db2b..e0f0020f8 100644 --- a/release/models/ospf/openconfig-ospfv2-area.yang +++ b/release/models/ospf/openconfig-ospfv2-area.yang @@ -23,7 +23,14 @@ submodule openconfig-ospfv2-area { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.5.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "0.5.1"; + } revision "2023-08-25" { description diff --git a/release/models/ospf/openconfig-ospfv2-common.yang b/release/models/ospf/openconfig-ospfv2-common.yang index 8a90fcc58..8bfd890b4 100644 --- a/release/models/ospf/openconfig-ospfv2-common.yang +++ b/release/models/ospf/openconfig-ospfv2-common.yang @@ -17,7 +17,14 @@ submodule openconfig-ospfv2-common { "This submodule provides OSPFv2 configuration and operational state parameters that are shared across multiple contexts"; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.5.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "0.5.1"; + } revision "2023-08-25" { description diff --git a/release/models/ospf/openconfig-ospfv2-global.yang b/release/models/ospf/openconfig-ospfv2-global.yang index 73007d05e..e6c0256ec 100644 --- a/release/models/ospf/openconfig-ospfv2-global.yang +++ b/release/models/ospf/openconfig-ospfv2-global.yang @@ -23,13 +23,20 @@ submodule openconfig-ospfv2-global { "This submodule provides OSPFv2 configuration and operational state parameters that are global to a particular OSPF instance"; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.5.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "0.5.1"; + } revision "2023-08-25" { description "Add leaf metric to lsdb-summary-lsa-state."; reference "0.5.0"; -} + } revision "2023-08-09" { description @@ -317,6 +324,7 @@ submodule openconfig-ospfv2-global { } uses oc-rpol:apply-policy-import-config; + uses oc-rpol:default-policy-import-config; } grouping ospfv2-global-max-metric-config { diff --git a/release/models/ospf/openconfig-ospfv2-lsdb.yang b/release/models/ospf/openconfig-ospfv2-lsdb.yang index 35599a961..e1eda9fdd 100644 --- a/release/models/ospf/openconfig-ospfv2-lsdb.yang +++ b/release/models/ospf/openconfig-ospfv2-lsdb.yang @@ -22,7 +22,14 @@ submodule openconfig-ospfv2-lsdb { "An OpenConfig model for the Open Shortest Path First (OSPF) version 2 link-state database (LSDB)"; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.5.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "0.5.1"; + } revision "2023-08-25" { description diff --git a/release/models/ospf/openconfig-ospfv2.yang b/release/models/ospf/openconfig-ospfv2.yang index bce9391ac..fb5a7e031 100644 --- a/release/models/ospf/openconfig-ospfv2.yang +++ b/release/models/ospf/openconfig-ospfv2.yang @@ -34,13 +34,20 @@ module openconfig-ospfv2 { "An OpenConfig model for Open Shortest Path First (OSPF) version 2"; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.5.1"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "0.5.1"; + } revision "2023-08-25" { description "Add leaf metric to lsdb-summary-lsa-state."; reference "0.5.0"; -} + } revision "2023-08-09" { description diff --git a/release/models/policy/openconfig-routing-policy.yang b/release/models/policy/openconfig-routing-policy.yang index 2444f305d..8a61d8be0 100644 --- a/release/models/policy/openconfig-routing-policy.yang +++ b/release/models/policy/openconfig-routing-policy.yang @@ -87,7 +87,14 @@ module openconfig-routing-policy { default value for the default-(import|export)-policy leaf must be applied. See RFC6020 7.6.1 which applies to this model."; - oc-ext:openconfig-version "3.4.1"; + oc-ext:openconfig-version "3.4.2"; + + revision "2023-11-01" { + description + "Refactor apply policy to separate default policy in it's own common + set of groupings"; + reference "3.4.2"; + } revision "2023-10-24" { description @@ -1211,6 +1218,11 @@ module openconfig-routing-policy { for the current peer group, neighbor, address family, etc."; } + } + + grouping default-policy-import-config { + description + "Configuration data for default import policy"; leaf default-import-policy { type default-policy-type; @@ -1219,7 +1231,6 @@ module openconfig-routing-policy { "explicitly set a default policy if no policy definition in the import policy chain is satisfied."; } - } grouping apply-policy-export-config { @@ -1241,6 +1252,11 @@ module openconfig-routing-policy { for the current peer group, neighbor, address family, etc."; } + } + + grouping default-policy-export-config { + description + "Configuration data for default export policy"; leaf default-export-policy { type default-policy-type; @@ -1251,22 +1267,37 @@ module openconfig-routing-policy { } } - grouping apply-policy-config { description "Configuration data for routing policies"; uses apply-policy-import-config; uses apply-policy-export-config; - + uses default-policy-config; } + grouping default-policy-config { + description + "Configuration data for default routing policies"; + uses default-policy-import-config; + uses default-policy-export-config; + } grouping apply-policy-state { description "Operational state associated with routing policy"; + uses default-policy-state; + + //TODO: identify additional state data beyond the intended + //policy configuration. + } + + grouping default-policy-state { + description + "Operational state associated with routing policy"; + //TODO: identify additional state data beyond the intended //policy configuration. } @@ -1303,6 +1334,35 @@ module openconfig-routing-policy { } } + grouping default-policy-group { + description + "Top level container for default routing policy applications."; + + 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 default-policy-config; + } + + container state { + config false; + description + "Operational state for routing policy"; + + uses default-policy-config; + uses default-policy-state; + } + } + } + uses routing-policy-top; } From dccd493ee4802f8edbe465915d43fb1b7175b34c Mon Sep 17 00:00:00 2001 From: atmanmehta <62303086+atmanmehta@users.noreply.github.com> Date: Thu, 2 Nov 2023 10:24:00 -0700 Subject: [PATCH 106/201] Link damping (#947) * Add support for penalty-based-aied. This is a link damping algorithm that is mutually exclusive from hold time --------- Co-authored-by: wenovus --- .../interfaces/openconfig-interfaces.yang | 90 ++++++++++++++++++- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/release/models/interfaces/openconfig-interfaces.yang b/release/models/interfaces/openconfig-interfaces.yang index 9589c2cb2..248b5f71d 100644 --- a/release/models/interfaces/openconfig-interfaces.yang +++ b/release/models/interfaces/openconfig-interfaces.yang @@ -51,7 +51,13 @@ module openconfig-interfaces { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.5.0"; + oc-ext:openconfig-version "3.6.0"; + revision "2023-08-29" { + description + "Add augment for penalty-based additive-increase, exponential-decrease link damping algorithm."; + reference + "3.6.0"; + } revision "2023-07-14" { description @@ -497,6 +503,75 @@ module openconfig-interfaces { } } + grouping interface-link-damping-config { + description + "Configuration data for interface link damping settings."; + + leaf max-suppress-time { + type uint32; + units milliseconds; + default 0; + description + "Maximum time an interface can remain damped since the last link down event no matter how unstable it has been prior to this period of stability. In a damped state, the interface’s state change will not be advertised."; + } + + leaf decay-half-life { + type uint32; + units milliseconds; + default 0; + description + "The amount of time after which an interface’s penalty is decreased by half. Decay-half-time should not be more than max-suppress-time."; + } + + leaf suppress-threshold { + type uint32; + default 0; + description + "The accumulated penalty that triggers the damping of an interface. A value of 0 indicates config is disabled."; + } + + leaf reuse-threshold { + type uint32; + default 0; + description + "When the accumulated penalty decreases to this reuse threshold, the interface is not damped anymore. Interface state changes are advertised to applications. A value of 0 indicates config is disabled."; + } + + leaf flap-penalty { + type uint32; + default 0; + description + "A penalty that each down event costs. A value of 0 indicates the config is disabled."; + } + } + grouping interface-link-damping-state { + description + "Operational state data for interface link damping settings."; + } + grouping link-damping-top { + description + "Top level grouping for link damping parameters."; + + container penalty-based-aied { + description + "Top level container to suppress UP->DOWN link events using a penalty based additive-increase, exponential-decrease algorithm."; + + container config { + description + "Configuration data for link damping settings."; + uses interface-link-damping-config; + } + + container state { + config false; + description + "Operational state data for link damping settings."; + uses interface-link-damping-config; + uses interface-link-damping-state; + } + } + } + grouping interface-common-state { description "Operational state data (in addition to intended configuration) @@ -1221,7 +1296,16 @@ module openconfig-interfaces { } } - uses interface-phys-holdtime-top; + uses interface-phys-holdtime-top { + when "./penalty-based-aied/config/suppress-threshold = 0 + or ./penalty-based-aied/config/reuse-threshold = 0 + or ./penalty-based-aied/config/flap-penalty = 0" { + description + "Hold time and penalty-based-aied are two algorithms to suppress + link transitions and must be mutually exclusive."; + } + } + uses link-damping-top; uses subinterfaces-top; } } @@ -1229,4 +1313,4 @@ module openconfig-interfaces { uses interfaces-top; -} +} \ No newline at end of file From 025b0ee222358562b993e5216209600de9416dd0 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Fri, 3 Nov 2023 16:40:04 -0700 Subject: [PATCH 107/201] Revert "Added new model for route summary (#783)" (#992) This reverts commit 19be716b607a9ac0f9145af994c8d11d63027e77. --- release/models/network-instance/.spec.yml | 2 - .../openconfig-route-summary.yang | 112 ------------------ 2 files changed, 114 deletions(-) delete mode 100644 release/models/network-instance/openconfig-route-summary.yang diff --git a/release/models/network-instance/.spec.yml b/release/models/network-instance/.spec.yml index 9874ec073..615cf82ef 100644 --- a/release/models/network-instance/.spec.yml +++ b/release/models/network-instance/.spec.yml @@ -5,7 +5,6 @@ - yang/network-instance/openconfig-evpn-types.yang - yang/network-instance/openconfig-evpn.yang - yang/network-instance/openconfig-programming-errors.yang - - yang/network-instance/openconfig-route-summary.yang - yang/aft/openconfig-aft-network-instance.yang - yang/segment-routing/openconfig-rsvp-sr-ext.yang - yang/segment-routing/openconfig-segment-routing.yang @@ -13,7 +12,6 @@ build: - yang/network-instance/openconfig-network-instance.yang - yang/network-instance/openconfig-programming-errors.yang - - yang/network-instance/openconfig-route-summary.yang - yang/aft/openconfig-aft-network-instance.yang - yang/segment-routing/openconfig-rsvp-sr-ext.yang run-ci: true diff --git a/release/models/network-instance/openconfig-route-summary.yang b/release/models/network-instance/openconfig-route-summary.yang deleted file mode 100644 index 169894b32..000000000 --- a/release/models/network-instance/openconfig-route-summary.yang +++ /dev/null @@ -1,112 +0,0 @@ -module openconfig-route-summary { - yang-version "1"; - - namespace "http://openconfig.net/yang/route-summary"; - - prefix "oc-rtsummary"; - - import openconfig-extensions { prefix "oc-ext"; } - import openconfig-yang-types { prefix "oc-yang-types"; } - import openconfig-policy-types { prefix "oc-pol-types"; } - import openconfig-network-instance { prefix "oc-ni"; } - - organization - "OpenConfig working group"; - - contact - "OpenConfig working group - www.openconfig.net"; - - description - "This module provides summary of route counts per route type for each network - instance."; - - oc-ext:openconfig-version "1.0.0"; - - revision "2022-12-21" { - description - "Initial version."; - reference "1.0.0"; - } - - grouping route-counter { - description - "Route type counter item."; - - leaf origin-protocol { - description - "Route type that keys the route count list."; - - type identityref { - base "oc-pol-types:INSTALL_PROTOCOL_TYPE"; - } - } - - container total-count { - description - "A collection of route counts."; - uses total-count; - } - } - - grouping total-count { - description - "A collection of route counts."; - - leaf fib-count { - description - "Total number of routes in the FIB."; - type oc-yang-types:counter64; - } - } - - grouping route-summary { - description - "A summary of route count by route type."; - - list route-count { - key "origin-protocol"; - - description - "Route types that keys the route count list."; - - leaf origin-protocol { - type leafref { - path "../state/origin-protocol"; - } - description - "Reference to the source of the route."; - } - - container state { - description - "State parameters for the route summary list entry."; - uses route-counter; - } - } - } - - augment "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:afts/oc-ni:ipv6-unicast" { - description - "Augment the network-instance model with the route summary container for - IPv4."; - - container summary { - uses route-summary; - description - "IPv4 route summary for the network instance."; - } - } - - augment "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:afts/oc-ni:ipv4-unicast" { - description - "Augment the network-instance model with the route summary container for - IPv6."; - - container summary { - uses route-summary; - description - "IPv6 route summary for the network instance."; - } - } -} From c4ff974dc48bf4385ddbe1041a575cf405e8913f Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Mon, 13 Nov 2023 19:26:09 -0500 Subject: [PATCH 108/201] add ygnmi to CI (#998) --- cloudbuild.yaml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index ff235983e..4a3d82970 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,7 @@ steps: git clone git@github.com:openconfig/models-ci.git /go/src/github.com/openconfig/models-ci cd /go/src/github.com/openconfig/models-ci # Modify the major version to update models-ci version. - branch=$(git tag -l 'v12.*' | sort -V | tail -1) + branch=$(git tag -l 'v13.*' | sort -V | tail -1) git checkout $branch volumes: - name: 'ssh' @@ -229,6 +229,24 @@ steps: waitFor: ['validator prep', 'go path creation', 'oc-pyang'] id: 'goyang-ygot' +############### YGNMI ############### +- name: 'us-west1-docker.pkg.dev/$PROJECT_ID/models-ci/models-ci-image' + entrypoint: 'bash' + args: ['-c', "/go/src/github.com/openconfig/models-ci/validators/ygnmi/test.sh"] + secretEnv: ['GITHUB_ACCESS_TOKEN'] + volumes: + - name: 'gopath' + path: /go + env: + - 'GOPATH=/go' + - '_PR_NUMBER=$_PR_NUMBER' + - '_MODEL_ROOT=$_MODEL_ROOT' + - 'COMMIT_SHA=$COMMIT_SHA' + - '_REPO_SLUG=$_REPO_SLUG' + - 'BRANCH_NAME=$BRANCH_NAME' + waitFor: ['validator prep', 'go path creation', 'oc-pyang'] + id: 'ygnmi' + ############### PYANG ############### - name: 'us-west1-docker.pkg.dev/$PROJECT_ID/models-ci/models-ci-image' entrypoint: 'bash' From 28a7b6b726c134140bebdd64f08f34f7dca1c459 Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Tue, 14 Nov 2023 12:07:06 -0500 Subject: [PATCH 109/201] Update README.md with ygnmi badge (#999) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 236c7d979..83ae80d5c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![OpenConfig Linter](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:oc-pyang.svg)](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:oc-pyang.html) [![pyangbind](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:pyangbind.svg)](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:pyangbind.html) [![goyang/ygot](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:goyang-ygot.svg)](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:goyang-ygot.html) +[![ygnmi](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:ygnmi.svg)](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:ygnmi.html) [![yanglint](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:yanglint.svg)](https://storage.googleapis.com/openconfig/compatibility-badges/openconfig-public:yanglint.html) # OpenConfig From adf582e54f778d41092967b6b4bea85107f9935d Mon Sep 17 00:00:00 2001 From: sachendras <44847441+sachendras@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:23:57 -0800 Subject: [PATCH 110/201] Update openconfig-network-instance.yang (#987) * Clarify network_instance_redistribution and default route policy --------- Co-authored-by: Darren Loher Co-authored-by: Wen Bo Li <50884368+wenovus@users.noreply.github.com> --- doc/network_instance_redistribution.md | 5 ++++- .../openconfig-network-instance-l2.yang | 8 +++++++- .../openconfig-network-instance.yang | 12 +++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/doc/network_instance_redistribution.md b/doc/network_instance_redistribution.md index e531a66b4..d35b67fdd 100644 --- a/doc/network_instance_redistribution.md +++ b/doc/network_instance_redistribution.md @@ -22,7 +22,8 @@ In numerous use cases an operator wishes to take routes that exist in one protoc In those implementations that maintain a (virtual-) RIB per protocol, the operator must configure explicit connections between these tables, usually alongside a policy to allow such inter-protocol advertisement to occur. While no such configuration is required in those implementations that utilise a single RIB, it is notable that even in these implementations a protocol will not advertise another protocol's routes from the RIB by default (since such a setup would mean that for instance, the BGP DFZ would be re-advertised into the IGP at peering edge devices, which is clearly not desirable). Instead, an operator must create explicit configuration that matches routes installed into the RIB by a particular protocol, and then "import" these routes into the protocol that is expected to advertise them. -In this latter case, the use of an import policy within a particular protocol instance is equivalent to the former - with the only difference being the context in which the policy is defined. With a table per protocol, an explicit configuration of redistributing routes from protocol A to protocol B is specified. In the latter case, the target protocol (protocol B) is specified, and a policy is used to select the source protocols from which routes may be imported for advertisement. +In this latter case, the use of an import policy within a particular protocol instance is equivalent to the former - with the only difference being the context in which the policy is defined. With a table per protocol, an explicit configuration of redistributing routes from protocol A to protocol B is specified. In the latter case, the target protocol (protocol B) is specified, and a policy is used to select the source protocols from which routes may be imported for advertisement. +In both cases, the destination protocol (protocol B) only installs the redistributed routes from the source protocol (protocol A) in its "advertisement RIB view". The redistributed routes are not installed in the FIB (forwarding information base) and therefore are not used for forwarding. ## OpenConfig Approach to Protocol RIB Interconnection @@ -35,6 +36,8 @@ An OpenConfig `routing-policy` is specified along with the connection - allowing It is expected that protocol-specific attributes (e.g., BGP communities) are set by such an import policy, allowing routes that are redistributed to carry information relating to their source (e.g., an IGP route may be tagged with a specific community using policy to indicate its provenance). +In the absense of an import-policy for table-connections, default-import-policy should take effect. In the absence of both, no routes should be allowed to be redistributed. + ## Examples of OpenConfig Network instance ### Example: Aggregate Routes Redistributed to IS-IS Level 2 diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index 2f93312ca..16a41451d 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,13 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.2.1"; + oc-ext:openconfig-version "4.2.2"; + + revision "2023-11-03" { + description + "Add reference URL for Route Redistribution rules"; + reference "4.2.2"; + } revision "2023-11-01" { description diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index d680f4a9a..ee5b5a740 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,13 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.2.1"; + oc-ext:openconfig-version "4.2.2"; + + revision "2023-11-03" { + description + "Add reference URL for Route Redistribution rules"; + reference "4.2.2"; + } revision "2023-11-01" { description @@ -487,6 +493,10 @@ module openconfig-network-instance { for the connection are available for the destination protocol to advertise, or match within its policies."; + reference + "Route Redistribution in OpenConfig Network Instance: + https://github.com/openconfig/public/blob/master/doc/network_instance_redistribution.md#interconnection-of-protocol-ribs"; + leaf src-protocol { type leafref { path "../config/src-protocol"; From 48d0a7dce71389dc399cf5b47cd9d2472ce1b68c Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:01:58 -0800 Subject: [PATCH 111/201] Use updated breaking change CI script (#1003) --- .github/workflows/diff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 0a39c6487..1775e77ff 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -22,7 +22,7 @@ jobs: - name: Install openconfig-ci CLI run: | - go install github.com/openconfig/models-ci/openconfig-ci@c880ed2 + go install github.com/openconfig/models-ci/openconfig-ci@05dd074 - name: Make sure all backward-incompatible changes are covered by version changes. id: check From 4d313589ea2afe6cbe89e2eb4ad14d113f86c00e Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 21 Nov 2023 09:29:39 -0800 Subject: [PATCH 112/201] Introduce refactored aft summary model (#997) * add refactored aft summary model --- release/models/aft/.spec.yml | 2 + .../models/aft/openconfig-aft-summary.yang | 120 ++++++++++++++++++ release/models/network-instance/.spec.yml | 11 +- 3 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 release/models/aft/openconfig-aft-summary.yang diff --git a/release/models/aft/.spec.yml b/release/models/aft/.spec.yml index 6320b2469..fd1079c0b 100644 --- a/release/models/aft/.spec.yml +++ b/release/models/aft/.spec.yml @@ -2,7 +2,9 @@ docs: - yang/aft/openconfig-aft.yang - yang/aft/openconfig-aft-types.yang + - yang/aft/openconfig-aft-summary.yang build: - yang/network-instance/openconfig-network-instance.yang - yang/aft/openconfig-aft-network-instance.yang + - yang/aft/openconfig-aft-summary.yang run-ci: true diff --git a/release/models/aft/openconfig-aft-summary.yang b/release/models/aft/openconfig-aft-summary.yang new file mode 100644 index 000000000..a3fae3a26 --- /dev/null +++ b/release/models/aft/openconfig-aft-summary.yang @@ -0,0 +1,120 @@ +module openconfig-aft-summary { + yang-version "1"; + + namespace "http://openconfig.net/yang/aft-summary"; + + prefix "oc-aftsummary"; + + import openconfig-extensions { prefix "oc-ext"; } + import openconfig-yang-types { prefix "oc-yang-types"; } + import openconfig-policy-types { prefix "oc-pol-types"; } + import openconfig-network-instance { prefix "oc-ni"; } + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module provides summary of aft entry counts per protocol type for each network + instance."; + + oc-ext:openconfig-version "0.1.0"; + + revision "2023-11-09" { + description + "Initial version."; + reference "0.1.0"; + } + + grouping protocols-state { + description + "Grouping for protocol type state."; + + leaf origin-protocol { + description + "Protocol type that keys the protocol list."; + + type identityref { + base "oc-pol-types:INSTALL_PROTOCOL_TYPE"; + } + } + + container counters { + description + "Enclosing container for aft entry counters"; + + leaf aft-entries { + description + "Total number of entries in the aft."; + type oc-yang-types:counter64; + } + } + } + + grouping aft-summary { + description + "A summary of aft entries by protocol type."; + + container protocols { + description + "Enclosing container for a list of protocols"; + list protocol { + key "origin-protocol"; + + description + "Protocol type that keys the aft entry count list."; + + leaf origin-protocol { + type leafref { + path "../state/origin-protocol"; + } + description + "Reference to the protocol type which added the aft entry."; + } + + container state { + description + "State parameters for the aft entry list."; + uses protocols-state; + } + } + } + } + + grouping aft-summary-ipv4 { + description + "Grouping of all aft summaries for ipv4."; + container ipv4-unicast { + description + "Container for ipv4 unicast aft summary by protocol type."; + uses aft-summary; + } + } + + grouping aft-summary-ipv6 { + description + "Grouping of all aft summaries for ipv6."; + container ipv6-unicast { + description + "Container for ipv6 aft counts by protocol type."; + uses aft-summary; + } + } + + augment "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:afts" { + description + "Augment the afts model with the aft summary container."; + + container aft-summaries { + uses aft-summary-ipv4; + uses aft-summary-ipv6; + + description + "Aft summary for the network instance."; + } + } + +} diff --git a/release/models/network-instance/.spec.yml b/release/models/network-instance/.spec.yml index 615cf82ef..992b4a491 100644 --- a/release/models/network-instance/.spec.yml +++ b/release/models/network-instance/.spec.yml @@ -1,18 +1,21 @@ - name: openconfig-network-instance docs: - - yang/network-instance/openconfig-network-instance-types.yang - - yang/network-instance/openconfig-network-instance.yang + - yang/aft/openconfig-aft-network-instance.yang + - yang/aft/openconfig-aft-summary.yang - yang/network-instance/openconfig-evpn-types.yang - yang/network-instance/openconfig-evpn.yang + - yang/network-instance/openconfig-network-instance-types.yang + - yang/network-instance/openconfig-network-instance.yang - yang/network-instance/openconfig-programming-errors.yang - - yang/aft/openconfig-aft-network-instance.yang - yang/segment-routing/openconfig-rsvp-sr-ext.yang - yang/segment-routing/openconfig-segment-routing.yang - yang/rib/openconfig-rib-bgp-ext.yang + build: + - yang/aft/openconfig-aft-network-instance.yang + - yang/aft/openconfig-aft-summary.yang - yang/network-instance/openconfig-network-instance.yang - yang/network-instance/openconfig-programming-errors.yang - - yang/aft/openconfig-aft-network-instance.yang - yang/segment-routing/openconfig-rsvp-sr-ext.yang run-ci: true - name: openconfig-network-instance-bgp-rib-augment From 4e6c1bf524708b8dcd71ac5ffcb1e01dd3b01c4c Mon Sep 17 00:00:00 2001 From: sallylsy <108024270+sallylsy@users.noreply.github.com> Date: Tue, 21 Nov 2023 16:15:37 -0800 Subject: [PATCH 113/201] Add hashing model (#959) * Add traffic load balancing hashing model in OC --------- Co-authored-by: Darren Loher --- release/models/system/.spec.yml | 7 + release/models/system/openconfig-hashing.yang | 366 ++++++++++++++++++ 2 files changed, 373 insertions(+) create mode 100644 release/models/system/openconfig-hashing.yang diff --git a/release/models/system/.spec.yml b/release/models/system/.spec.yml index 9cd6c6222..de5ecc001 100644 --- a/release/models/system/.spec.yml +++ b/release/models/system/.spec.yml @@ -7,6 +7,7 @@ - yang/system/openconfig-aaa-types.yang - yang/system/openconfig-alarms.yang - yang/system/openconfig-alarm-types.yang + - yang/system/openconfig-hashing.yang - yang/system/openconfig-license.yang - yang/system/openconfig-procmon.yang - yang/system/openconfig-system.yang @@ -32,3 +33,9 @@ - yang/system/openconfig-messages.yang build: - yang/system/openconfig-messages.yang +- name: openconfig-hashing + docs: + - yang/system/openconfig-hashing.yang + build: + - yang/system/openconfig-hashing.yang + run-ci: true diff --git a/release/models/system/openconfig-hashing.yang b/release/models/system/openconfig-hashing.yang new file mode 100644 index 000000000..e4480b22a --- /dev/null +++ b/release/models/system/openconfig-hashing.yang @@ -0,0 +1,366 @@ +module openconfig-hashing { + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/hashing"; + + prefix "oc-hashing"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + import openconfig-system {prefix oc-sys;} + import openconfig-interfaces {prefix oc-intf;} + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing hashing policies that would be referenced by the + interfaces model."; + + + oc-ext:openconfig-version "0.1.0"; + + revision "2023-08-08" { + description "Initial hashing model."; + reference "0.1.0"; + } + + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + grouping hashing-inputs { + description + "Top level container for inputs to be used for hashing policies."; + + leaf ingress-interface { + type boolean; + description + "Include the ingress subinterface identified in the + calculation of the hash."; + } + leaf ip-protocol-type { + type boolean; + description + "Include the IP protocol type in the calculation of the hash."; + } + } + + grouping ipv4-ipv6-inputs-top { + description + "The top level container for ipv4 and ipv6 header + fields used for the hash computation."; + + leaf src-addr { + type boolean; + description + "Use the source address in the calculation of the hash."; + } + + leaf dst-addr { + type boolean; + description + "Use the destination address in the calculation of the hash."; + } + + leaf src-port { + type boolean; + description + "Use the source port from the transport header in the calculation + of the hash."; + } + + leaf dst-port { + type boolean; + description + "Use the destination port from the transport header in the + calculation of the hash."; + } + } + + grouping ipv6-inputs-top { + description + "The top level container specifially for ipv6 header + fields used for the hash computation."; + + leaf flow-label { + type boolean; + description + "Use the flow label in the IPv6 header + to calculate the hash."; + } + } + + grouping hashing-policy-config { + description + "Configuration data for hashing policies."; + + leaf name { + type string; + description + "The name of the hashing policy. + When a configured user-controlled policy is created by the + system, it is instantiated with the same name in the + /system/hashing-policies/hashing-policy/name list."; + } + + leaf seed { + type uint64; + description + "The seed used to initialize the hash algorithm"; + } + + leaf algorithm { + type string; + description + "The name of hash algorithm. This algorithm MUST + be a supported algorithm"; + } + } + + grouping hashing-policy-top { + description + "Top level grouping for hashing configuration and operational state + data."; + + container hashing-policies { + description + "Top level container for hashing, including configuration and + state data."; + + list hashing-policy { + key "name"; + + description + "The list of named policies to be used on the device."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "References the name of the hashing policy."; + } + container config { + description + "Configurable items at the global hash policy level."; + + uses hashing-policy-config; + } + container state { + config false; + description + "Operational state data at the global hash policy + level."; + + uses hashing-policy-config; + } + + container hash-field-modes { + description + "Container for specifying inputs to be used when + calculating the hash."; + + container config { + description + "Configurable items at the hashing inputs level."; + uses hashing-inputs; + } + container state { + config false; + description + "Operational state data at the hashing + inputs level."; + uses hashing-inputs; + } + + container ipv4 { + description + "The IPv4 fields that should be used to + compute the hash."; + container config { + description + "Configurable data at the hashing + inputs level for IPv4."; + uses ipv4-ipv6-inputs-top; + } + + container state { + config false; + description + "Operational state data at the hashing + inputs level for IPv4."; + uses ipv4-ipv6-inputs-top; + } + } + + container ipv6 { + description + "The IPv6 fields that should be used to + compute the hash."; + + container config { + description + "Configurable data at the hashing + inputs level for IPv6."; + + uses ipv4-ipv6-inputs-top; + uses ipv6-inputs-top; + } + + container state { + config false; + description + "Operational state data at the hashing + inputs level for IPv6."; + + uses ipv4-ipv6-inputs-top; + uses ipv6-inputs-top; + } + } + } + } + } + } + + grouping supported-algorithms-state { + description + "Top-level container for the supported algorithms."; + leaf name { + type string; + description + "Name of the supported algorithm."; + } + leaf description { + type string; + description + "Description of the supported algorithm."; + } + } + grouping supported-algorithms-top { + description + "Top-level container of the supported algorithms for supported + algorithms. The list of algorithms are expected to be defined by + the target device."; + container algorithms { + description + "Container for vendor supported hashing algorithms."; + uses vendor-hashing-algorithms; + } + } + + grouping hashing-algo-top { + description + "Top level container of the supported algorithms for supported + algorithms."; + container hashing-algorithms { + config false; + description + "Container of the supported algorithms for supported + algorithms."; + list hashing-algorithm { + key "name"; + + description + "List of the supported algorithms for supported + algorithms."; + + leaf name { + type leafref { + path ../state/name; + } + description + "Reference to the supported algorithm list key."; + } + + container state { + description + "Operational data for the supported algorithm."; + config false; + + leaf name { + type string; + description + "Name of the supported algorithm."; + } + + leaf description { + type string; + description + "Description of the supported algorithm."; + } + } + } + } + } + + grouping vendor-hashing-algorithms { + description + "Supported hashing algorithms per vender."; + container vendor { + description + "Specify the vendor. Each vendor should have its own set of + supported algorithms. For each supported algorithm, a name + and a description should be defined. An implementation must + augment this model using the schema described in the + vendor_counter_guide reference. + + e.g. + augment /system/hashing/vendor { + container { + container { + uses hashing-algo-top; + } + } + }"; + reference + "https://github.com/openconfig/public/tree/master/doc/vendor_counter_guide.md"; + } + } + + grouping hashing-top { + description + "Top-level container for Hashing algorithms and hashing policies"; + container hashing { + description + "Container for Hashing algorithms and hashing policies"; + uses supported-algorithms-top; + uses hashing-policy-top; + } + } + + augment "/oc-sys:system" { + description + "Augment for Hashing algorithms and hashing policies"; + + uses hashing-top; + } + + augment "/oc-intf:interfaces/oc-intf:interface/oc-intf:config" { + description + "Augment for configuration data hashing policy on the interface."; + leaf hashing-policy { + type leafref { + path "/oc-sys:system/hashing/hashing-policies/hashing-policy/name"; + } + description "The configuration data hashing policy to be used when + hashing packets coming in on the interface."; + } + } + + augment "/oc-intf:interfaces/oc-intf:interface/oc-intf:state" { + description + "Augment for operational data hashing policy on the iinterface."; + leaf hashing-policy { + type leafref { + path "/oc-sys:system/hashing/hashing-policies/hashing-policy/name"; + } + description "The operational data hashing policy to be used when + hashing packets coming in on the interface."; + } + } +} \ No newline at end of file From cd1cfcd263d033ee5f9b10cddde6f823f6cb30e2 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Thu, 30 Nov 2023 10:12:25 -0800 Subject: [PATCH 114/201] Clarify interface TESTING mode (#994) * clarify interface TESTING mode --- .../interfaces/openconfig-interfaces.yang | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/release/models/interfaces/openconfig-interfaces.yang b/release/models/interfaces/openconfig-interfaces.yang index 248b5f71d..3c94df5be 100644 --- a/release/models/interfaces/openconfig-interfaces.yang +++ b/release/models/interfaces/openconfig-interfaces.yang @@ -51,7 +51,15 @@ module openconfig-interfaces { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.6.0"; + oc-ext:openconfig-version "3.7.0"; + + revision "2023-11-06" { + description + "Clarify description for admin-status TESTING."; + reference + "3.7.0"; + } + revision "2023-08-29" { description "Add augment for penalty-based additive-increase, exponential-decrease link damping algorithm."; @@ -600,11 +608,16 @@ module openconfig-interfaces { "Not ready to pass packets and not in some test mode."; } enum TESTING { - //TODO: This is generally not supported as a configured - //admin state, though it's in the standard interfaces MIB. - //Consider removing it. description - "In some test mode."; + "The interface should be treated as if in admin-down state for + control plane protocols. In addition, while in TESTING state the + device should remove the interface from aggregate interfaces. + An interface transition to the TESTING state based on a qualification + workflow, or internal device triggered action - such as the gNOI Link + Qualification service"; + reference + "gNOI Link Qualification Service + https://github.com/openconfig/gnoi/blob/main/packet_link_qualification/index.md"; } } //TODO:consider converting to an identity to have the @@ -636,7 +649,7 @@ module openconfig-interfaces { enum TESTING { value 3; description - "In some test mode. No operational packets can + "In test mode. No operational packets can be passed."; } enum UNKNOWN { From 4e1505819d8e6d82c090abbd2e4825551cd567ad Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Wed, 6 Dec 2023 19:56:42 -0800 Subject: [PATCH 115/201] Pipeline-cntr-guide (#961) * Create Integrated-Circuit_pipeline_ggregated_counters_guide.md --------- Co-authored-by: Darren Loher Co-authored-by: Roland Phung --- ...cuit_pipeline_aggregated_counters_guide.md | 72 ++++++++++++++++++ ...openconfig-platform-pipeline-counters.yang | 74 +++++++++++++++++-- 2 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md diff --git a/doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md b/doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md new file mode 100644 index 000000000..3dfc5087a --- /dev/null +++ b/doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md @@ -0,0 +1,72 @@ +# Intergrated Circuit aggregated pipeline counters guide +## Introduction +This guide discusses semantics of different counters provided under the +`openconfig-platform/components/component/integrated-circuit/pipeline-counters` container. +The `INTEGRATED_CIRCUIT` or I-C, in this document refers to the OpenConfig [INTEGRATED_CIRCUIT](https://github.com/openconfig/public/blob/5d38d8531ef9c5b998262207eb6dbdae8968f9fe/release/models/platform/openconfig-platform-types.yang#L346) component type which is typically an ASIC or NPU (or combination of both) that provides packet processing capabilities. + +## Per-block packets/octets counters +[TODO] more detailed description +## Drop packets/octets counters +The `/components/component/integrated-circuit/pipeline-counters/drop` container collects counters related to packets dropped by the `INTEGRATED_CIRCUIT`. +### Aggregated drop counters +These 4 counters should cover all packets dropped by the IC which are not already covered by the /interfaces tree. For example, a packet which is dropped due to QoS policy for WRED should be counted only by the appropriate /interfaces path [dropped-pkts](https://github.com/openconfig/public/blob/5d38d8531ef9c5b998262207eb6dbdae8968f9fe/release/models/qos/openconfig-qos-interfaces.yang#L375). + +Aggregated drop counters are modeled as below: +``` +module: openconfig-platform + +--rw components + +--rw component* [name] + +--rw integrated-circuit + +--ro oc-ppc:pipeline-counters + +--ro oc-ppc:drop + +--ro oc-ppc:state + +--ro oc-ppc:adverse-aggregate? oc-yang:counter64 + +--ro oc-ppc:congestion-aggregate? oc-yang:counter64 + +--ro oc-ppc:packet-processing-aggregate? oc-yang:counter64 + +--ro oc-ppc:urpf-aggregate? oc-yang:counter64 +``` +#### urpf-aggregate + +##### Usability +The increments of this counter are typically signal of some form of attack with spoofed source address. Typically dDOS class. + +#### packet-processing-aggregate + +##### Usability +The increments of this counter are expected during convergence events as well as during stable operation. However rapid increase in drop rate **may** be a signal of network being unhealthy and typically requires further investigation. +The further break down of this counter, if available as vendor extension under `/openconfig-platform:components/component/integrated-circuit/openconfig-platform-pipeline-counters:pipeline-counters/drop/vendor` container could help to further narrow-down cause of drops. + +If prolonged packet drops are found to be caused by lack of FIB entry for incomming packets, this suggest inconsistency between Network Control plane protocols (BGP, IGP, RSVP, gRIBI), FIB calculated by Controller Card and FIB programmed into given Integrated Circuit. + +If implemetation supports `urpf-aggregate` counter, packets discarded due to uRPF should not be counted as `packet-processing-aggregate`. Else, uRPF discarded oacket should be counted against this counter. + +#### congestion-aggregate + + +##### Usability +The increments of this counter are signal of given Integrated Circuit being overhelmed by incomming traffic and complexity of packet processing that is required. + +#### adverse-aggregate +##### Usability +The increments of this counter are generally a signal of a hardware defect (e.g. memory errors or signal integrity issues) or (micro)code software defects. + +#### Queue tail and AQM drops exeption discussion. +Drops associated with QoS queue tail or AQM are the result of egress interface congestion. This is NOT the same as I-C congestion, and should be counted using /interfaces counters as it is expected state from the platform (router) point of view. It may be not expected state from a network design point of view but from the INTEGRATED_CIRCUIT, it is behaving according to design. + +The OpenConfig definition for [congestion-aggregate](https://github.com/openconfig/public/blob/5d38d8531ef9c5b998262207eb6dbdae8968f9fe/release/models/platform/openconfig-platform-pipeline-counters.yang#L1096-L1099) excludes "queue drop counters". It desirable to not count QoS queue drops under this `congestion-aggregate` in order to maintain a clear signal of hitting I-C performance limitations, rather then blend it with basic, simple egress interface speed limitations. + +### Per-Block drop copunters +[TODO] more detailed description for standard OpenConfig drop counters defined for Interface-, Lookup-, Queueing-, Fabric- and Host-Interface- blocks. Also discuss relationship with Control plane traffic packets/octets counters. +### Vendor extensions +Please refer to [Vendor-Specific Augmentation for Pipeline Counter](vendor_counter_guide.md) +## Error counters +These leafs **do not** count **packets or bytes**. +They count error events. + +For example corruption of on chip, HBM or chip external memory buffers (soft-error) which also are not already counted as queue drops for interfaces. + +[TODO] more detailed description +## Control plane traffic packets/octets counters +[TODO] more detailed description. Also discuss relationship with Host-Interface block counters. +### Standard OpenConfig counters +### Vendor extensions diff --git a/release/models/platform/openconfig-platform-pipeline-counters.yang b/release/models/platform/openconfig-platform-pipeline-counters.yang index b7d81c962..9a28d28c2 100644 --- a/release/models/platform/openconfig-platform-pipeline-counters.yang +++ b/release/models/platform/openconfig-platform-pipeline-counters.yang @@ -65,10 +65,16 @@ module openconfig-platform-pipeline-counters { 5 blocks, is to have the abililty to receive all drop counters from all 5 blocks, for example, with one request."; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.5.1"; oc-ext:catalog-organization "openconfig"; oc-ext:origin "openconfig"; + revision "2023-10-08" { + description + "More detail description of pipe-line aggregated drop counters"; + reference "0.5.1"; + } + revision "2023-09-26" { description "Add no-route aggregate drop counter."; @@ -1093,7 +1099,18 @@ module openconfig-platform-pipeline-counters { "This captures the aggregation of all counters where the switch is unexpectedly dropping packets. Occurrence of these drops on a stable (no recent hardware or config changes) and otherwise healthy - switch needs further investigation."; + switch needs further investigation. + This leaf counts packet discarded as result of corrupted + programming state in an INTEGRATED_CIRCUIT or corrupted data + structures of packet descriptors. + + Note: corrupted packets received on ingress interfaces should be counted + in `/interfaces/interface/state/counters/in-errors` and NOT counted as + adverse-aggregate. This is because incoming corrupted packets are NOT + a signal of adverse state of an INTEGRATED_CIRCUIT but rather of an + entity adjacent to the Interface, such as a cable or transceiver). Therefore + such drops SHOULD NOT be counted as adverse-aggregate to preserve + a clean signal of INTEGRATED_CIRCUIT adverse state."; } leaf congestion-aggregate { @@ -1102,7 +1119,31 @@ module openconfig-platform-pipeline-counters { "This tracks the aggregation of all counters where the expected conditions of packet drops due to internal congestion in some block of the hardware that may not be visible in through other congestion - indicators like interface discards or queue drop counters."; + indicators like interface discards or queue drop counters. + + This leaf counts packet discarded as result of exceeding + performance limits of an INTEGRATED_CIRCUT, when it processes + non-corrupted packets using legitimate, non-corrupted programming + state of the INTEGRATED_CIRCUIT. + + The typical example is overloading given IC with higher packet rate (pps) + then given chip can handle. For example, let's assume chip X can process + 3.6Bpps of incoming traffic and 2000 Mpps. However if average incoming + packet size is 150B, at full ingress rate this become 3000Mpps. Hence + 1/3 of packets would be cropped and should be counted against + congestion-aggregate. + + Another example is the case when some INTEGRATED_CIRCUIT internal data bus is + too narrow/slow for handling traffic. For example let's assume chip X needs to send + 3Tbps of traffic to an external buffer memory which has only 2Tbps access I/O. In + this case packets would be discarded, because of congestion of memory I/O bus + which is part of the INTEGRATED_CIRCUIT. Depending on the design of the + INTEGRATED_CIRCUIT, packets could be discarded even if interface queues are + not full, hence this scenario is NOT treated as QoS queue tail-drops nor WRED drops. + + Yet another example is the case where extremely large and long + ACL/filter requires more cycles to process than the INTEGRATED_CIRCUIT + has budgeted. "; } leaf packet-processing-aggregate { @@ -1110,7 +1151,25 @@ module openconfig-platform-pipeline-counters { description "This aggregation of counters represents the conditions in which packets are dropped due to legitimate forwarding decisions (ACL drops, - No Route etc.)"; + No Route etc.) + This counter counts packet discarded as result of processing + non-corrupted packet against legitimate, non-corrupted state + of INTEGRATED_CIRCUIT program (FIB content, ACL content, rate-limiting token-buckets) + which mandate packet drop. The examples of this class of discard are: + - dropping packets which destination address to no match any FIB entry + - dropping packets which destination address matches FIB entry pointing + to discard next-hop (e.g. route to null0) + - dropping packts due to ACL/packet filter decission + - dropping packets due to its TTL = 1 + - dropping packets due to its size exceeds egress interface MTU and + packet can't be fragmented (IPv6 or do not fragment bit is set) + - dropping packets due to uRPF rules (note: packet is counted here and + in separate, urpf-aggregate counter simultaneously) + - etc + + Note:The INTEGRATED_CIRCUIT is doing exactly what it is programmed + to do, and the packet is parsable. + "; } leaf urpf-aggregate { @@ -1119,7 +1178,12 @@ module openconfig-platform-pipeline-counters { "This aggregation of counters represents the conditions in which packets are dropped due to failing uRPF lookup check. This counter and the packet-processing-aggregate counter should be incremented - for each uRPF packet drop."; + for each uRPF packet drop. + This counter counts packet discarded as result of Unicast Reverse + Path Forwarding verification."; + reference + "RFC2827: Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing + RFC3704: Ingress Filtering for Multihomed Networks"; } leaf no-route { From 48a1c13859a56cec2acac936fe4284665c55c786 Mon Sep 17 00:00:00 2001 From: Marius Orehovschi <142224679+marius-ore@users.noreply.github.com> Date: Tue, 12 Dec 2023 02:06:35 +0200 Subject: [PATCH 116/201] Add config and state for individual Ethernet port priority in a LAG (#943) * add config container to LACP aggregate interface member Add config container for LACP aggregate interface member with port-priority and interface. Change /lacp/interfaces/interface/members/member/interface to point to the new leaf /lacp/interfaces/interface/members/member/config/interface. Change /lacp/interfaces/interface/members to config true. This change is not backwards compatible due to breaking change of changing type for list --------- Co-authored-by: Darren Loher Co-authored-by: Rob Shakir --- release/models/lacp/openconfig-lacp.yang | 54 ++++++++++++++++-------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/release/models/lacp/openconfig-lacp.yang b/release/models/lacp/openconfig-lacp.yang index 078a6ef3b..832a6a178 100644 --- a/release/models/lacp/openconfig-lacp.yang +++ b/release/models/lacp/openconfig-lacp.yang @@ -26,7 +26,14 @@ module openconfig-lacp { managing aggregate interfaces. It works in conjunction with the OpenConfig interfaces and aggregate interfaces models."; - oc-ext:openconfig-version "1.2.0"; + oc-ext:openconfig-version "2.0.0"; + + revision "2023-12-11" { + description + "Add config container for aggregation member and port-priority leaf under + both config and state"; + reference "2.0.0"; + } revision "2021-07-20" { description @@ -138,20 +145,23 @@ module openconfig-lacp { description "Configuration data for lacp member interfaces"; - //currently a placeholder -- the list of member interfaces - //and their status is considered opstate only - } - - grouping aggregation-lacp-members-state { - description - "Operational status data for the member interfaces"; - leaf interface { type oc-if:base-interface-ref; description "Reference to interface member of the LACP aggregate"; } + leaf port-priority { + type uint16; + description + "Member interface's priority in its aggregate interface."; + } + } + + grouping aggregation-lacp-members-state { + description + "Operational status data for the member interfaces"; + leaf activity { type lacp-activity-type; description "Indicates participant is active or passive"; @@ -234,6 +244,12 @@ module openconfig-lacp { port"; } + leaf partner-port-priority { + type uint16; + description + "Member interface partner's priority in its aggregate interface."; + } + leaf last-change { type oc-types:timeticks64; description @@ -310,28 +326,31 @@ grouping aggregation-lacp-members-statistics { "Top-level grouping for aggregate members list"; container members { - config false; description - "Enclosing container for the list of members interfaces of - the aggregate. This list is considered operational state - only so is labeled config false and has no config container"; + "Configuration and operational state of the aggregate member + interfaces"; list member { key "interface"; description "List of member interfaces and their associated status for - a LACP-controlled aggregate interface. Member list is not - configurable here -- each interface indicates items - its participation in the LAG."; + a LACP-controlled aggregate interface"; leaf interface { type leafref { - path "../state/interface"; + path "../config/interface"; } description "Reference to aggregate member interface"; } + container config { + description + "Operational state data for aggregate members"; + + uses aggregation-lacp-members-config; + } + container state { @@ -340,6 +359,7 @@ grouping aggregation-lacp-members-statistics { description "Operational state data for aggregate members"; + uses aggregation-lacp-members-config; uses aggregation-lacp-members-state; uses aggregation-lacp-members-statistics; } From 2ff8f74f99fff1ab3e729601d0e1d9cc9f3b525f Mon Sep 17 00:00:00 2001 From: Miguel Angel Berumen Jr Date: Thu, 14 Dec 2023 09:45:17 -0800 Subject: [PATCH 117/201] Add state-only leaves of allowed-max-eirp and allowed-max-txpower (#1013) * Update openconfig-wifi-phy.yang Model a state-only leaf of allowed-max-eirp * Update openconfig-wifi-phy.yang Adding radio state leaf for allowed-max-txpower as well. --- release/models/wifi/openconfig-wifi-phy.yang | 22 +++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/release/models/wifi/openconfig-wifi-phy.yang b/release/models/wifi/openconfig-wifi-phy.yang index 4f76e0060..41d727f61 100644 --- a/release/models/wifi/openconfig-wifi-phy.yang +++ b/release/models/wifi/openconfig-wifi-phy.yang @@ -25,7 +25,13 @@ module openconfig-wifi-phy { description "Model for managing PHY layer configuration of Radio interfaces."; - oc-ext:openconfig-version "1.2.2"; + oc-ext:openconfig-version "1.2.3"; + + revision "2023-11-30" { + description + "Add allowed-max-eirp and allowed-max-txpower radio state leaves."; + reference "1.2.3"; + } revision "2023-05-26" { description @@ -346,6 +352,20 @@ module openconfig-wifi-phy { "Transmit channel-utilization percentage."; } + leaf allowed-max-eirp { + type uint8; + units dBm; + description + "Maximum allowed transmit eirp of this radio + antenna, of the current channel, in dBm."; + } + + leaf allowed-max-txpower { + type uint8; + units dBm; + description + "Maximum allowed transmit power of this radio, of the current channel, in dBm."; + } + leaf obss-rx { type oc-types:percentage; description From d11c015573cfcf6d1ccd79dd7f6518436f482997 Mon Sep 17 00:00:00 2001 From: Roland Phung Date: Fri, 15 Dec 2023 17:49:19 -0800 Subject: [PATCH 118/201] Add reference to doc/terminal-device-properties-guide.md (#1019) --- .../openconfig-terminal-device-properties.yang | 10 +++++++++- .../optical-transport/openconfig-terminal-device.yang | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/release/models/devices-manifest/openconfig-terminal-device-properties.yang b/release/models/devices-manifest/openconfig-terminal-device-properties.yang index 2a9c2e506..4e3202c85 100644 --- a/release/models/devices-manifest/openconfig-terminal-device-properties.yang +++ b/release/models/devices-manifest/openconfig-terminal-device-properties.yang @@ -35,10 +35,16 @@ module openconfig-terminal-device-properties { the OTSi (OTSiMC). It also includes (optional) aspects such as filter characterization, CD and DGD tolerance."; - oc-ext:openconfig-version "0.1.0"; + oc-ext:openconfig-version "0.1.1"; // Revisions + revision "2023-12-13" { + description + "Add reference to the terminal-device-properties-guide.md doc for operational-modes."; + reference "0.1.1"; + } + revision "2022-04-26" { description "Initial manifest fine to extend the information related to the operational modes supported by a terminal device."; @@ -531,6 +537,8 @@ module openconfig-terminal-device-properties { description "Indicates the transceiver's list of supported operational modes and its associated transmission features"; + reference + "https://github.com/openconfig/public/blob/master/doc/terminal-device-properties-guide.md"; list mode-descriptor { key "mode-id"; diff --git a/release/models/optical-transport/openconfig-terminal-device.yang b/release/models/optical-transport/openconfig-terminal-device.yang index bf17ed39c..c9289282a 100644 --- a/release/models/optical-transport/openconfig-terminal-device.yang +++ b/release/models/optical-transport/openconfig-terminal-device.yang @@ -77,7 +77,14 @@ module openconfig-terminal-device { ports per linecard, separate linecards for client and line ports, etc.)."; - oc-ext:openconfig-version "1.9.0"; + oc-ext:openconfig-version "1.9.1"; + + revision "2023-12-13" { + description + "Add reference to the terminal-device-properties-guide.md doc for + operational-mode."; + reference "1.9.1"; + } revision "2021-07-29" { description @@ -1289,6 +1296,8 @@ module openconfig-terminal-device { // Ideally, this leaf should be a leafref to the supported // operational modes, but YANG 1.0 does not allow a r/w // leaf to be a leafref to a r/o leaf. + reference + "https://github.com/openconfig/public/blob/master/doc/terminal-device-properties-guide.md"; } leaf line-port { From 9b9065358192b1dff9b0f2ecf275bb054e8e290d Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 19 Dec 2023 14:09:57 -0800 Subject: [PATCH 119/201] add model-name (#1007) * add model-name --- .../platform/openconfig-platform-common.yang | 8 +++++++- release/models/platform/openconfig-platform.yang | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/release/models/platform/openconfig-platform-common.yang b/release/models/platform/openconfig-platform-common.yang index d0195804b..afb533067 100644 --- a/release/models/platform/openconfig-platform-common.yang +++ b/release/models/platform/openconfig-platform-common.yang @@ -20,7 +20,13 @@ submodule openconfig-platform-common { "This modules contains common groupings that are used in multiple components within the platform module."; - oc-ext:openconfig-version "0.23.0"; + oc-ext:openconfig-version "0.24.0"; + + revision "2023-11-28" { + description + "Add model-name"; + reference "0.24.0"; + } revision "2023-02-13" { description diff --git a/release/models/platform/openconfig-platform.yang b/release/models/platform/openconfig-platform.yang index 7a1488ba4..bbcf931a6 100644 --- a/release/models/platform/openconfig-platform.yang +++ b/release/models/platform/openconfig-platform.yang @@ -65,7 +65,13 @@ module openconfig-platform { (presence or absence of a component) and state (physical attributes or status)."; - oc-ext:openconfig-version "0.23.0"; + oc-ext:openconfig-version "0.24.0"; + + revision "2023-11-28" { + description + "Add model-name"; + reference "0.24.0"; + } revision "2023-02-13" { description @@ -463,6 +469,14 @@ module openconfig-platform { (field replaceable unit)"; } + leaf model-name { + type string; + description + "A human readable string describing the model of a component. + This string is optional and should only be populated if part-no + is also populated."; + } + leaf clei-code { type string; description From 06d159b634658af6b1a6f72db93017d32b98a539 Mon Sep 17 00:00:00 2001 From: xuqma Date: Thu, 21 Dec 2023 16:04:55 -0800 Subject: [PATCH 120/201] Move BGP community and BGP extended community match-set-options back to policy-definitions/statements/.../bgp-conditions (#982) --- release/models/bgp/openconfig-bgp-policy.yang | 132 +++++++++++++++++- 1 file changed, 129 insertions(+), 3 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-policy.yang b/release/models/bgp/openconfig-bgp-policy.yang index c999d2941..c72619fba 100644 --- a/release/models/bgp/openconfig-bgp-policy.yang +++ b/release/models/bgp/openconfig-bgp-policy.yang @@ -28,7 +28,18 @@ module openconfig-bgp-policy { It augments the base routing-policy module with BGP-specific options for conditions and actions."; - oc-ext:openconfig-version "6.2.0"; + oc-ext:openconfig-version "6.3.0"; + + revision "2023-10-23" { + description + "Revert revision 2019-02-01. + Move match-set-options of BGP community and BGP extended community from + defined-sets/bgp-defined-sets/community-set and + defined-sets/bgp-defined-sets/ext-community-set back to + policy-definitions/statements/.../bgp-conditions + for consistency across sets."; + reference "6.3.0"; + } revision "2023-10-03" { description @@ -244,12 +255,113 @@ module openconfig-bgp-policy { } } + grouping match-community-config { + description + "Configuration data for match conditions on community set"; + + 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 community set"; + } + + grouping match-community-top { + description + "Top-level grouping for match conditions on community set"; + + container match-community-set { + description + "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 community set"; + + uses match-community-config; + } + + container state { + + config false; + + description + "Operational state data for match conditions on community set"; + + uses match-community-config; + uses match-community-state; + } + } + } + + grouping match-ext-community-config { + description + "Configuration data for match conditions on extended community set"; + + 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 community set"; + } + + grouping match-ext-community-top { + description + "Top-level grouping for match conditions on extended community set"; + + 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 community set"; + + uses match-ext-community-config; + } + + container state { + + config false; + + description + "Operational state data for match conditions on extended + community set"; + + uses match-ext-community-config; + uses match-ext-community-state; + } + } + } + grouping bgp-match-set-conditions { description "Condition statement definitions for checking membership in a defined set"; uses match-as-path-top; + uses match-community-top; + uses match-ext-community-top; } grouping community-count-config { @@ -391,6 +503,7 @@ module openconfig-bgp-policy { } leaf community-set { + status deprecated; type leafref { path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" + "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:community-sets/" + @@ -401,6 +514,7 @@ module openconfig-bgp-policy { } leaf ext-community-set { + status deprecated; type leafref { path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" + "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:ext-community-sets/" + @@ -477,7 +591,13 @@ module openconfig-bgp-policy { removed."; } - uses oc-rpol:match-set-options-group; + leaf match-set-options { + status deprecated; + type oc-pol-types:match-set-options-type; + description + "Optional parameter that governs the behaviour of the + match operation"; + } } grouping community-set-state { @@ -553,7 +673,13 @@ module openconfig-bgp-policy { removed."; } - uses oc-rpol:match-set-options-group; + leaf match-set-options { + status deprecated; + type oc-pol-types:match-set-options-type; + description + "Optional parameter that governs the behaviour of the + match operation"; + } } grouping ext-community-set-state { From 3ae632da180ff59b68a1a091e4094bd8482d3df5 Mon Sep 17 00:00:00 2001 From: Alex Webster <31635844+awebsters@users.noreply.github.com> Date: Tue, 26 Dec 2023 14:32:02 -0500 Subject: [PATCH 121/201] isis policy metric type leafs fixed for action and condition (#989) * isis policy metric type leafs fixed for action and condition --------- Co-authored-by: Wen Bo Li <50884368+wenovus@users.noreply.github.com> --- .../models/isis/openconfig-isis-policy.yang | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/release/models/isis/openconfig-isis-policy.yang b/release/models/isis/openconfig-isis-policy.yang index 21ee06eb7..caa4c1278 100644 --- a/release/models/isis/openconfig-isis-policy.yang +++ b/release/models/isis/openconfig-isis-policy.yang @@ -26,7 +26,13 @@ module openconfig-isis-policy { It augments the base routing-policy module with BGP-specific options for conditions and actions."; - oc-ext:openconfig-version "0.7.0"; + oc-ext:openconfig-version "0.8.0"; + + revision "2023-11-02" { + description + "Fixing metric type leafs for action and condition branches."; + reference "0.8.0"; + } revision "2023-04-28" { description @@ -151,10 +157,10 @@ module openconfig-isis-policy { within it"; } - leaf set-metric-type { + leaf match-metric-type { type isis-types:metric-type; description - "Set the type of the route to redistribute to INTERNAL or EXTERNAL"; + "Matches the type of the route to redistribute to INTERNAL or EXTERNAL"; } } @@ -195,20 +201,16 @@ module openconfig-isis-policy { } leaf set-metric-type { - type isis-types:level-number; - status deprecated; + type isis-types:metric-type; description - "Formerly this leaf sets the type of metric that is to be specified - when the set-metric leaf is specified. This leaf is DEPRECATED - due to being assigned the wrong type. Use set-metric-style-type - instead."; + "This leaf sets the type of metric that is to be specified + when the set-metric leaf is specified"; } leaf set-metric-style-type { type isis-types:metric-style; description - "Set the type of metric that is to be specified when the - set metric leaf is specified"; + "Set the style of the metric"; } leaf set-metric { From af9d6b6b477f3d01fe55d4dc7eb26ec43f989c7a Mon Sep 17 00:00:00 2001 From: Ebben Aries Date: Wed, 27 Dec 2023 11:42:33 -0700 Subject: [PATCH 122/201] Remove unused chassis-id for P4RT (#1020) * (M) p4rt/openconfig-p4rt.yang - Remove unused chassis-id --- release/models/p4rt/openconfig-p4rt.yang | 34 +++++------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/release/models/p4rt/openconfig-p4rt.yang b/release/models/p4rt/openconfig-p4rt.yang index c6f615445..cc17fa66a 100644 --- a/release/models/p4rt/openconfig-p4rt.yang +++ b/release/models/p4rt/openconfig-p4rt.yang @@ -26,7 +26,13 @@ module openconfig-p4rt { The P4RT protocol specification is linked from https://p4.org/specs/ under the P4Runtime heading."; - oc-ext:openconfig-version "0.4.0"; + oc-ext:openconfig-version "1.0.0"; + + revision 2023-12-13 { + description + "Remove unused chassis id"; + reference "1.0.0"; + } revision 2022-08-19 { description @@ -104,18 +110,6 @@ module openconfig-p4rt { } } - grouping p4rt-chassis-config { - description - "Config regarding P4RT use cases which corresponds to the global device hardware package"; - - leaf id { - type uint32; - description - "An identifier used for the root of oc-p4rt:node-id. It is used to - indicate which oc-p4rt:node-id's belong to the same device"; - } - } - grouping p4rt-ic-config { description "Integrated-circuit specific configuration that is applicable to devices @@ -176,20 +170,6 @@ module openconfig-p4rt { uses p4rt-ic-config; } - augment "/oc-platform:components/oc-platform:component/" + - "oc-platform:chassis/oc-platform:config" { - description - "Add P4RT chassis config to platform chassis component."; - uses p4rt-chassis-config; - } - - augment "/oc-platform:components/oc-platform:component/" + - "oc-platform:chassis/oc-platform:state" { - description - "Add P4RT chassis state to platform chassis component."; - uses p4rt-chassis-config; - } - } // rpc statements From 6aca77481ebd56fc4ef2f7ad2263f8ecf295b838 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Fri, 12 Jan 2024 11:35:01 -0800 Subject: [PATCH 123/201] change aft summary from counter64 to uint64 (#1026) * change aft summary from counter64 to uint64 * remove unused module --- release/models/aft/openconfig-aft-summary.yang | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/release/models/aft/openconfig-aft-summary.yang b/release/models/aft/openconfig-aft-summary.yang index a3fae3a26..8a4cc1730 100644 --- a/release/models/aft/openconfig-aft-summary.yang +++ b/release/models/aft/openconfig-aft-summary.yang @@ -6,7 +6,6 @@ module openconfig-aft-summary { prefix "oc-aftsummary"; import openconfig-extensions { prefix "oc-ext"; } - import openconfig-yang-types { prefix "oc-yang-types"; } import openconfig-policy-types { prefix "oc-pol-types"; } import openconfig-network-instance { prefix "oc-ni"; } @@ -21,7 +20,13 @@ module openconfig-aft-summary { "This module provides summary of aft entry counts per protocol type for each network instance."; - oc-ext:openconfig-version "0.1.0"; + oc-ext:openconfig-version "0.2.0"; + + revision "2024-01-12" { + description + "Change count of entries from counter64 to uint64."; + reference "0.2.0"; + } revision "2023-11-09" { description @@ -49,7 +54,7 @@ module openconfig-aft-summary { leaf aft-entries { description "Total number of entries in the aft."; - type oc-yang-types:counter64; + type uint64; } } } From f3daa9d46f8b907bdab5a4cbe7eca4beee23519b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20de=20Dios?= Date: Wed, 17 Jan 2024 19:18:15 +0100 Subject: [PATCH 124/201] Update openconfig-transport-types.yang (#1011) Added new PMD types * add ETH_100GBASE-CR4 and ETH_40GBASE-CR4 with references --- .../openconfig-transport-types.yang | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index 0818d2d35..eb1421b7e 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,16 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.20.0"; + oc-ext:openconfig-version "0.21.0"; + + revision "2024-01-16" { + description + "Added form factors QSFP28_DD and CSFP. + Added new PMDs: ETH_100GBASE_ER4L (MSA 100GBASE-ER4 Lite), + ETH_1GBASE_LX10. + Added References for 100GBASE-CR4 and 40GGBASE-CR4 for DACs"; + reference "0.21.0"; + } revision "2023-08-03" { description @@ -831,6 +840,14 @@ module openconfig-transport-types { channels"; } + identity QSFP28_DD { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "QSFP-DD with electrical interfaces consisting of 8 lanes that operate at up to + 25 Gbps with NRZ modulation"; + reference "http://qsfp-dd.com"; + } + identity QSFP56 { base TRANSCEIVER_FORM_FACTOR_TYPE; description @@ -884,6 +901,16 @@ module openconfig-transport-types { up to 16 Gb/s signals, including 10 GbE and OTU2"; } + identity CSFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Compact Small form-factor pluggable transceiver. It is a version + of SFP with the same mechanical form factor allowing two independent + bidirectional channels per port."; + } + + + identity SFP28 { base TRANSCEIVER_FORM_FACTOR_TYPE; description @@ -989,6 +1016,12 @@ module openconfig-transport-types { "Ethernet compliance codes (PMD) supported by transceivers"; } + identity ETH_1000BASE_LX10 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: ETH_1000BASE_LX10"; + reference "802.3ah-2004(CL59)"; + } + identity ETH_10GBASE_LRM { base ETHERNET_PMD_TYPE; description "Ethernet compliance code: 10GBASE_LRM"; @@ -1016,7 +1049,10 @@ module openconfig-transport-types { identity ETH_40GBASE_CR4 { base ETHERNET_PMD_TYPE; - description "Ethernet compliance code: 40GBASE_CR4"; + description "Ethernet compliance code: 40GBASE_CR4. + This PMD is used in Direct Attach Cables (DAC) + and Active Optical Cables (AOC)"; + reference "IEEE 802.3ba 40GBASE-CR4"; } identity ETH_40GBASE_SR4 { @@ -1074,6 +1110,11 @@ module openconfig-transport-types { description "Ethernet compliance code: 100GBASE_LR4"; } + identity ETH_100GBASE_ER4L { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_ER4L"; + } + identity ETH_100GBASE_ER4 { base ETHERNET_PMD_TYPE; description "Ethernet compliance code: 100GBASE_ER4"; @@ -1096,7 +1137,10 @@ module openconfig-transport-types { identity ETH_100GBASE_CR4 { base ETHERNET_PMD_TYPE; - description "Ethernet compliance code: 100GBASE_CR4"; + description "Ethernet compliance code: 100GBASE_CR4. + This PMD is used in Direct Attach Cables (DAC) + and Active Optical Cables (AOC)"; + reference "IEEE 802.3bj 100GBASE-CR4"; } identity ETH_100GBASE_FR { From 125c5c3f421c4747873f50946c97bbe00a965123 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Wed, 17 Jan 2024 13:21:07 -0800 Subject: [PATCH 125/201] add uptime and promote system to v1 (#985) * add uptime and promote system to v1 --- release/models/system/openconfig-system.yang | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/release/models/system/openconfig-system.yang b/release/models/system/openconfig-system.yang index aa9589c02..aec2d5b87 100644 --- a/release/models/system/openconfig-system.yang +++ b/release/models/system/openconfig-system.yang @@ -47,7 +47,13 @@ module openconfig-system { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "0.17.1"; + oc-ext:openconfig-version "1.0.0"; + +revision "2023-10-26" { + description + "Add up-time leaf and promote module to version 1.0."; + reference "1.0.0"; + } revision "2023-06-16" { description @@ -371,6 +377,14 @@ module openconfig-system { "The current system date and time."; } + leaf up-time { + type oc-types:timeticks64; + units "nanoseconds"; + description + "The amount of time since the network operating system was + initialized."; + } + leaf boot-time { type oc-types:timeticks64; units "nanoseconds"; From aa1a5468542074b608a65aab9079b9b16ec164a5 Mon Sep 17 00:00:00 2001 From: Seng Leung Date: Wed, 17 Jan 2024 21:58:29 +0000 Subject: [PATCH 126/201] Change ipv6-address-zoned typedef to W3C standard regex pattern (#1031) Fixes #1030 --- release/models/types/openconfig-inet-types.yang | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/release/models/types/openconfig-inet-types.yang b/release/models/types/openconfig-inet-types.yang index 3d3ed425e..ff74c4287 100644 --- a/release/models/types/openconfig-inet-types.yang +++ b/release/models/types/openconfig-inet-types.yang @@ -31,7 +31,14 @@ module openconfig-inet-types { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "0.6.0"; + oc-ext:openconfig-version "0.7.0"; + + revision "2024-01-05" { + description + "Change ipv6-address-zoned typedef to conform to W3C standard + regex pattern."; + reference "0.7.0"; + } revision "2023-02-06" { description @@ -198,7 +205,7 @@ module openconfig-inet-types { pattern // Must support compression through different lengths // therefore this regexp is complex. - '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + '([0-9a-fA-F]{1,4}:){1,7}:|' + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + @@ -207,7 +214,7 @@ module openconfig-inet-types { '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + - ')(%[a-zA-Z0-9_]+)$'; + ')(%[a-zA-Z0-9_]+)'; oc-ext:posix-pattern // Must support compression through different lengths // therefore this regexp is complex. From ce2ebe9ba05e75653c00669e15660836b4004e21 Mon Sep 17 00:00:00 2001 From: "Missae W. Sasaya" Date: Fri, 19 Jan 2024 18:33:09 -0300 Subject: [PATCH 127/201] Configuring send-community per AFI-SAFI at neighbor/peer-group (#809) (#976) Co-authored-by: Darren Loher --- .../openconfig-bgp-common-multiprotocol.yang | 20 ++++++++++++++++++- .../bgp/openconfig-bgp-common-structure.yang | 11 +++++++++- release/models/bgp/openconfig-bgp-common.yang | 11 +++++++++- release/models/bgp/openconfig-bgp-global.yang | 11 +++++++++- .../models/bgp/openconfig-bgp-neighbor.yang | 11 +++++++++- .../models/bgp/openconfig-bgp-peer-group.yang | 11 +++++++++- release/models/bgp/openconfig-bgp.yang | 11 +++++++++- 7 files changed, 79 insertions(+), 7 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang index e85eca584..445649090 100644 --- a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang +++ b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang @@ -24,7 +24,16 @@ submodule openconfig-bgp-common-multiprotocol { for multiple protocols in BGP. The groupings are common across multiple contexts."; - oc-ext:openconfig-version "9.5.0"; + oc-ext:openconfig-version "9.6.0"; + + revision "2023-11-02" { + description + "Fix revision '2023-03-31': send-community-type was added to the + wrong grouping. + Allow configuring send-community per AFI-SAFI at + neighbor/peer-group."; + reference "9.6.0"; + } revision "2023-11-01" { description @@ -254,6 +263,15 @@ submodule openconfig-bgp-common-multiprotocol { "This leaf indicates whether the AFI-SAFI is enabled for the neighbor or group"; } + + leaf-list send-community-type { + type oc-bgp-types:community-type; + description + "Specify which types of community should be sent to the + neighbor or group. The default is to not send the + community attribute. This takes precedence over the neighbor + or group configuration"; + } } grouping bgp-common-mp-all-afi-safi-list-contents { diff --git a/release/models/bgp/openconfig-bgp-common-structure.yang b/release/models/bgp/openconfig-bgp-common-structure.yang index 92ea39425..2f5b643e6 100644 --- a/release/models/bgp/openconfig-bgp-common-structure.yang +++ b/release/models/bgp/openconfig-bgp-common-structure.yang @@ -21,7 +21,16 @@ submodule openconfig-bgp-common-structure { "This sub-module contains groupings that are common across multiple BGP contexts and provide structure around other primitive groupings."; - oc-ext:openconfig-version "9.5.0"; + oc-ext:openconfig-version "9.6.0"; + + revision "2023-11-02" { + description + "Fix revision '2023-03-31': send-community-type was added to the + wrong grouping. + Allow configuring send-community per AFI-SAFI at + neighbor/peer-group."; + reference "9.6.0"; + } revision "2023-11-01" { description diff --git a/release/models/bgp/openconfig-bgp-common.yang b/release/models/bgp/openconfig-bgp-common.yang index 07d38a027..9d02628e2 100644 --- a/release/models/bgp/openconfig-bgp-common.yang +++ b/release/models/bgp/openconfig-bgp-common.yang @@ -24,7 +24,16 @@ submodule openconfig-bgp-common { may be application to a subset of global, peer-group or neighbor contexts."; - oc-ext:openconfig-version "9.5.0"; + oc-ext:openconfig-version "9.6.0"; + + revision "2023-11-02" { + description + "Fix revision '2023-03-31': send-community-type was added to the + wrong grouping. + Allow configuring send-community per AFI-SAFI at + neighbor/peer-group."; + reference "9.6.0"; + } revision "2023-11-01" { description diff --git a/release/models/bgp/openconfig-bgp-global.yang b/release/models/bgp/openconfig-bgp-global.yang index 761becbf1..c5d42468b 100644 --- a/release/models/bgp/openconfig-bgp-global.yang +++ b/release/models/bgp/openconfig-bgp-global.yang @@ -27,7 +27,16 @@ submodule openconfig-bgp-global { "This sub-module contains groupings that are specific to the global context of the OpenConfig BGP module"; - oc-ext:openconfig-version "9.5.0"; + oc-ext:openconfig-version "9.6.0"; + + revision "2023-11-02" { + description + "Fix revision '2023-03-31': send-community-type was added to the + wrong grouping. + Allow configuring send-community per AFI-SAFI at + neighbor/peer-group."; + reference "9.6.0"; + } revision "2023-11-01" { description diff --git a/release/models/bgp/openconfig-bgp-neighbor.yang b/release/models/bgp/openconfig-bgp-neighbor.yang index 830c76d91..78db8b378 100644 --- a/release/models/bgp/openconfig-bgp-neighbor.yang +++ b/release/models/bgp/openconfig-bgp-neighbor.yang @@ -30,7 +30,16 @@ submodule openconfig-bgp-neighbor { "This sub-module contains groupings that are specific to the neighbor context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.5.0"; + oc-ext:openconfig-version "9.6.0"; + + revision "2023-11-02" { + description + "Fix revision '2023-03-31': send-community-type was added to the + wrong grouping. + Allow configuring send-community per AFI-SAFI at + neighbor/peer-group."; + reference "9.6.0"; + } revision "2023-11-01" { description diff --git a/release/models/bgp/openconfig-bgp-peer-group.yang b/release/models/bgp/openconfig-bgp-peer-group.yang index 84c12d090..077dd8874 100644 --- a/release/models/bgp/openconfig-bgp-peer-group.yang +++ b/release/models/bgp/openconfig-bgp-peer-group.yang @@ -25,7 +25,16 @@ submodule openconfig-bgp-peer-group { "This sub-module contains groupings that are specific to the peer-group context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.5.0"; + oc-ext:openconfig-version "9.6.0"; + + revision "2023-11-02" { + description + "Fix revision '2023-03-31': send-community-type was added to the + wrong grouping. + Allow configuring send-community per AFI-SAFI at + neighbor/peer-group."; + reference "9.6.0"; + } revision "2023-11-01" { description diff --git a/release/models/bgp/openconfig-bgp.yang b/release/models/bgp/openconfig-bgp.yang index 6d28c872e..658224d7e 100644 --- a/release/models/bgp/openconfig-bgp.yang +++ b/release/models/bgp/openconfig-bgp.yang @@ -68,7 +68,16 @@ module openconfig-bgp { whereas leaf not present inherits its value from the leaf present at the next higher level in the hierarchy."; - oc-ext:openconfig-version "9.5.0"; + oc-ext:openconfig-version "9.6.0"; + + revision "2023-11-02" { + description + "Fix revision '2023-03-31': send-community-type was added to the + wrong grouping. + Allow configuring send-community per AFI-SAFI at + neighbor/peer-group."; + reference "9.6.0"; + } revision "2023-11-01" { description From 6836243ecfc70a5991d3bc16dda038d1406bdd8c Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Thu, 25 Jan 2024 13:11:41 -0800 Subject: [PATCH 128/201] Add link bandwidth community using schema string regex style (#1027) (M) release/models/bgp/openconfig-bgp-types.yang * Add bgp link-bandwidth community type --- release/models/bgp/openconfig-bgp-errors.yang | 8 ++++- release/models/bgp/openconfig-bgp-types.yang | 29 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-errors.yang b/release/models/bgp/openconfig-bgp-errors.yang index d4b9ba5a8..395fb2d3f 100644 --- a/release/models/bgp/openconfig-bgp-errors.yang +++ b/release/models/bgp/openconfig-bgp-errors.yang @@ -18,7 +18,13 @@ submodule openconfig-bgp-errors { "This module defines BGP NOTIFICATION message error codes and subcodes"; - oc-ext:openconfig-version "5.5.0"; + oc-ext:openconfig-version "5.6.0"; + + revision "2023-12-26" { + description + "Add regex for bgp link bandwidth"; + reference "5.6.0"; + } revision "2023-09-06" { description diff --git a/release/models/bgp/openconfig-bgp-types.yang b/release/models/bgp/openconfig-bgp-types.yang index 447537c5d..b2ce46ef7 100644 --- a/release/models/bgp/openconfig-bgp-types.yang +++ b/release/models/bgp/openconfig-bgp-types.yang @@ -25,7 +25,13 @@ module openconfig-bgp-types { policy. It can be imported by modules that make use of BGP attributes"; - oc-ext:openconfig-version "5.5.0"; + oc-ext:openconfig-version "5.6.0"; + + revision "2023-12-26" { + description + "Add regex for bgp link bandwidth"; + reference "5.6.0"; + } revision "2023-09-06" { description @@ -595,6 +601,27 @@ module openconfig-bgp-types { '429[0-3][0-9]{6}|42[0-8][0-9]{7}|4[0-1][0-9]{8}|[1-3][0-9]{9}|' + '[1-9][0-9]{1,8}|[0-9])$'; } + type string { + // Extended Link Bandwidth Community + // link-bandwidth:<2 byte asn>: + // Example: link-bandwidth:20:100M + pattern 'link-bandwidth:' + + '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}' + + '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):' + + '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' + + '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' + + '429[0-3][0-9]{6}|42[0-8][0-9]{7}|4[0-1][0-9]{8}|[1-3][0-9]{9}|' + + '[1-9][0-9]{1,8}|[0-9])(k|K|M|G)?'; + oc-ext:posix-pattern '^link-bandwidth:' + + '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}' + + '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$' + + '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' + + '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' + + '429[0-3][0-9]{6}|42[0-8][0-9]{7}|4[0-1][0-9]{8}|[1-3][0-9]{9}|' + + '[1-9][0-9]{1,8}|[0-9])(k|K|M|G)?$'; + } + } description "Type definition for extended community attributes. In the case that From f46ca2cc6a2e5832cb0bd03d30c78b735129063c Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Tue, 30 Jan 2024 13:43:29 -0800 Subject: [PATCH 129/201] Multipath link bandwidth enabled (#1028) * BGP link bandwidth multipath enable at global level --- .../openconfig-bgp-common-multiprotocol.yang | 9 ++- .../bgp/openconfig-bgp-common-structure.yang | 9 ++- release/models/bgp/openconfig-bgp-common.yang | 56 ++++++++++++++++++- release/models/bgp/openconfig-bgp-global.yang | 9 ++- .../models/bgp/openconfig-bgp-neighbor.yang | 9 ++- .../models/bgp/openconfig-bgp-peer-group.yang | 9 ++- release/models/bgp/openconfig-bgp.yang | 9 ++- 7 files changed, 103 insertions(+), 7 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang index 445649090..514b757d6 100644 --- a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang +++ b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang @@ -24,8 +24,15 @@ submodule openconfig-bgp-common-multiprotocol { for multiple protocols in BGP. The groupings are common across multiple contexts."; - oc-ext:openconfig-version "9.6.0"; + oc-ext:openconfig-version "9.7.0"; + + revision "2023-12-28" { + description + "Add support for controling use of link-bandwidth extended + community for BGP multipath."; + reference "9.7.0"; + } revision "2023-11-02" { description "Fix revision '2023-03-31': send-community-type was added to the diff --git a/release/models/bgp/openconfig-bgp-common-structure.yang b/release/models/bgp/openconfig-bgp-common-structure.yang index 2f5b643e6..6c9c9610e 100644 --- a/release/models/bgp/openconfig-bgp-common-structure.yang +++ b/release/models/bgp/openconfig-bgp-common-structure.yang @@ -21,7 +21,14 @@ submodule openconfig-bgp-common-structure { "This sub-module contains groupings that are common across multiple BGP contexts and provide structure around other primitive groupings."; - oc-ext:openconfig-version "9.6.0"; + oc-ext:openconfig-version "9.7.0"; + + revision "2023-12-28" { + description + "Add support for controling use of link-bandwidth extended + community for BGP multipath."; + reference "9.7.0"; + } revision "2023-11-02" { description diff --git a/release/models/bgp/openconfig-bgp-common.yang b/release/models/bgp/openconfig-bgp-common.yang index 9d02628e2..461c3eceb 100644 --- a/release/models/bgp/openconfig-bgp-common.yang +++ b/release/models/bgp/openconfig-bgp-common.yang @@ -24,7 +24,14 @@ submodule openconfig-bgp-common { may be application to a subset of global, peer-group or neighbor contexts."; - oc-ext:openconfig-version "9.6.0"; + oc-ext:openconfig-version "9.7.0"; + + revision "2023-12-28" { + description + "Add support for controling use of link-bandwidth extended + community for BGP multipath."; + reference "9.7.0"; + } revision "2023-11-02" { description @@ -620,6 +627,21 @@ submodule openconfig-bgp-common { container ebgp { description "Multipath parameters for eBGP"; + container link-bandwidth-ext-community { + description + "Usage of DMZ Link-Bandwidth extended community"; + container config { + description + "Configuration parameters relating to usage of link-bandwidth"; + uses bgp-common-use-multiple-paths-link-bandwidth-config; + } + container state { + config false; + description + "State information relating to usage of link-bandwidth"; + uses bgp-common-use-multiple-paths-link-bandwidth-config; + } + } container config { description "Configuration parameters relating to eBGP multipath"; @@ -636,6 +658,21 @@ submodule openconfig-bgp-common { container ibgp { description "Multipath parameters for iBGP"; + container link-bandwidth-ext-community { + description + "Usage of DMZ Link-Bandwidth extended community"; + container config { + description + "Configuration parameters relating to usage of link-bandwidth"; + uses bgp-common-use-multiple-paths-link-bandwidth-config; + } + container state { + config false; + description + "State information relating to usage of link-bandwidth"; + uses bgp-common-use-multiple-paths-link-bandwidth-config; + } + } container config { description "Configuration parameters relating to iBGP multipath"; @@ -651,6 +688,23 @@ submodule openconfig-bgp-common { } } + grouping bgp-common-use-multiple-paths-link-bandwidth-config { + description + "Parameters controlling usage of of DMZ Link-Bandwidth + extended community in pultipath RIB/FIB formation"; + leaf enabled { + type boolean; + description + "When set to TRUE, BGP multiplepath shall distributed traffic + load among contributing routes proportionally to value of + Local Administrator subfield of link-bandwidth extended + community [draft-ietf-idr-link-bandwidth-07]. + This leaf has no effect if BGP multi-path is disabled or + if maximum-path attribute of BGP multi-path value is set + to 1"; + } + } + grouping bgp-common-use-multiple-paths-ebgp-config { description "Configuration parameters relating to multipath for eBGP"; diff --git a/release/models/bgp/openconfig-bgp-global.yang b/release/models/bgp/openconfig-bgp-global.yang index c5d42468b..980b26197 100644 --- a/release/models/bgp/openconfig-bgp-global.yang +++ b/release/models/bgp/openconfig-bgp-global.yang @@ -27,7 +27,14 @@ submodule openconfig-bgp-global { "This sub-module contains groupings that are specific to the global context of the OpenConfig BGP module"; - oc-ext:openconfig-version "9.6.0"; + oc-ext:openconfig-version "9.7.0"; + + revision "2023-12-28" { + description + "Add support for controling use of link-bandwidth extended + community for BGP multipath."; + reference "9.7.0"; + } revision "2023-11-02" { description diff --git a/release/models/bgp/openconfig-bgp-neighbor.yang b/release/models/bgp/openconfig-bgp-neighbor.yang index 78db8b378..1070c8429 100644 --- a/release/models/bgp/openconfig-bgp-neighbor.yang +++ b/release/models/bgp/openconfig-bgp-neighbor.yang @@ -30,7 +30,14 @@ submodule openconfig-bgp-neighbor { "This sub-module contains groupings that are specific to the neighbor context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.6.0"; + oc-ext:openconfig-version "9.7.0"; + + revision "2023-12-28" { + description + "Add support for controling use of link-bandwidth extended + community for BGP multipath."; + reference "9.7.0"; + } revision "2023-11-02" { description diff --git a/release/models/bgp/openconfig-bgp-peer-group.yang b/release/models/bgp/openconfig-bgp-peer-group.yang index 077dd8874..f4eafff75 100644 --- a/release/models/bgp/openconfig-bgp-peer-group.yang +++ b/release/models/bgp/openconfig-bgp-peer-group.yang @@ -25,7 +25,14 @@ submodule openconfig-bgp-peer-group { "This sub-module contains groupings that are specific to the peer-group context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.6.0"; + oc-ext:openconfig-version "9.7.0"; + + revision "2023-12-28" { + description + "Add support for controling use of link-bandwidth extended + community for BGP multipath."; + reference "9.7.0"; + } revision "2023-11-02" { description diff --git a/release/models/bgp/openconfig-bgp.yang b/release/models/bgp/openconfig-bgp.yang index 658224d7e..810a41898 100644 --- a/release/models/bgp/openconfig-bgp.yang +++ b/release/models/bgp/openconfig-bgp.yang @@ -68,7 +68,14 @@ module openconfig-bgp { whereas leaf not present inherits its value from the leaf present at the next higher level in the hierarchy."; - oc-ext:openconfig-version "9.6.0"; + oc-ext:openconfig-version "9.7.0"; + + revision "2023-12-28" { + description + "Add support for controling use of link-bandwidth extended + community for BGP multipath."; + reference "9.7.0"; + } revision "2023-11-02" { description From 35614de36d435c3d5efa5a119bd9aba367c9762f Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:19:37 -0800 Subject: [PATCH 130/201] [CI]: Run ygnmi after pyangbind to avoid threadkill (#1045) Based on results in https://github.com/openconfig/public/pull/1043 it suggests an OOM issue. --- cloudbuild.yaml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 4a3d82970..cd99ff204 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -229,14 +229,11 @@ steps: waitFor: ['validator prep', 'go path creation', 'oc-pyang'] id: 'goyang-ygot' -############### YGNMI ############### +############### PYANG ############### - name: 'us-west1-docker.pkg.dev/$PROJECT_ID/models-ci/models-ci-image' entrypoint: 'bash' - args: ['-c', "/go/src/github.com/openconfig/models-ci/validators/ygnmi/test.sh"] + args: ['-c', '/go/src/github.com/openconfig/models-ci/validators/pyang/test.sh'] secretEnv: ['GITHUB_ACCESS_TOKEN'] - volumes: - - name: 'gopath' - path: /go env: - 'GOPATH=/go' - '_PR_NUMBER=$_PR_NUMBER' @@ -244,13 +241,16 @@ steps: - 'COMMIT_SHA=$COMMIT_SHA' - '_REPO_SLUG=$_REPO_SLUG' - 'BRANCH_NAME=$BRANCH_NAME' - waitFor: ['validator prep', 'go path creation', 'oc-pyang'] - id: 'ygnmi' + volumes: + - name: 'gopath' + path: /go + waitFor: ['validator prep', 'oc-pyang'] + id: 'pyang' -############### PYANG ############### +############### PYANGBIND ############### - name: 'us-west1-docker.pkg.dev/$PROJECT_ID/models-ci/models-ci-image' entrypoint: 'bash' - args: ['-c', '/go/src/github.com/openconfig/models-ci/validators/pyang/test.sh'] + args: ['-c', '/go/src/github.com/openconfig/models-ci/validators/pyangbind/test.sh'] secretEnv: ['GITHUB_ACCESS_TOKEN'] env: - 'GOPATH=/go' @@ -263,13 +263,16 @@ steps: - name: 'gopath' path: /go waitFor: ['validator prep', 'oc-pyang'] - id: 'pyang' + id: 'pyangbind' -############### PYANGBIND ############### +############### YGNMI ############### - name: 'us-west1-docker.pkg.dev/$PROJECT_ID/models-ci/models-ci-image' entrypoint: 'bash' - args: ['-c', '/go/src/github.com/openconfig/models-ci/validators/pyangbind/test.sh'] + args: ['-c', "/go/src/github.com/openconfig/models-ci/validators/ygnmi/test.sh"] secretEnv: ['GITHUB_ACCESS_TOKEN'] + volumes: + - name: 'gopath' + path: /go env: - 'GOPATH=/go' - '_PR_NUMBER=$_PR_NUMBER' @@ -277,11 +280,8 @@ steps: - 'COMMIT_SHA=$COMMIT_SHA' - '_REPO_SLUG=$_REPO_SLUG' - 'BRANCH_NAME=$BRANCH_NAME' - volumes: - - name: 'gopath' - path: /go - waitFor: ['validator prep', 'oc-pyang'] - id: 'pyangbind' + waitFor: ['validator prep', 'go path creation', 'oc-pyang', 'pyangbind'] # wait for pyangbind to avoid possible OOM. + id: 'ygnmi' ############### COMPATIBILITY REPORT ############### - name: 'us-west1-docker.pkg.dev/$PROJECT_ID/models-ci/models-ci-image' From 0ba98fd72f224977767e1e143c7665966ab4b985 Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Thu, 8 Feb 2024 15:42:37 -0800 Subject: [PATCH 131/201] Enable CI with new settings (#1047) --- cloudbuild.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index cd99ff204..1c72a5313 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -303,6 +303,7 @@ steps: timeout: 600s options: machineType: 'E2_HIGHCPU_32' + logging: CLOUD_LOGGING_ONLY availableSecrets: inline: From 8387d23434be80b419375c4cc80c45546163e2e2 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Wed, 14 Feb 2024 11:10:24 -0800 Subject: [PATCH 132/201] add peer_address to bgp-next-hop-type (#971) --- release/models/bgp/openconfig-bgp-policy.yang | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/release/models/bgp/openconfig-bgp-policy.yang b/release/models/bgp/openconfig-bgp-policy.yang index c72619fba..169f78652 100644 --- a/release/models/bgp/openconfig-bgp-policy.yang +++ b/release/models/bgp/openconfig-bgp-policy.yang @@ -28,7 +28,13 @@ module openconfig-bgp-policy { It augments the base routing-policy module with BGP-specific options for conditions and actions."; - oc-ext:openconfig-version "6.3.0"; + oc-ext:openconfig-version "6.4.0"; + + revision "2023-12-19" { + description + "Add PEER_ADDRESS to bgp-next-hop-type."; + reference "6.4.0"; + } revision "2023-10-23" { description @@ -175,6 +181,11 @@ module openconfig-bgp-policy { description "special designation for local router's own address, i.e., next-hop-self"; } + enum PEER_ADDRESS { + description "The ip address of the peer should be used. + This enum is efficient to use when setting the next hop + in a policy applied to a peer group."; + } } } description From 1b9c817691b8e4191ca76e1c3db80d060271a1b1 Mon Sep 17 00:00:00 2001 From: Mike Wiebe Date: Thu, 15 Feb 2024 13:43:58 -0500 Subject: [PATCH 133/201] Add DEFAULT_INSTANCE under connection-points endpoints (#1017) * Expand when statement under /network-instances/network-instance/connection-points/connection-point/endpoints to include oc-ni-types:DEFAULT_INSTANCE' --- .../openconfig-network-instance-l2.yang | 8 ++++++- .../openconfig-network-instance.yang | 24 ++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index 16a41451d..e983abef0 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,13 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.2.2"; + oc-ext:openconfig-version "4.3.0"; + + revision "2023-12-13" { + description + "Expand when statement for connection-points endpoints"; + reference "4.3.0"; + } revision "2023-11-03" { description diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index ee5b5a740..b292cfb2b 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,13 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.2.2"; + oc-ext:openconfig-version "4.3.0"; + + revision "2023-12-13" { + description + "Expand when statement for connection-points endpoints"; + reference "4.3.0"; + } revision "2023-11-03" { description @@ -699,7 +705,8 @@ module openconfig-network-instance { container endpoints { when "../../../config/type = 'oc-ni-types:L2P2P' " + - "or ../../../config/type = 'oc-ni-types:L2VSI'" { + "or ../../../config/type = 'oc-ni-types:L2VSI'" + + "or ../../../config/type = 'oc-ni-types:DEFAULT_INSTANCE'" { description "Configuration parameters to associate interfaces into a common group for use in Layer 2 network @@ -801,15 +808,10 @@ module openconfig-network-instance { } } container vxlan { - when "../config/type = 'oc-ni-types:VXLAN'" { - description - "Only include the vxlan configuration when - the endpoint is specified to be vxlan"; - } - description - "Configuration and operational state parameters - relating to a VXLAN tunnel end-point interface"; - uses oc-evpn:evpn-overlays-grp-top; + description + "Configuration and operational state parameters + relating to a VXLAN tunnel end-point interface"; + uses oc-evpn:evpn-overlays-grp-top; } } } From dc47b49ce41a453a4fa5e829166b823dab8012b8 Mon Sep 17 00:00:00 2001 From: Nathan Kitchen Date: Fri, 16 Feb 2024 12:19:40 -0800 Subject: [PATCH 134/201] Change type of NTP offset to int64 (#1023) * Change NTP offset, root-delay, and root-dispersion to int64 nanoseconds (#1022) This change is not backwards compatible, so the major version is incremented. --- release/models/system/openconfig-system.yang | 49 +++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/release/models/system/openconfig-system.yang b/release/models/system/openconfig-system.yang index aec2d5b87..e63b5859c 100644 --- a/release/models/system/openconfig-system.yang +++ b/release/models/system/openconfig-system.yang @@ -47,9 +47,16 @@ module openconfig-system { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "1.0.0"; + oc-ext:openconfig-version "2.0.0"; -revision "2023-10-26" { + revision "2023-12-20" { + description + "Change NTP offset, root-delay, and root-dispersion to int64 nanoseconds, + and update their descriptions for accuracy and clarity."; + reference "2.0.0"; + } + + revision "2023-10-26" { description "Add up-time leaf and promote module to version 1.0."; reference "1.0.0"; @@ -767,39 +774,35 @@ revision "2023-10-26" { } leaf root-delay { - type uint32; - // TODO: reconsider units for these values -- the spec defines - // rootdelay and rootdisperson as 2 16-bit integers for seconds - // and fractional seconds, respectively. This gives a - // precision of ~15 us (2^-16). Using milliseconds here based - // on what implementations typically provide and likely lack - // of utility for less than millisecond precision with NTP - // time sync. - units "milliseconds"; - description - "The round-trip delay to the server, in milliseconds."; + type int64; + units "nanoseconds"; + description + "The total round-trip delay to the reference clock, in nanoseconds."; reference "RFC 5905 - Network Time Protocol Version 4: Protocol and - Algorithms Specification"; + Algorithms Specification, Section 7.3"; } leaf root-dispersion { - type uint64; - units "milliseconds"; + type int64; + units "nanoseconds"; description - "Dispersion (epsilon) represents the maximum error inherent - in the measurement"; + "The maximum error inherent in the measurement, accumulated over the + stratum levels from the reference clock."; reference "RFC 5905 - Network Time Protocol Version 4: Protocol and - Algorithms Specification"; + Algorithms Specification, Section 4"; } leaf offset { - type uint64; - units "milliseconds"; + type int64; + units "nanoseconds"; description "Estimate of the current time offset from the peer. This is - the time difference between the local and reference clock."; + the time difference of the peer's clock minus the local clock."; + reference + "RFC 5905 - Network Time Protocol Version 4: Protocol and + Algorithms Specification, Section 8"; } leaf poll-interval { @@ -1294,4 +1297,4 @@ revision "2023-10-26" { // data definition statements uses system-top; -} \ No newline at end of file +} From aff3e9e8dbc0b3a4f23277ed6a4430e5bee88aae Mon Sep 17 00:00:00 2001 From: sallylsy <108024270+sallylsy@users.noreply.github.com> Date: Fri, 16 Feb 2024 12:33:16 -0800 Subject: [PATCH 135/201] Update loopback-mode type (#1034) * Add interface loopback-mode types for ASIC PHY and MAC --------- Co-authored-by: Darren Loher --- .../openconfig-transport-types.yang | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index eb1421b7e..db7f711a0 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,13 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.21.0"; + oc-ext:openconfig-version "0.22.0"; + + revision "2024-01-17" { + description + "Update loopback-mode types."; + reference "0.22.0"; + } revision "2024-01-16" { description @@ -190,15 +196,41 @@ module openconfig-transport-types { } enum FACILITY { description - "A loopback which directs traffic normally transmitted - on the port back to the device as if received on the same - port from an external source."; + "A port internal loopback at ASIC level. The loopback directs + traffic normally transmitted on the port back to the device as + if received on the same port from an external source. Note this + mode is used when internal loopback does NOT specify MAC or PHY."; } enum TERMINAL { description - "A loopback which directs traffic received from an external - source on the port back out the transmit side of the same - port."; + "A port external loopback at ASIC level. The loopback which + directs traffic received from an external source on the port + back out the transmit side of the same port. Note this mode is + used when external loopback does NOT specify MAC or PHY"; + } + enum ASIC_PHY_LOCAL { + description + "A port internal loopback at PHY module. The loopback directs + traffic normally transmitted on the port back to the device as + if received on the same port from an external source."; + } + enum ASIC_PHY_REMOTE { + description + "A port external loopback at PHY module. The loopback which + directs traffic received from an external source on the port + back out the transmit side of the same port."; + } + enum ASIC_MAC_LOCAL { + description + "A port internal loopback at MAC module. The loopback directs + traffic normally transmitted on the port back to the device as + if received on the same port from an external source."; + } + enum ASIC_MAC_REMOTE { + description + "A port external loopback at MAC module. The loopback which + directs traffic received from an external source on the port + back out the transmit side of the same port."; } } default NONE; From fca6245c796200211aba6928c12d06ab9bcf77c7 Mon Sep 17 00:00:00 2001 From: sachendras <44847441+sachendras@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:41:46 -0800 Subject: [PATCH 136/201] Clarify forwarding-viable and how an implementation should implement it. (#1032) * Update openconfig-if-sdn-ext.yang Clarify the forwarding-viable leaf and how an implementation should implement it. --------- Co-authored-by: rszarecki <46606165+rszarecki@users.noreply.github.com> Co-authored-by: Darren Loher --- .../interfaces/openconfig-if-sdn-ext.yang | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/release/models/interfaces/openconfig-if-sdn-ext.yang b/release/models/interfaces/openconfig-if-sdn-ext.yang index fb4cfeef0..a96e1b823 100644 --- a/release/models/interfaces/openconfig-if-sdn-ext.yang +++ b/release/models/interfaces/openconfig-if-sdn-ext.yang @@ -21,7 +21,13 @@ module openconfig-if-sdn-ext { oc-ext:catalog-organization "openconfig"; oc-ext:origin "openconfig"; - oc-ext:openconfig-version "0.1.0"; + oc-ext:openconfig-version "0.2.0"; + + revision 2024-02-21 { + description + "Initial revision."; + reference "0.2.0"; + } revision 2021-03-30 { description @@ -47,11 +53,42 @@ module openconfig-if-sdn-ext { This is used by an external programming entity to disable an interface (usually part of an aggregate) for the purposes of forwarding traffic. This allows a logical aggregate to continue to be - used with partial capacity, for example. Note that setting - `forwarding-viable = false` is not equivalent to - administratively disabling the interface -- in particular, the - interface is expected to participate in L2 protocols such as - LLDP or LACP even if it blocked from forwarding traffic."; + used with partial capacity. Setting `forwarding-viable = false` is not + equivalent to administratively disabling the interface. + Some rules to follow when an interface or aggregate interface is set for + Forwarding-viable=False: + 1. Aggregate interface '/interfaces/interface/aggregation/state/min-links' + checks should be evaluated based on + `/interfaces/interface/state/oper-status`. 'min-links' should not be + affected by the use of forwarding viable. + + 2. L2 protocols like LLDP and LACP must be processed normally on + transmit and receive on such ports/bundles. IS-IS PDUs should be + handled as per the requirements for L3 packets below. + + 3. L3 packets must not be transmitted on the interface. + + 4. Received L3 packets must be processed normally. Received data-plane + traffic will continue to forwarded to its destination post FIB lookup. + Received control-plane traffic must also be processed normally. + + 5. It is possible that the dead-interval or hold-down timer of L3 + protocols like IS-IS/BGP on the peer router may expire taking down the + adjacency or peering on that connection. However, the peer may still + continue to transmit packets which are received by the local device. + These received packet should continue to be processed normally as + per rule #4 above. + + For example, if the peer's forwarding table is programmed using gRIBI + by an external controller, the local device will continue to receive + packets. + + 6. An implementation should follow rule #3 even when the subject + interface on the local device is the last resort of communication for a + given destination. For example, the only nexthop for a destination is + an aggregate interface which has all member interfaces set to + forwarding-viable = false. In this scenario all L3 packets for that + destination will be dropped."; } } From a0ea59366ef4ea56d746b8550fffe0633ff26101 Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Thu, 22 Feb 2024 10:51:38 -0800 Subject: [PATCH 137/201] Clarification in description of last-prefix-limit-exceeded (#1053) * clarification in description of last-prefix-limit-exceeded --- .../bgp/openconfig-bgp-common-multiprotocol.yang | 7 ++++++- .../models/bgp/openconfig-bgp-common-structure.yang | 8 +++++++- release/models/bgp/openconfig-bgp-common.yang | 8 +++++++- release/models/bgp/openconfig-bgp-global.yang | 8 +++++++- release/models/bgp/openconfig-bgp-neighbor.yang | 11 +++++++++-- release/models/bgp/openconfig-bgp-peer-group.yang | 8 +++++++- release/models/bgp/openconfig-bgp.yang | 8 +++++++- 7 files changed, 50 insertions(+), 8 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang index 514b757d6..705019c01 100644 --- a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang +++ b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang @@ -24,8 +24,13 @@ submodule openconfig-bgp-common-multiprotocol { for multiple protocols in BGP. The groupings are common across multiple contexts."; - oc-ext:openconfig-version "9.7.0"; + oc-ext:openconfig-version "9.7.1"; + revision "2023-12-28" { + description + "Clarification to last-prefix-limit-exceeded in description"; + reference "9.7.1"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-common-structure.yang b/release/models/bgp/openconfig-bgp-common-structure.yang index 6c9c9610e..e737d9d13 100644 --- a/release/models/bgp/openconfig-bgp-common-structure.yang +++ b/release/models/bgp/openconfig-bgp-common-structure.yang @@ -21,7 +21,13 @@ submodule openconfig-bgp-common-structure { "This sub-module contains groupings that are common across multiple BGP contexts and provide structure around other primitive groupings."; - oc-ext:openconfig-version "9.7.0"; + oc-ext:openconfig-version "9.7.1"; + + revision "2023-12-28" { + description + "Clarification to last-prefix-limit-exceeded in description"; + reference "9.7.1"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-common.yang b/release/models/bgp/openconfig-bgp-common.yang index 461c3eceb..fe3f82477 100644 --- a/release/models/bgp/openconfig-bgp-common.yang +++ b/release/models/bgp/openconfig-bgp-common.yang @@ -24,7 +24,13 @@ submodule openconfig-bgp-common { may be application to a subset of global, peer-group or neighbor contexts."; - oc-ext:openconfig-version "9.7.0"; + oc-ext:openconfig-version "9.7.1"; + + revision "2023-12-28" { + description + "Clarification to last-prefix-limit-exceeded in description"; + reference "9.7.1"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-global.yang b/release/models/bgp/openconfig-bgp-global.yang index 980b26197..28e73bac5 100644 --- a/release/models/bgp/openconfig-bgp-global.yang +++ b/release/models/bgp/openconfig-bgp-global.yang @@ -27,7 +27,13 @@ submodule openconfig-bgp-global { "This sub-module contains groupings that are specific to the global context of the OpenConfig BGP module"; - oc-ext:openconfig-version "9.7.0"; + oc-ext:openconfig-version "9.7.1"; + + revision "2023-12-28" { + description + "Clarification to last-prefix-limit-exceeded in description"; + reference "9.7.1"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-neighbor.yang b/release/models/bgp/openconfig-bgp-neighbor.yang index 1070c8429..3087ae03c 100644 --- a/release/models/bgp/openconfig-bgp-neighbor.yang +++ b/release/models/bgp/openconfig-bgp-neighbor.yang @@ -30,7 +30,13 @@ submodule openconfig-bgp-neighbor { "This sub-module contains groupings that are specific to the neighbor context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.7.0"; + oc-ext:openconfig-version "9.7.1"; + + revision "2023-12-28" { + description + "Clarification to last-prefix-limit-exceeded in description"; + reference "9.7.1"; + } revision "2023-12-28" { description @@ -395,7 +401,8 @@ submodule openconfig-bgp-neighbor { type oc-types:timeticks64; description "This timestamp indicates the time that the BGP session last - violated a configured max prefix-limit for any AFI/SAFI combination + violated a configured recived (pre-policy) or accepted (post-policy) + max prefix-limit for any AFI/SAFI combination on the session. The value is the timestamp in nanoseconds relative to the Unix Epoch (Jan 1, 1970 00:00:00 UTC). diff --git a/release/models/bgp/openconfig-bgp-peer-group.yang b/release/models/bgp/openconfig-bgp-peer-group.yang index f4eafff75..9091e68e1 100644 --- a/release/models/bgp/openconfig-bgp-peer-group.yang +++ b/release/models/bgp/openconfig-bgp-peer-group.yang @@ -25,7 +25,13 @@ submodule openconfig-bgp-peer-group { "This sub-module contains groupings that are specific to the peer-group context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.7.0"; + oc-ext:openconfig-version "9.7.1"; + + revision "2023-12-28" { + description + "Clarification to last-prefix-limit-exceeded in description"; + reference "9.7.1"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp.yang b/release/models/bgp/openconfig-bgp.yang index 810a41898..de65238c9 100644 --- a/release/models/bgp/openconfig-bgp.yang +++ b/release/models/bgp/openconfig-bgp.yang @@ -68,7 +68,13 @@ module openconfig-bgp { whereas leaf not present inherits its value from the leaf present at the next higher level in the hierarchy."; - oc-ext:openconfig-version "9.7.0"; + oc-ext:openconfig-version "9.7.1"; + + revision "2023-12-28" { + description + "Clarification to last-prefix-limit-exceeded in description"; + reference "9.7.1"; + } revision "2023-12-28" { description From 5d24889a323a84fd077cbb83c2c7b5fb4896a6fe Mon Sep 17 00:00:00 2001 From: Rob Shakir Date: Fri, 23 Feb 2024 08:34:11 -0800 Subject: [PATCH 138/201] Fix typo in RFC5303 reference. (#1054) * Fix typo in RFC5303 reference. * (M) release/models/isis/openconfig-isis(-lsp|-routing)?.yang - Fix typo in reference to RFC5303 in adjacency state leaf. --------- Co-authored-by: Darren Loher --- release/models/isis/openconfig-isis-lsp.yang | 8 +++++++- release/models/isis/openconfig-isis-routing.yang | 8 +++++++- release/models/isis/openconfig-isis.yang | 10 ++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/release/models/isis/openconfig-isis-lsp.yang b/release/models/isis/openconfig-isis-lsp.yang index 95d31837e..04ac1dae3 100644 --- a/release/models/isis/openconfig-isis-lsp.yang +++ b/release/models/isis/openconfig-isis-lsp.yang @@ -34,7 +34,13 @@ submodule openconfig-isis-lsp { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "1.6.1"; + oc-ext:openconfig-version "1.6.2"; + + revision "2024-02-20" { + description + "Fix typo in RFC reference for adjacency-state."; + reference "1.6.2"; + } revision "2023-11-01" { description diff --git a/release/models/isis/openconfig-isis-routing.yang b/release/models/isis/openconfig-isis-routing.yang index 56f0faed4..12c243421 100644 --- a/release/models/isis/openconfig-isis-routing.yang +++ b/release/models/isis/openconfig-isis-routing.yang @@ -20,7 +20,13 @@ submodule openconfig-isis-routing { description "This module describes YANG model for ISIS Routing"; - oc-ext:openconfig-version "1.6.1"; + oc-ext:openconfig-version "1.6.2"; + + revision "2024-02-20" { + description + "Fix typo in RFC reference for adjacency-state."; + reference "1.6.2"; + } revision "2023-11-01" { description diff --git a/release/models/isis/openconfig-isis.yang b/release/models/isis/openconfig-isis.yang index fe99d4024..d08e14d14 100644 --- a/release/models/isis/openconfig-isis.yang +++ b/release/models/isis/openconfig-isis.yang @@ -54,7 +54,13 @@ module openconfig-isis { +-> { levels config } +-> { level adjacencies }"; - oc-ext:openconfig-version "1.6.1"; + oc-ext:openconfig-version "1.6.2"; + + revision "2024-02-20" { + description + "Fix typo in RFC reference for adjacency-state."; + reference "1.6.2"; + } revision "2023-11-01" { description @@ -1827,7 +1833,7 @@ module openconfig-isis { type oc-isis-types:isis-interface-adj-state; description "P2P 3-way ISIS adjacency state(up, down, init, failed)."; - reference "RFC4303. TLV 240."; + reference "RFC5303: TLV 240."; } leaf up-timestamp { From 063f5a7a249f3f0566f695f220628556572d3156 Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:52:49 -0500 Subject: [PATCH 139/201] Add gNSI models (#1037) * Add gNSI models --------- Co-authored-by: Darren Loher --- release/models/gnsi/.spec.yml | 10 + .../models/gnsi/openconfig-gnsi-acctz.yang | 245 +++++++++++++ .../models/gnsi/openconfig-gnsi-authz.yang | 212 +++++++++++ .../models/gnsi/openconfig-gnsi-certz.yang | 209 +++++++++++ .../gnsi/openconfig-gnsi-credentialz.yang | 302 ++++++++++++++++ .../models/gnsi/openconfig-gnsi-pathz.yang | 331 ++++++++++++++++++ release/models/gnsi/openconfig-gnsi.yang | 40 +++ release/models/system/.spec.yml | 5 + 8 files changed, 1354 insertions(+) create mode 100644 release/models/gnsi/.spec.yml create mode 100644 release/models/gnsi/openconfig-gnsi-acctz.yang create mode 100644 release/models/gnsi/openconfig-gnsi-authz.yang create mode 100644 release/models/gnsi/openconfig-gnsi-certz.yang create mode 100644 release/models/gnsi/openconfig-gnsi-credentialz.yang create mode 100644 release/models/gnsi/openconfig-gnsi-pathz.yang create mode 100644 release/models/gnsi/openconfig-gnsi.yang diff --git a/release/models/gnsi/.spec.yml b/release/models/gnsi/.spec.yml new file mode 100644 index 000000000..d8c79b235 --- /dev/null +++ b/release/models/gnsi/.spec.yml @@ -0,0 +1,10 @@ +- name: openconfig-system-gnsi + build: + - yang/system/openconfig-system.yang + - yang/gnsi/openconfig-gnsi.yang + - yang/gnsi/openconfig-gnsi-acctz.yang + - yang/gnsi/openconfig-gnsi-authz.yang + - yang/gnsi/openconfig-gnsi-certz.yang + - yang/gnsi/openconfig-gnsi-credentialz.yang + - yang/gnsi/openconfig-gnsi-pathz.yang + run-ci: true diff --git a/release/models/gnsi/openconfig-gnsi-acctz.yang b/release/models/gnsi/openconfig-gnsi-acctz.yang new file mode 100644 index 000000000..d95ccccfb --- /dev/null +++ b/release/models/gnsi/openconfig-gnsi-acctz.yang @@ -0,0 +1,245 @@ +module openconfig-gnsi-acctz { + yang-version 1; + namespace "https://github.com/openconfig/yang/gnsi/acctz"; + prefix oc-gnsi-acctz; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-system { + prefix oc-sys; + } + import openconfig-system-grpc { + prefix oc-sys-grpc; + } + import openconfig-types { + prefix oc-types; + } + import openconfig-yang-types { + prefix oc-yang; + } + import openconfig-gnsi { + prefix oc-gnsi; + } + organization + "OpenConfig Working Group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module provides counters of gNSI accountZ requests and responses and + the quantity of data transferred."; + + oc-ext:openconfig-version "0.2.0"; + + revision 2024-02-13 { + description + "Major style updates and move to openconfig/public from openconfig/gnsi. + Last commit at + https://github.com/openconfig/gnsi/commit/347935aac66135d5649dadb9583ed0914578aab0"; + reference "0.2.0"; + } + + revision 2023-12-01 { + description + "Initial revision."; + reference "0.1.0"; + } + + typedef cmd-service { + description "enum CommandService.CmdServiceType"; + type enumeration { + enum UNSPECIFIED { + value 0; + } + enum SHELL { + value 1; + } + enum CLI { + value 2; + } + enum WEBUI { + value 3; + } + enum RESTCONF { + value 4; + } + enum NETCONF { + value 5; + } + } + } + typedef grpc-service { + description "enum GrpcService.GrpcServiceType"; + type enumeration { + enum UNSPECIFIED { + value 0; + } + enum GNMI { + value 1; + } + enum GNOI { + value 2; + } + enum GNSI { + value 3; + } + enum GRIBI { + value 4; + } + enum P4RT { + value 5; + } + } + } + typedef service-request { + description "enum RecordResponse.service_request"; + type enumeration { + enum CMD_SERVICE { + value 4; + } + enum GRPC_SERVICE { + value 5; + } + } + } + typedef service-type { + description "enum cmd or grpc service type"; + type union { + type cmd-service; + type grpc-service; + } + } + + // gnsi.acctz client statistics + grouping client-counters { + description + "A collection of counters that were collected by the gNSI.acctz + module while servicing acctz clients."; + + container client-counters { + description + "A collection of counters that were collected by the gNSI.acctz + module while servicing acctz clients."; + leaf history-istruncated { + type oc-yang:counter64; + description + "The total number of times that a RecordRequest resulted in + a RecordResponse being marked history-istruncated. ie: a + request was made for a timestamp that did not exist in the + history."; + } + leaf idle-timeouts { + type oc-yang:counter64; + description + "The total number of times that a client was disconnected + due to missing keepalives (ie: RecordRequests)."; + } + leaf record-requests { + type oc-yang:counter64; + description + "The total number of RecordRequest RPCs that have been received."; + } + leaf record-responses { + type oc-yang:counter64; + description + "The total number of RecordResponse RPCs that have been sent."; + } + } + } + + // gnsi.acctz producer statistics + grouping source-counters { + description + "A collection of counters for gNSI.acctz record production per + service request type."; + + container source-counters { + description + "A collection of counters for gNSI.acctz record production per + service request type."; + list source-records { + key "service type"; + // unique "service type"; + description + "The total number of times the gNSI.authz module denied access + to a RPC."; + + leaf service { + type leafref { + path "../state/service"; + } + description + "service request type for the gNSI.acctz record."; + } + leaf type { + type leafref { + path "../state/type"; + } + description + "service request application enum for the gNSI.acctz record."; + } + + container state { + description + "Operational state for gNSI.acctz counters of record production per + service request type."; + leaf service { + type service-request; + description + "service request type for the gNSI.acctz record."; + } + leaf type { + type service-type; + description + "service request application enum for the gNSI.acctz record."; + } + leaf records { + type oc-yang:counter64; + description + "The total number of records produced for the service-request + type."; + } + } + } + } + } + + grouping grpc-server-acctz-counters { + description + "A collection of counters from the gNSI.acctz module."; + + container acctz-counters { + config false; + description + "A collection of counters from the gNSI.acctz module + for acctz clients and sources."; + + container state { + description + "Operational state relating to acctz-counters."; + + leaf counters-last-cleared { + type oc-types:timeticks64; + description + "The last time that the counters were cleared (reset to + zero). This value is reported as nanoseconds since epoch + (January 1st, 1970 00:00:00 GMT)."; + } + + uses client-counters; + } + + uses source-counters; + } + } + + // Augments section. + augment "/oc-sys:system/oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" { + when "config[contains(services, 'oc-gnsi:GNSI')]/enable = 'true'"; + description + "Counters collected by the gNSI.acctz module."; + + uses grpc-server-acctz-counters; + } +} diff --git a/release/models/gnsi/openconfig-gnsi-authz.yang b/release/models/gnsi/openconfig-gnsi-authz.yang new file mode 100644 index 000000000..870fcac2b --- /dev/null +++ b/release/models/gnsi/openconfig-gnsi-authz.yang @@ -0,0 +1,212 @@ +module openconfig-gnsi-authz { + yang-version 1; + namespace "https://github.com/openconfig/yang/gnsi/authz"; + prefix oc-gnsi-authz; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-system { + prefix oc-sys; + } + import openconfig-system-grpc { + prefix oc-sys-grpc; + } + import openconfig-types { + prefix oc-types; + } + import openconfig-yang-types { + prefix oc-yang; + } + import openconfig-gnsi { + prefix oc-gnsi; + } + organization + "OpenConfig Working Group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module provides a data model for the metadata of the gRPC + authorization policies installed on a networking device."; + + oc-ext:openconfig-version "0.4.0"; + + revision 2024-02-13 { + description + "Major style updates and move to openconfig/public from openconfig/gnsi. + Last commit at + https://github.com/openconfig/gnsi/commit/347935aac66135d5649dadb9583ed0914578aab0"; + reference "0.4.0"; + } + + revision 2022-10-30 { + description + "Adds success/failure counters."; + reference "0.3.0"; + } + + revision 2022-08-01 { + description + "Single authz policy."; + reference "0.2.0"; + } + + revision 2022-01-17 { + description + "Initial revision."; + reference "0.1.0"; + } + + typedef version { + type string; + description + "The version ID of the gRPC authorization policy as provided by + the gRPC Authorization Policy Manager when the policy was pushed. + This leaf persists through a reboot."; + } + + typedef created-on { + type oc-types:timeticks64; + description + "The creation time of the gRPC authorization policy as reported by + the gRPC Authorization Policy manager when the policy was pushed + to the device. This value is reported as nanoseconds since epoch + (January 1st, 1970 00:00:00 GMT). This leaf persists through + a reboot."; + } + + // gRPC server authorization policy related definitions. + grouping counters { + description + "A collection of counters that were collected by the gNSI.authz + module while evaluating access to a RPC."; + + leaf access-rejects { + type oc-yang:counter64; + description + "The total number of times the gNSI.authz module denied access + to a RPC."; + } + leaf last-access-reject { + type oc-types:timeticks64; + description + "A timestamp of the last time the gNSI.authz denied access to + a RPC."; + } + leaf access-accepts { + type oc-yang:counter64; + description + "The total number of times the gNSI.authz module allowed access + to a RPC."; + } + leaf last-access-accept { + type oc-types:timeticks64; + description + "A timestamp of the last time the gNSI.authz allowed access to + a RPC."; + } + } + + grouping grpc-server-user-authz-policy-success-failure-counters { + description + "A collection of counters collected by the gNSI.authz module."; + + container rpcs { + description + "A collection of counters collected by the gNSI.authz module + for each RPC separately."; + + list rpc { + description + "A collection of counters collected by the gNSI.authz module + for a RPC identified by the `name`."; + + key "name"; + leaf name { + type leafref { + path "../state/name"; + } + description + "The name of the RPC the counters were collected for. + + The name MUST match the HTTP/2 Path header value in + https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests + + For example, + /gnmi.gNMI/Subscribe + /gnoi.healthz.Healthz/Get + "; + } + container state { + description + "operational state for authz policy success/failure counters."; + leaf name { + type string; + description + "The name of the RPC the counters were collected for. + + The name MUST match the HTTP/2 Path header value in + https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests + + For example, + /gnmi.gNMI/Subscribe + /gnoi.healthz.Healthz/Get + "; + } + uses counters; + } + } + } + } + + grouping grpc-server-authz-policy-success-failure-counters { + description + "A collection of counters collected by the gNSI.authz module."; + + container authz-policy-counters { + description + "A collection of counters collected by the gNSI.authz module."; + config false; + + uses grpc-server-user-authz-policy-success-failure-counters; + } + } + + grouping grpc-server-authz-policy-state { + description + "gNMI server's gRPC authorization policy freshness-related data."; + + leaf grpc-authz-policy-version { + type version; + description + "The version of the gRPC authorization policy that is used by + this system."; + } + leaf grpc-authz-policy-created-on { + type created-on; + description + "The timestamp of the moment when the gRPC authorization policy + that is currently used by this system was created."; + } + } + + // Augments section. + + augment "/oc-sys:system/oc-sys:aaa/oc-sys:authorization/" + + "oc-sys:state" { + description + "A system's gRPC authorization policy freshness information."; + + uses grpc-server-authz-policy-state; + } + + augment "/oc-sys:system/oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" { + when "config[contains(services, 'oc-gnsi:GNSI')]/enable = 'true'"; + description + "Counters collected while evaluating access to a gRPC server using + the gNSI.authz authorization policy."; + + uses grpc-server-authz-policy-success-failure-counters; + } +} diff --git a/release/models/gnsi/openconfig-gnsi-certz.yang b/release/models/gnsi/openconfig-gnsi-certz.yang new file mode 100644 index 000000000..9b5e9a1ca --- /dev/null +++ b/release/models/gnsi/openconfig-gnsi-certz.yang @@ -0,0 +1,209 @@ +module openconfig-gnsi-certz { + yang-version 1; + namespace "https://github.com/openconfig/yang/gnsi/certz"; + prefix oc-gnsi-certz; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-system { + prefix oc-sys; + } + import openconfig-system-grpc { + prefix oc-sys-grpc; + } + import openconfig-types { + prefix oc-types; + } + import openconfig-yang-types { + prefix oc-yang; + } + import openconfig-gnsi { + prefix oc-gnsi; + } + organization + "OpenConfig Working Group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module provides a data model for the metadata of gRPC credentials + installed on a networking device."; + + oc-ext:openconfig-version "0.5.0"; + + revision 2024-02-13 { + description + "Major style updates and move to openconfig/public from openconfig/gnsi. + Last commit at + https://github.com/openconfig/gnsi/commit/347935aac66135d5649dadb9583ed0914578aab0"; + reference "0.5.0"; + } + + revision 2023-08-24 { + description + "Adds ssl-profile-id leaf"; + reference "0.4.0"; + } + + revision 2023-05-10 { + description + "Adds authentication policy freshness information."; + reference "0.3.0"; + } + + revision 2022-10-30 { + description + "Adds success/failure counters."; + reference "0.2.0"; + } + + revision 2022-09-20 { + description + "Initial revision."; + reference "0.1.0"; + } + + typedef version { + type string; + description + "The version ID of the credential as provided by the credential + manager when the credential was pushed. This leaf persists through + a reboot."; + } + + typedef created-on { + type oc-types:timeticks64; + description + "The creation time of the credential as reported by the credential + manager when the credential was pushed to the device. This value is + reported as nanoseconds since epoch (January 1st, 1970 00:00:00 GMT). + This leaf persists through a reboot."; + } + // gRPC server related definitions. + // Success/failure counters. + grouping grpc-server-certz-counters { + description + "A collection of counters that were collected while evaluating + access to the gRPC server."; + + container certz-counters { + config false; + description + "A collection of counters that were collected by the gRPC during + the authentication process."; + + leaf access-rejects { + type oc-yang:counter64; + description + "The total number of times a TLS handshake failure has occurred and + the gRPC server denied access a client."; + } + leaf last-access-reject { + type oc-types:timeticks64; + description + "A timestamp of the last time the gRPC denied access to + the server."; + } + leaf access-accepts { + type oc-yang:counter64; + description + "The total number of times a successful TLS handshake is completed + and the gPRC server allows access to a client."; + } + leaf last-access-accept { + type oc-types:timeticks64; + description + "A timestamp of the last time the gRPC allowed access to + the server."; + } + } + } + + // TODO(earies): move to a system-wide subtree: + // https://github.com/openconfig/public/issues/1049 + grouping grpc-server-credentials-state { + description + "gRPC server credentials freshness-related data."; + + leaf certificate-version { + type version; + description + "The version of the certificate (and associated + private key) that is used by this gRPC server."; + } + leaf certificate-created-on { + type created-on; + description + "The timestamp of the moment when the certificate + (and associated private key) that is currently used + by this gRPC server was created."; + } + leaf ca-trust-bundle-version { + type version; + description + "The version of the bundle of the Certificate + Authority certificates a.k.a. trust bundle used by + this gRPC server."; + } + leaf ca-trust-bundle-created-on { + type created-on; + description + "The timestamp of the moment when the bundle of + the Certificate Authority certificates (a.k.a. + trust bundle) was created."; + } + leaf certificate-revocation-list-bundle-version { + type version; + description + "The version of the Certificate Revocation List bundle used by + this gRPC server."; + } + leaf certificate-revocation-list-bundle-created-on { + type created-on; + description + "The timestamp of the moment when the Certificate Revocation + List bundle was created."; + } + leaf authentication-policy-version { + type version; + description + "The version of the authentication policy that is used by + this gRPC server."; + } + leaf authentication-policy-created-on { + type created-on; + description + "The timestamp of the moment when the authentication policy + that is currently used by this gRPC server was created."; + } + // TODO(earies): Consider aligning this with grpc-server key after moving + // to a system-wide subtree: + // https://github.com/openconfig/public/issues/1050 + leaf ssl-profile-id { + type string; + description + "The ID of this gRPC server's SSL profile + as used by the gNSI Certz service"; + } + } + + // Augments section. + + augment "/oc-sys:system/oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server/" + + "oc-sys-grpc:state" { + when "../config[contains(services, 'oc-gnsi:GNSI')]/enable = 'true'"; + description + "A gRPC server credentials freshness information."; + + uses grpc-server-credentials-state; + } + + augment "/oc-sys:system/oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server/" + + "oc-sys-grpc:state" { + when "../config[contains(services, 'oc-gnsi:GNSI')]/enable = 'true'"; + uses grpc-server-certz-counters; + description + "gNSI certz server access counters."; + } +} diff --git a/release/models/gnsi/openconfig-gnsi-credentialz.yang b/release/models/gnsi/openconfig-gnsi-credentialz.yang new file mode 100644 index 000000000..0e4392a7a --- /dev/null +++ b/release/models/gnsi/openconfig-gnsi-credentialz.yang @@ -0,0 +1,302 @@ +module openconfig-gnsi-credentialz { + yang-version 1; + namespace "https://github.com/openconfig/yang/gnsi/credentialz"; + prefix oc-gnsi-credz; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-system { + prefix oc-sys; + } + import openconfig-types { + prefix oc-types; + } + import openconfig-yang-types { + prefix oc-yang; + } + import openconfig-system-grpc { + prefix oc-sys-grpc; + } + import openconfig-gnsi { + prefix oc-gnsi; + } + organization + "OpenConfig Working Group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module provides a data model for the metadata of SSH and console + credentials installed on a networking device. + + The following leaves MUST be treated as invalid when the gNSI server is + enabled and credentialz is supported by the implementation: + /system/aaa/authentication/users/user/config/ssh-key + /system/aaa/authentication/users/user/state/ssh-key + /system/aaa/authentication/users/user/config/password + /system/aaa/authentication/users/user/state/password + /system/aaa/authentication/users/user/config/password-hashed + /system/aaa/authentication/users/user/state/password-hashed"; + + oc-ext:openconfig-version "0.6.0"; + + revision 2024-02-13 { + description + "Major style updates and move to openconfig/public from openconfig/gnsi. + Last commit at + https://github.com/openconfig/gnsi/commit/347935aac66135d5649dadb9583ed0914578aab0"; + reference "0.6.0"; + } + + revision 2024-01-05 { + description + "Fix typo in YANG leaves"; + reference "0.5.0"; + } + + revision 2023-10-03 { + description + "Added state leaves for admin-user"; + reference "0.4.0"; + } + + revision 2023-08-18 { + description + "Fixed the canonical order of config field."; + reference "0.3.0"; + } + + revision 2022-10-30 { + description + "Adds success/failure counters."; + reference "0.2.0"; + } + + revision 2022-08-22 { + description + "Initial revision."; + reference "0.1.0"; + } + + typedef version { + type string; + description + "The version ID of the credential as provided by the credential + manager when the credential was pushed. This leaf persists through + a reboot."; + } + + typedef created-on { + type oc-types:timeticks64; + description + "The creation time of the credential as reported by the credential + manager when the credential was pushed to the device. This value is + reported as nanoseconds since epoch (January 1st, 1970 00:00:00 GMT). + This leaf persists through a reboot."; + } + + // SSH server related definitions. + + grouping ssh-server-credentials-version { + description + "SSH server credentials freshness-related data."; + + leaf active-trusted-user-ca-keys-version { + type version; + description + "The version of the Certificate Authority keys."; + } + + leaf active-trusted-user-ca-keys-created-on { + type created-on; + description + "The timestamp of the moment when the trusted user CA keys + were created."; + } + + leaf active-host-certificate-version { + type version; + description + "The version of the host certificate."; + } + + leaf active-host-certificate-created-on { + type created-on; + description + "The timestamp of the moment when the host certificate + was created."; + } + + leaf active-host-key-version { + type version; + description + "The version of the host public key."; + } + + leaf active-host-key-created-on { + type created-on; + description + "The timestamp of the moment when the host key was + created."; + } + } + + // Success/failure counters. + grouping counters { + description + "A collection of counters that were collected while evaluating + access to the target."; + + container counters { + config false; + description + "A collection of counters collected while authorizing users + accessing the target."; + leaf access-rejects { + type oc-yang:counter64; + description + "The total number of times access to the target has been + denied."; + } + leaf last-access-reject { + type oc-types:timeticks64; + description + "A timestamp of the last time access to the target has been + denied."; + } + leaf access-accepts { + type oc-yang:counter64; + description + "The total number of times access to the target has been + allowed."; + } + leaf last-access-accept { + type oc-types:timeticks64; + description + "A timestamp of the last time access to the target has been + allowed."; + } + } + } + // System role SSH related definitions. + + grouping user-ssh-credentials-version { + description + "System role credentials freshness-related data."; + + leaf authorized-principals-list-version { + type version; + description + "The version of the list of authorized principals currently + associated with this system role."; + } + + leaf authorized-principals-list-created-on { + type created-on; + description + "The timestamp of the moment the currently used list of + authorized principals has been created."; + } + + leaf authorized-keys-list-version { + type version; + description + "The version of the list of authorized keys that is currently + associated with this system role."; + } + + leaf authorized-keys-list-created-on { + type created-on; + description + "The timestamp of the moment the currently used list of + authorized keys has been created."; + } + } + + grouping console-config-state { + description + "Console-related configuration and state."; + container console { + description + "Console-related configuration and state."; + + container config { + description + "Console-related configuration."; + } + + container state { + config false; + description + "Console-related state."; + + uses counters; + } + } + } + // System role console related definitions. + + grouping user-console-credentials-version { + description + "System role credentials freshness-related data."; + + leaf password-version { + type version; + description + "The version of the password that is currently used to + authenticate this user account."; + } + + leaf password-created-on { + type created-on; + description + "The timestamp of the moment the currently used password has + been created."; + } + } + + // Augments section. + + augment "/oc-sys:system" { + when "oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" + + "/oc-sys-grpc:config[contains(oc-sys-grpc:services, 'oc-gnsi:GNSI')]" + + "/oc-sys-grpc:enable = 'true'"; + description + "Console credentials freshness data."; + + uses console-config-state; + } + augment "/oc-sys:system/oc-sys:ssh-server/oc-sys:state" { + when "../../oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" + + "/oc-sys-grpc:config[contains(oc-sys-grpc:services, 'oc-gnsi:GNSI')]" + + "/oc-sys-grpc:enable = 'true'"; + description + "SSH server credentials freshness data."; + + uses ssh-server-credentials-version; + uses counters; + } + augment "/oc-sys:system/oc-sys:aaa/oc-sys:authentication/oc-sys:users/" + + "oc-sys:user/oc-sys:state" { + when "../../../../../oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" + + "/oc-sys-grpc:config[contains(oc-sys-grpc:services, 'oc-gnsi:GNSI')]" + + "/oc-sys-grpc:enable = 'true'"; + description + "A system role credentials freshness information."; + + uses user-console-credentials-version; + uses user-ssh-credentials-version; + } + augment "/oc-sys:system/oc-sys:aaa/oc-sys:authentication/oc-sys:admin-user/" + + "oc-sys:state" { + when "../../../../oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" + + "/oc-sys-grpc:config[contains(oc-sys-grpc:services, 'oc-gnsi:GNSI')]" + + "/oc-sys-grpc:enable = 'true'"; + description + "A system role credentials freshness information."; + + uses user-console-credentials-version; + uses user-ssh-credentials-version; + } +} diff --git a/release/models/gnsi/openconfig-gnsi-pathz.yang b/release/models/gnsi/openconfig-gnsi-pathz.yang new file mode 100644 index 000000000..962ea79c4 --- /dev/null +++ b/release/models/gnsi/openconfig-gnsi-pathz.yang @@ -0,0 +1,331 @@ +module openconfig-gnsi-pathz { + yang-version 1; + namespace "https://github.com/openconfig/yang/gnsi/pathz"; + prefix oc-gnsi-pathz; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-system { + prefix oc-sys; + } + import openconfig-system-grpc { + prefix oc-sys-grpc; + } + import openconfig-types { + prefix oc-types; + } + import openconfig-yang-types { + prefix oc-yang; + } + import openconfig-gnsi { + prefix oc-gnsi; + } + + organization + "OpenConfig Working Group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module provides a data model for the metadata of + OpenConfig-path-based authorization policies installed on a networking + device."; + + oc-ext:openconfig-version "0.3.0"; + + revision 2024-02-13 { + description + "Major style updates and move to openconfig/public from openconfig/gnsi. + Last commit at + https://github.com/openconfig/gnsi/commit/347935aac66135d5649dadb9583ed0914578aab0"; + reference "0.3.0"; + } + + revision 2022-10-30 { + description + "Adds success/failure counters."; + reference "0.2.0"; + } + + revision 2022-01-17 { + description + "Initial revision."; + reference "0.1.0"; + } + + typedef version { + type string; + description + "The version ID of the OpenConfig-path-based authorization policy + as provided by the OpenConfig-path-based Authorization Policy + Manager when the policy was pushed. This leaf persists through + a reboot."; + } + + typedef created-on { + type oc-types:timeticks64; + description + "The creation time of the OpenConfig-path-based authorization policy + as reported by the OpenConfig-path-based Authorization Policy + manager when the policy was pushed to the device. This value is + reported as nanoseconds since epoch (January 1st, 1970 00:00:00 GMT). + This leaf persists through a reboot."; + } + + // gRPC server related definitions. + grouping counters { + description + "A collection of counters that were collected by the gNSI.pathz + module while evaluating access to an OpenConfig path."; + + leaf access-rejects { + type oc-yang:counter64; + description + "The total number of times the gNSI.pathz module denied access + to an OpenConfig path."; + } + leaf last-access-reject { + type oc-types:timeticks64; + description + "A timestamp of the last time the gNSI.pathz denied access to + an OpenConfig path"; + } + leaf access-accepts { + type oc-yang:counter64; + description + "The total number of times the gNSI.pathz module allowed access + to an OpenConfig path."; + } + leaf last-access-accept { + type oc-types:timeticks64; + description + "A timestamp of the last time the gNSI.pathz allowed access to + an OpenConfig path"; + } + } + + grouping gnmi-pathz-policy-success-failure-counters { + description + "A collection of counters collected by the gNSI.pathz module."; + + container gnmi-pathz-policy-counters { + config false; + description + "A collection of per-OpenConfig path counters."; + + uses gnmi-pathz-policy-xpath-success-failure-counters; + } + } + + grouping gnmi-pathz-policy-xpath-success-failure-counters { + description + "A collection of per-OpenConfig path counters."; + + container paths { + description + "Container for a collection of per-OpenConfig path counters."; + + list path { + description + "List for a collection of per-OpenConfig path counters."; + key "name"; + leaf name { + type leafref { + path "../state/name"; + } + description + "A OpenConfig schema path the counter were + collected for. + + For documentation on the naming of paths, see + https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-path-conventions.md"; + } + container state { + description + "Operational state for per-OpenConfig path counters."; + leaf name { + type string; + description + "A OpenConfig schema path the counter were + collected for. + + For documentation on the naming of paths, see + https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-path-conventions.md"; + } + container reads { + description + "The counter were collected while + performing a read operation on the + schema path."; + uses counters; + } + container writes { + description + "The counter were collected while + performing a write operation on the + schema path."; + uses counters; + } + } + } + } + } + + grouping grpc-server-gnmi-pathz-policy-state { + description + "gNMI server OpenConfig-path-based authorization policy + freshness-related data."; + + leaf gnmi-pathz-policy-version { + type version; + description + "The version of the OpenConfig-path-based authorization policy + that is used by this gNMI server."; + } + leaf gnmi-pathz-policy-created-on { + type created-on; + description + "The timestamp of the moment when the OpenConfig-path-based + authorization policy that is currently used by this gNMI server + was created."; + } + } + + grouping gnmi-pathz-policy-state { + description + "Operational state data for a gNMI OpenConfig-path-based + authorization policy."; + leaf instance { + type enumeration { + enum ACTIVE { + value 1; + description + "The policy that is currently used by the gNMI service + to authorize access."; + } + enum SANDBOX { + value 2; + description + "The most recent policy that has been uploaded during + the Rotation() RPC. If there is no Rotate() RPC in + progress, then referring to this instance of the policy + will result in an error."; + } + } + description + "The instance identifier of the gNMI OpenConfig-path-based + authorization policy."; + } + leaf version { + type version; + description + "The version of the gNMI OpenConfig-path-based authorization + policy."; + } + leaf created-on { + type created-on; + description + "The timestamp of the moment when the policy was + created."; + } + } + + grouping gnmi-pathz-policies { + description + "Collection of OpenConfig-path-based authorization policies that + have been installed on the device using the gNSI OpenConfig-path- + based authorization policy management service. + Each OpenConfig-path-based authorization policy listed here is + identified by its status (either ACTIVE or SANDBOX) and has its + version and creation date/time listed."; + + container policies { + config false; + description + "Information about freshness of an OpenConfig-path-based + authorization policy that have been installed + on the device using the gNSI OpenConfig-path-based + authorization policy management service."; + + list policy { + key "instance"; + ordered-by system; + description + "Information about the OpenConfig-path-based authorization + policy that is identified by the `instance`."; + leaf instance { + type leafref { + path "../state/instance"; + } + description + "The ID of the OpenConfig-path-based authorization + policy."; + } + container state { + description + "Operational state data for an OpenConfig-path-based + authorization policies."; + + uses gnmi-pathz-policy-state; + } + } + } + } + + grouping system-gnmi-pathz-policies { + description + "Collection of OpenConfig-path-based authorization policies that + have been installed on the device using the gNSI OpenConfig-path- + based authorization policy management service. + Each policy listed here is identified by its status (either ACTIVE + or SANDBOX) and has its version and creation date/time listed."; + + container gnmi-pathz-policies { + config false; + description + "Collection of OpenConfig-path-based authorization policies that + have been installed on the device using the gNSI OpenConfig- + path-based authorization policy management service. + Each policy listed here is identified by its status (either + ACTIVE or SANDBOX) and has its version and creation date/time + listed."; + + uses gnmi-pathz-policies; + } + } + + // Augments section. + + augment "/oc-sys:system" { + when "oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" + + "/oc-sys-grpc:config[contains(oc-sys-grpc:services, 'oc-gnsi:GNSI')]" + + "/oc-sys-grpc:enable = 'true'"; + description + "Collection of OpenConfig-path-based authorization policies that + have been installed on the device using the gNSI OpenConfig-path- + based authorization policy management service. + Each policy listed here is identified by its status (either ACTIVE + or SANDBOX) and has its version and creation date/time listed."; + + uses system-gnmi-pathz-policies; + } + augment "/oc-sys:system/oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" + + "/oc-sys-grpc:state" { + when "../config[contains(services, 'oc-gnsi:GNSI')]/enable = 'true'"; + description + "A gNMI server OpenConfig-path-based authorization policy freshness + information."; + + uses grpc-server-gnmi-pathz-policy-state; + } + augment "/oc-sys:system/oc-sys-grpc:grpc-servers/oc-sys-grpc:grpc-server" { + when "oc-sys-grpc:config[contains(oc-sys-grpc:services, 'oc-gnsi:GNSI')]" + + "/oc-sys-grpc:enable = 'true'"; + description + "A gNMI server OpenConfig-path-based authorization policy + success/failure counters."; + + uses gnmi-pathz-policy-success-failure-counters; + } +} diff --git a/release/models/gnsi/openconfig-gnsi.yang b/release/models/gnsi/openconfig-gnsi.yang new file mode 100644 index 000000000..0c10a2a0b --- /dev/null +++ b/release/models/gnsi/openconfig-gnsi.yang @@ -0,0 +1,40 @@ +module openconfig-gnsi { + yang-version "1"; + + prefix "oc-gnsi"; + + namespace "http://openconfig.net/yang/gnsi"; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-system-grpc { prefix oc-grpc; } + + organization + "OpenConfig Working Group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module defines a set of extensions that provide gNSI (the gRPC + Network Security Interface) specific extensions to the OpenConfig data models. + Specifically, the parameters for the configuration of the service, and + configuration and state are added. + + The gNSI protobufs and documentation are published at + https://github.com/openconfig/gnsi."; + + oc-ext:openconfig-version "0.1.0"; + + revision 2024-02-13 { + description + "Initial revision."; + reference "0.1.0"; + } + + identity GNSI { + base "oc-grpc:GRPC_SERVICE"; + description + "gNSI: gRPC Network Security Interface"; + } +} diff --git a/release/models/system/.spec.yml b/release/models/system/.spec.yml index de5ecc001..92061e9bf 100644 --- a/release/models/system/.spec.yml +++ b/release/models/system/.spec.yml @@ -17,6 +17,11 @@ - yang/system/openconfig-system-logging.yang - yang/system/openconfig-system-terminal.yang - yang/system/openconfig-system-utilization.yang + - yang/gnsi/openconfig-gnsi-acctz.yang + - yang/gnsi/openconfig-gnsi-authz.yang + - yang/gnsi/openconfig-gnsi-certz.yang + - yang/gnsi/openconfig-gnsi-credentialz.yang + - yang/gnsi/openconfig-gnsi-pathz.yang build: - yang/system/openconfig-system.yang - yang/system/openconfig-system-utilization.yang From 9826cae9e0aa1b81dbe5abcbce842adcc35f7921 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 5 Mar 2024 09:05:15 -0800 Subject: [PATCH 140/201] Clarify disable-metric-propagation (#1035) * clarify disable-metric-propagation --- .../openconfig-network-instance-l2.yang | 9 ++++++++- .../openconfig-network-instance.yang | 13 ++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index e983abef0..76afb139f 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,14 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.3.0"; + oc-ext:openconfig-version "4.4.0"; + + revision "2024-02-27" { + description + "Clarify metric to be used for route redistribution when + disable-metric-propagation is set to true."; + reference "4.4.0"; + } revision "2023-12-13" { description diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index b292cfb2b..f6d32cbc2 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,14 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.3.0"; + oc-ext:openconfig-version "4.4.0"; + + revision "2024-02-27" { + description + "Clarify metric to be used for route redistribution when + disable-metric-propagation is set to true."; + reference "4.4.0"; + } revision "2023-12-13" { description @@ -1237,8 +1244,8 @@ module openconfig-network-instance { - IS-IS metric may be reflected in BGP MED (and vice versa) - OSPF metric may be reflected in the BGP MED (and vice versa) When this leaf is set to true, this reflection behaviour MUST be - disabled, and rather the metric must be set to the default value, - or explicitly set by policy."; + disabled, and rather the metric must be set to '0' or explicitly + set by policy."; } uses oc-rpol:apply-policy-import-config; From 7d21dfc82acb9e39ee8b23a05ba3f5101f33b196 Mon Sep 17 00:00:00 2001 From: Brian Neville <29639579+brianneville@users.noreply.github.com> Date: Wed, 6 Mar 2024 18:59:13 +0000 Subject: [PATCH 141/201] gnsi: align with latest certz version (#1061) * (M) release/models/gnsi/openconfig-gnsi-certz.yang Align oc paths for gnsi with latest certz version. See the changes to gnsi-certz.yang at: https://github.com/openconfig/gnsi/pull/156 This commit also sets the container name for the certz counters to be just "counters" to be backward-compatible with the existing gnsi-certz.yang. The module name/prefix already mark these counters as certz-related, so we don't need to duplicate this information in the container name too. --- .../models/gnsi/openconfig-gnsi-certz.yang | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/release/models/gnsi/openconfig-gnsi-certz.yang b/release/models/gnsi/openconfig-gnsi-certz.yang index 9b5e9a1ca..0b303cdc0 100644 --- a/release/models/gnsi/openconfig-gnsi-certz.yang +++ b/release/models/gnsi/openconfig-gnsi-certz.yang @@ -30,7 +30,13 @@ module openconfig-gnsi-certz { "This module provides a data model for the metadata of gRPC credentials installed on a networking device."; - oc-ext:openconfig-version "0.5.0"; + oc-ext:openconfig-version "0.6.0"; + + revision 2024-03-05 { + description + "rename access/reject counters"; + reference "0.6.0"; + } revision 2024-02-13 { description @@ -87,36 +93,36 @@ module openconfig-gnsi-certz { "A collection of counters that were collected while evaluating access to the gRPC server."; - container certz-counters { + container counters { config false; description - "A collection of counters that were collected by the gRPC during - the authentication process."; + "A collection of counters that were collected by the gRPC during + the authentication process."; - leaf access-rejects { + leaf connection-rejects { type oc-yang:counter64; description - "The total number of times a TLS handshake failure has occurred and - the gRPC server denied access a client."; + "The total number of times that gRPC clients have failed + in establishing a connection to the server."; } - leaf last-access-reject { + leaf last-connection-reject { type oc-types:timeticks64; description - "A timestamp of the last time the gRPC denied access to - the server."; + "A timestamp of the last time a gRPC client failed + in establishing a connection to the server."; } - leaf access-accepts { + leaf connection-accepts { type oc-yang:counter64; description - "The total number of times a successful TLS handshake is completed - and the gPRC server allows access to a client."; + "The total number of times that gRPC clients have succeeded + in establishing a connection to the server."; } - leaf last-access-accept { + leaf last-connection-accept { type oc-types:timeticks64; description - "A timestamp of the last time the gRPC allowed access to - the server."; - } + "A timestamp of the last time a gRPC client succeeded + in establishing a connection to the server."; + } } } From 815341544e58548526e7f9bec4e0ed2d615b69ac Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Thu, 7 Mar 2024 17:00:06 -0800 Subject: [PATCH 142/201] Clarify input-power threshold (#1056) * (M) release/models/platform/openconfig-platform-transceiver.yang Clarify transceiver optical power thresholds --- .../openconfig-platform-transceiver.yang | 58 ++++++++++++++----- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/release/models/platform/openconfig-platform-transceiver.yang b/release/models/platform/openconfig-platform-transceiver.yang index 195f56454..81a6e7031 100644 --- a/release/models/platform/openconfig-platform-transceiver.yang +++ b/release/models/platform/openconfig-platform-transceiver.yang @@ -66,7 +66,13 @@ module openconfig-platform-transceiver { specify a physical-channel within a TRANSCEIVER component (i.e. gray optic) that it is associated with."; - oc-ext:openconfig-version "0.13.0"; + oc-ext:openconfig-version "0.14.0"; + +revision "2023-08-30" { + description + "Clarify transceiver module threshold for input-power."; + reference "0.14.0"; + } revision "2023-08-30" { description @@ -451,9 +457,7 @@ revision "2023-08-30" { container thresholds { description - "Enclosing container for transceiver alarm thresholds. - Each threshold is compared to the instant value of the - measured parameter corresponding to the threshold"; + "Enclosing container for transceiver alarm thresholds."; list threshold { key "severity"; @@ -775,7 +779,9 @@ revision "2023-08-30" { } units celsius; description - "The upper temperature threshold for the laser temperature sensor."; + "The upper temperature threshold for the laser temperature sensor. + This leaf value is compared to the instant value of + laser-temperature."; } leaf laser-temperature-lower { type decimal64 { @@ -783,7 +789,9 @@ revision "2023-08-30" { } units celsius; description - "The lower temperature threshold for the laser temperature sensor."; + "The lower temperature threshold for the laser temperature sensor. + This leaf value is compared to the instant value of + laser-temperature."; } leaf output-power-upper{ type decimal64 { @@ -791,7 +799,10 @@ revision "2023-08-30" { } units dBm; description - "The upper power threshold for the laser output power."; + "The upper power threshold for the laser output power. This threshold + applies to every physical-channel on the transceiver and does not + apply to the aggregate transceiver optical-output-power. This leaf + value is compared to the instant value of optical-output-power."; } leaf output-power-lower{ type decimal64 { @@ -799,7 +810,10 @@ revision "2023-08-30" { } units dBm; description - "The lower power threshold for the laser output power."; + "The lower power threshold for the laser output power. This threshold + applies to every physical-channel on the transceiver and does not + apply to the aggregate transceiver optical-output-power. This leaf + value is compared to the instant value of optical-output-power."; } leaf input-power-upper{ type decimal64 { @@ -807,7 +821,10 @@ revision "2023-08-30" { } units dBm; description - "The upper power threshold for the laser input power."; + "The upper power threshold for the laser input power. This threshold + applies to every physical-channel on the transceiver and does not + apply to the aggregate transceiver optical-input-power. This leaf + value is compared to the instant value of optical-input-power."; } leaf input-power-lower{ type decimal64 { @@ -815,11 +832,15 @@ revision "2023-08-30" { } units dBm; description - "The lower power threshold for the laser input power."; + "The lower power threshold for the laser input power. This threshold + applies to every physical-channel on the transceiver and does not + apply to the aggregate transceiver optical-input-power. This leaf + value is compared to the instant value of optical-input-power."; } leaf laser-bias-current-upper{ description - "The upper threshold for the laser bias current."; + "The upper threshold for the laser bias current. This leaf value is + compared to the instant value of last-bias-current."; type decimal64 { fraction-digits 2; } @@ -827,7 +848,8 @@ revision "2023-08-30" { } leaf laser-bias-current-lower{ description - "The lower threshold for the laser bias current."; + "The lower threshold for the laser bias current. This leaf value is + compared to the instant value of last-bias-current."; type decimal64 { fraction-digits 2; } @@ -835,7 +857,8 @@ revision "2023-08-30" { } leaf supply-voltage-upper{ description - "The upper threshold for the transceiver supply voltage."; + "The upper threshold for the transceiver supply voltage. This leaf + value is compared to the instant value of supply-voltage."; type decimal64 { fraction-digits 2; } @@ -843,7 +866,8 @@ revision "2023-08-30" { } leaf supply-voltage-lower{ description - "The lower threshold for the transceiver supply voltage."; + "The lower threshold for the transceiver supply voltage. This leaf + value is compared to the instant value of supply-voltage."; type decimal64 { fraction-digits 2; } @@ -855,7 +879,8 @@ revision "2023-08-30" { } units celsius; description - "The lower temperature threshold for the transceiver module."; + "The lower temperature threshold for the transceiver module. This + leaf value is compared to the instant value of module-temperature."; } leaf module-temperature-upper { type decimal64 { @@ -863,7 +888,8 @@ revision "2023-08-30" { } units celsius; description - "The upper temperature threshold for the transceiver module."; + "The upper temperature threshold for the transceiver module. This + leaf value is compared to the instant value of module-temperature."; } } From 0cdabe1b9993d83145a670ac792ad4780b5157c3 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 12 Mar 2024 21:41:13 -0700 Subject: [PATCH 143/201] Fix typos in Integrated-Circuit_pipeline_aggregated_counters_guide (#1069) --- ...rated-Circuit_pipeline_aggregated_counters_guide.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md b/doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md index 3dfc5087a..ad7c64d37 100644 --- a/doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md +++ b/doc/Integrated-Circuit_pipeline_aggregated_counters_guide.md @@ -1,4 +1,4 @@ -# Intergrated Circuit aggregated pipeline counters guide +# Integrated Circuit aggregated pipeline counters guide ## Introduction This guide discusses semantics of different counters provided under the `openconfig-platform/components/component/integrated-circuit/pipeline-counters` container. @@ -36,21 +36,21 @@ The increments of this counter are typically signal of some form of attack with The increments of this counter are expected during convergence events as well as during stable operation. However rapid increase in drop rate **may** be a signal of network being unhealthy and typically requires further investigation. The further break down of this counter, if available as vendor extension under `/openconfig-platform:components/component/integrated-circuit/openconfig-platform-pipeline-counters:pipeline-counters/drop/vendor` container could help to further narrow-down cause of drops. -If prolonged packet drops are found to be caused by lack of FIB entry for incomming packets, this suggest inconsistency between Network Control plane protocols (BGP, IGP, RSVP, gRIBI), FIB calculated by Controller Card and FIB programmed into given Integrated Circuit. +If prolonged packet drops are found to be caused by lack of FIB entry for incoming packets, this suggest inconsistency between Network Control plane protocols (BGP, IGP, RSVP, gRIBI), FIB calculated by Controller Card and FIB programmed into given Integrated Circuit. -If implemetation supports `urpf-aggregate` counter, packets discarded due to uRPF should not be counted as `packet-processing-aggregate`. Else, uRPF discarded oacket should be counted against this counter. +If an implementation supports `urpf-aggregate` counter, packets discarded due to uRPF should not be counted as `packet-processing-aggregate`. Else, uRPF discarded oacket should be counted against this counter. #### congestion-aggregate ##### Usability -The increments of this counter are signal of given Integrated Circuit being overhelmed by incomming traffic and complexity of packet processing that is required. +The increments of this counter are signal of given Integrated Circuit being overhelmed by incoming traffic and complexity of packet processing that is required. #### adverse-aggregate ##### Usability The increments of this counter are generally a signal of a hardware defect (e.g. memory errors or signal integrity issues) or (micro)code software defects. -#### Queue tail and AQM drops exeption discussion. +#### Queue tail and AQM drops exception discussion. Drops associated with QoS queue tail or AQM are the result of egress interface congestion. This is NOT the same as I-C congestion, and should be counted using /interfaces counters as it is expected state from the platform (router) point of view. It may be not expected state from a network design point of view but from the INTEGRATED_CIRCUIT, it is behaving according to design. The OpenConfig definition for [congestion-aggregate](https://github.com/openconfig/public/blob/5d38d8531ef9c5b998262207eb6dbdae8968f9fe/release/models/platform/openconfig-platform-pipeline-counters.yang#L1096-L1099) excludes "queue drop counters". It desirable to not count QoS queue drops under this `congestion-aggregate` in order to maintain a clear signal of hitting I-C performance limitations, rather then blend it with basic, simple egress interface speed limitations. From 6fd1f5d24d35b693864aa3218315b2acbeae9055 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Wed, 13 Mar 2024 18:01:04 -0700 Subject: [PATCH 144/201] add bgp comm regex-match (#1043) * (M) release/models/bgp/openconfig-bgp-errors.yang * (M) release/models/bgp/openconfig-bgp-policy.yang * (M) release/models/bgp/openconfig-bgp-types.yang * (M) release/models/types/openconfig-types.yang Adds posix-regex type and bgp-community-regex type and changes the bgp community-member list to include use the new posix community type. This is a breaking change due to changing an existing union type. Also clarifies the linkbw community type description. --- release/models/bgp/openconfig-bgp-errors.yang | 9 ++++- release/models/bgp/openconfig-bgp-policy.yang | 40 ++++++++++++++----- release/models/bgp/openconfig-bgp-types.yang | 28 +++++++++---- release/models/types/openconfig-types.yang | 16 +++++++- 4 files changed, 74 insertions(+), 19 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-errors.yang b/release/models/bgp/openconfig-bgp-errors.yang index 395fb2d3f..662395606 100644 --- a/release/models/bgp/openconfig-bgp-errors.yang +++ b/release/models/bgp/openconfig-bgp-errors.yang @@ -18,7 +18,14 @@ submodule openconfig-bgp-errors { "This module defines BGP NOTIFICATION message error codes and subcodes"; - oc-ext:openconfig-version "5.6.0"; + oc-ext:openconfig-version "6.0.0"; + + revision "2024-01-31" { + description + "Update community-sets/members/member union type by replacing + the bgp-regex type with posix-eregexp."; + reference "6.0.0"; + } revision "2023-12-26" { description diff --git a/release/models/bgp/openconfig-bgp-policy.yang b/release/models/bgp/openconfig-bgp-policy.yang index 169f78652..03dd2ab8d 100644 --- a/release/models/bgp/openconfig-bgp-policy.yang +++ b/release/models/bgp/openconfig-bgp-policy.yang @@ -13,7 +13,7 @@ module openconfig-bgp-policy { import openconfig-policy-types { prefix oc-pol-types; } import openconfig-bgp-types { prefix oc-bgp-types; } import openconfig-extensions { prefix oc-ext; } - + import openconfig-types { prefix oc-types; } // meta organization @@ -28,7 +28,14 @@ module openconfig-bgp-policy { It augments the base routing-policy module with BGP-specific options for conditions and actions."; - oc-ext:openconfig-version "6.4.0"; + oc-ext:openconfig-version "7.0.0"; + + revision "2024-01-31" { + description + "Update community-sets/members/member union type by replacing + the bgp-regex type with posix-eregexp."; + reference "7.0.0"; + } revision "2023-12-19" { description @@ -593,13 +600,20 @@ module openconfig-bgp-policy { type oc-bgp-types:bgp-well-known-community-type; } description - "members of the community set. - For an ADD operation these are the communities that will be added; - the regexp type is not valid in this operation. + "Members of the community set. + For an ADD operation these are the communities that will be + added. The regexp type is not valid in this operation. + For REMOVE or REPLACE operations then matching communities will be removed unless match-set-options is INVERT which will reverse this to mean that anything that does not match will be - removed."; + removed. + + For MATCH operations the posix-eregexp type should be evaluated + against each community associated with a prefix one community + at a time. Communities must be represented as strings in formats + conforming to oc-bgp-types:bgp-std-community-type. For example: + `1000:1000` for a standard community"; } leaf match-set-options { @@ -672,16 +686,24 @@ module openconfig-bgp-policy { leaf-list ext-community-member { type union { type oc-bgp-types:bgp-ext-community-type; - type oc-bgp-types:bgp-community-regexp-type; + type oc-types:posix-eregexp; } description - "members of the extended community set + "Members of the extended community set. For an ADD operation these are the communities that will be added; the regexp type is not valid in this operation. + For REMOVE or REPLACE operations then matching communities will be removed unless match-set-options is INVERT which will reverse this to mean that anything that does not match will be - removed."; + removed. + + For MATCH operations the posix-eregexp type should be evaluated + against each community associated with a prefix one community + at a time. Communities must be represented as strings in formats + conforming to oc-bgp-types:bgp-ext-community-type. For example: + `route-origin:1000:1000` for the origin type extended community, + and so on."; } leaf match-set-options { diff --git a/release/models/bgp/openconfig-bgp-types.yang b/release/models/bgp/openconfig-bgp-types.yang index b2ce46ef7..2a9298a6a 100644 --- a/release/models/bgp/openconfig-bgp-types.yang +++ b/release/models/bgp/openconfig-bgp-types.yang @@ -4,7 +4,6 @@ module openconfig-bgp-types { namespace "http://openconfig.net/yang/bgp-types"; prefix "oc-bgp-types"; - import openconfig-types { prefix "oc-types"; } import openconfig-inet-types { prefix "oc-inet"; } import openconfig-extensions { prefix "oc-ext"; } @@ -25,7 +24,13 @@ module openconfig-bgp-types { policy. It can be imported by modules that make use of BGP attributes"; - oc-ext:openconfig-version "5.6.0"; + oc-ext:openconfig-version "6.0.0"; + + revision "2024-02-01" { + description + "Modify bgp-community-regexp-type."; + reference "6.0.0"; + } revision "2023-12-26" { description @@ -635,11 +640,15 @@ module openconfig-bgp-types { - route-origin:<2b ASN>:<4b value> per RFC4360 section 5 - route-origin:<4b IPv4>:<2b value> per RFC4360 section 5 - color::<4b value> per draft-ietf-idr-segment-routing-te-policy - section 3"; + section 3 + - link-bandwidth:<2 byte asn>: per + draft-ietf-idr-link-bandwidth-07"; + reference "RFC 4360 - BGP Extended Communities Attribute RFC 5668 - 4-Octet AS Specific BGP Extended Community - draft-ietf-idr-segment-routing-te-policy"; + draft-ietf-idr-segment-routing-te-policy + draft-ietf-idr-link-bandwidth-07"; } typedef bgp-ext-community-recv-type { @@ -673,12 +682,15 @@ module openconfig-bgp-types { } typedef bgp-community-regexp-type { - // TODO: needs more work to decide what format these regexps can - // take. - type oc-types:std-regexp; + type oc-types:posix-eregexp; description "Type definition for communities specified as regular - expression patterns"; + expression patterns. The regular expression must be a + POSIX extended regular expression with some limitations + which are commonly found in device implementations described + in draft-ietf-idr-bgp-model."; + reference + "draft-ietf-idr-bgp-model"; } typedef bgp-origin-attr-type { diff --git a/release/models/types/openconfig-types.yang b/release/models/types/openconfig-types.yang index 89e32d515..a146b9b76 100644 --- a/release/models/types/openconfig-types.yang +++ b/release/models/types/openconfig-types.yang @@ -21,7 +21,13 @@ module openconfig-types { are used across OpenConfig models. It can be imported by modules that make use of these types."; - oc-ext:openconfig-version "0.6.0"; + oc-ext:openconfig-version "1.0.0"; + + revision "2024-01-31" { + description + "Add posix-eregexp type and promote model to version 1.0.0."; + reference "1.0.0"; + } revision "2019-04-16" { description @@ -101,6 +107,14 @@ module openconfig-types { supported. An initial proposal is POSIX compatible."; } + typedef posix-eregexp { + type string; + description + "This is a string which represents an extended POSIX + regular expression."; + reference "IEEE Std 1003.1-2017"; + } + typedef timeticks64 { type uint64; units "nanoseconds"; From 81ca3e312049005abb99d145a9b77d742f74363b Mon Sep 17 00:00:00 2001 From: yini101 <86263319+yini101@users.noreply.github.com> Date: Mon, 18 Mar 2024 19:45:11 -0700 Subject: [PATCH 145/201] openconfig/network-instances: Add counters under endpoint-peer and endpoint-vni (#1018) * Add operational state regarding traffic encapsulated on local device and directed towards a specific VTEP network-instances/network-instance/connection-points/connection-point/ endpoints/endpoint/vxlan/endpoint-peers/endpoint-peer/state/counters/ --- .../network-instance/openconfig-evpn.yang | 108 +++++++++++++++++- 1 file changed, 106 insertions(+), 2 deletions(-) diff --git a/release/models/network-instance/openconfig-evpn.yang b/release/models/network-instance/openconfig-evpn.yang index ef61d758e..d82ceffc6 100644 --- a/release/models/network-instance/openconfig-evpn.yang +++ b/release/models/network-instance/openconfig-evpn.yang @@ -40,7 +40,13 @@ module openconfig-evpn { domains, this is not currently supported and requires an extension of the model."; - oc-ext:openconfig-version "0.6.0"; + oc-ext:openconfig-version "0.7.0"; + + revision "2024-02-01" { + description + "Add counters under endpoint-peer and endpoint-vni"; + reference "0.7.0"; + } revision "2023-07-12" { description @@ -910,7 +916,8 @@ module openconfig-evpn { description "Container for state parameters related to this VTEP peer"; uses evpn-endpoint-peer-state; - } + uses evpn-endpoint-counters; + } } } @@ -939,6 +946,9 @@ module openconfig-evpn { "Container for state parameters related to this L2VNI or L3VNI"; uses evpn-endpoint-vni-state; } + + uses ipv4-top; + uses ipv6-top; } } } @@ -989,6 +999,100 @@ module openconfig-evpn { } } + grouping evpn-endpoint-counters { + description + "Grouping for Operational state regarding encapsulated traffic."; + container counters { + description + "Operational state regarding encapsulated traffic."; + leaf total-encap-pkts { + type oc-yang:counter64; + description + "The total number of encapsulated packets."; + } + leaf total-encap-bytes { + type oc-yang:counter64; + description + "The total number of encapsulated bytes."; + } + leaf bum-encap-pkts { + type oc-yang:counter64; + description + "The total number of encapsulated BUM packets."; + } + leaf total-decap-pkts { + type oc-yang:counter64; + description + "The total number of decapsulated packets."; + } + leaf total-decap-bytes { + type oc-yang:counter64; + description + "The total number of decapsulated bytes."; + } + leaf unicast-decap-pkts { + type oc-yang:counter64; + description + "The total number of decapsulated unicast packets."; + } + leaf bum-decap-pkts { + type oc-yang:counter64; + description + "The total number of decapsulated BUM packets."; + } + leaf bum-decap-multicast-pkts { + type oc-yang:counter64; + description + "The number of decapsulated BUM packets received via underlay multicast."; + } + leaf bum-decap-ir-pkts { + type oc-yang:counter64; + description + "The number of decapsulated BUM packets received via underlay ingress replication."; + } + leaf drop-decap-pkts { + type oc-yang:counter64; + description + "The total number of decapsulated packets that have been dropped locally."; + } + leaf except-decap-pkts { + type oc-yang:counter64; + description + "The total number of decapsulated packets that hit an exceptional condition."; + } + } + } + + grouping ipv4-top { + description + "Grouping for Operational state of IPv4 address family."; + container ipv4 { + description + "Parameters for the IPv4 address family."; + container state { + config false; + description + "Top level IPv4 operational state data."; + uses evpn-endpoint-counters; + } + } + } + + grouping ipv6-top { + description + "Grouping for Operational state of IPv6 address family."; + container ipv6 { + description + "Parameters for the IPv6 address family."; + container state { + config false; + description + "Top level IPv6 operational state data."; + uses evpn-endpoint-counters; + } + } + } + grouping evpn-endpoint-vni-state { description "Grouping for L2VNI and L3VNI state information learned on the From ed94287984cfcabfe8b07732864473f0fca6cb2e Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 19 Mar 2024 09:57:47 -0700 Subject: [PATCH 146/201] Update in/out-pkts descriptions (#1072) --- release/models/interfaces/openconfig-if-ip.yang | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/release/models/interfaces/openconfig-if-ip.yang b/release/models/interfaces/openconfig-if-ip.yang index 6ab1ddc24..8aebaaa06 100644 --- a/release/models/interfaces/openconfig-if-ip.yang +++ b/release/models/interfaces/openconfig-if-ip.yang @@ -44,7 +44,13 @@ module openconfig-if-ip { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.5.0"; + oc-ext:openconfig-version "3.5.1"; + + revision "2024-03-13" { + description + "Update in-pkts and out-pkts descriptions."; + reference "3.5.1"; + } revision "2023-08-14" { description @@ -241,7 +247,8 @@ revision "2023-06-30" { type oc-yang:counter64; description "The total number of IP packets received for the specified - address family, including those received in error"; + address family, including all IP unicast, multicast, + broadcast and error packets."; reference "RFC 4293 - Management Information Base for the Internet Protocol (IP)"; @@ -341,7 +348,8 @@ revision "2023-06-30" { specified address family that the device supplied to the lower layers for transmission. This includes packets generated locally and those forwarded by the - device."; + device as well as unicast, multicast and broadcast + packets."; reference "RFC 4293 - Management Information Base for the Internet Protocol (IP)"; From ea279957a8dab6eb0c0b05e5a134bc3dfb0c8d28 Mon Sep 17 00:00:00 2001 From: Eric Breverman Date: Tue, 19 Mar 2024 11:36:56 -0700 Subject: [PATCH 147/201] Add tributary types up to 3200G. (#1071) * Add tributary types up to 3200G. --- .../openconfig-transport-types.yang | 201 +++++++++++++++++- 1 file changed, 200 insertions(+), 1 deletion(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index db7f711a0..e78dc88f1 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,14 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.22.0"; + oc-ext:openconfig-version "0.23.0"; + + revision "2024-03-12" { + description + "Add TRIBUTARY_RATE_CLASS_TYPE's up to 3200G to support + mating of two 1600G line rates."; + reference "0.23.0"; + } revision "2024-01-17" { description @@ -1494,6 +1501,198 @@ module openconfig-transport-types { "1600G tributary signal rate"; } + identity TRIB_RATE_1650G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1650G tributary signal rate"; + } + + identity TRIB_RATE_1700G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1700G tributary signal rate"; + } + + identity TRIB_RATE_1750G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1750G tributary signal rate"; + } + + identity TRIB_RATE_1800G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1800G tributary signal rate"; + } + + identity TRIB_RATE_1850G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1850G tributary signal rate"; + } + + identity TRIB_RATE_1900G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1900G tributary signal rate"; + } + + identity TRIB_RATE_1950G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1950G tributary signal rate"; + } + + identity TRIB_RATE_2000G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2000G tributary signal rate"; + } + + identity TRIB_RATE_2050G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2050G tributary signal rate"; + } + + identity TRIB_RATE_2100G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2100G tributary signal rate"; + } + + identity TRIB_RATE_2150G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2150G tributary signal rate"; + } + + identity TRIB_RATE_2200G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2200G tributary signal rate"; + } + + identity TRIB_RATE_2250G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2250G tributary signal rate"; + } + + identity TRIB_RATE_2300G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2300G tributary signal rate"; + } + + identity TRIB_RATE_2350G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2350G tributary signal rate"; + } + + identity TRIB_RATE_2400G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2400G tributary signal rate"; + } + + identity TRIB_RATE_2450G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2450G tributary signal rate"; + } + + identity TRIB_RATE_2500G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2500G tributary signal rate"; + } + + identity TRIB_RATE_2550G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2550G tributary signal rate"; + } + + identity TRIB_RATE_2600G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2600G tributary signal rate"; + } + + identity TRIB_RATE_2650G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2650G tributary signal rate"; + } + + identity TRIB_RATE_2700G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2700G tributary signal rate"; + } + + identity TRIB_RATE_2750G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2750G tributary signal rate"; + } + + identity TRIB_RATE_2800G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2800G tributary signal rate"; + } + + identity TRIB_RATE_2850G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2850G tributary signal rate"; + } + + identity TRIB_RATE_2900G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2900G tributary signal rate"; + } + + identity TRIB_RATE_2950G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2950G tributary signal rate"; + } + + identity TRIB_RATE_3000G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3000G tributary signal rate"; + } + + identity TRIB_RATE_3050G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3050G tributary signal rate"; + } + + identity TRIB_RATE_3100G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3100G tributary signal rate"; + } + + identity TRIB_RATE_3150G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3150G tributary signal rate"; + } + + identity TRIB_RATE_3200G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3200G tributary signal rate"; + } + identity LOGICAL_ELEMENT_PROTOCOL_TYPE { description "Type of protocol framing used on the logical channel or From 0b4650082b8a1de57285408b50491dddf86eb136 Mon Sep 17 00:00:00 2001 From: Eric Breverman Date: Tue, 26 Mar 2024 08:16:53 -0700 Subject: [PATCH 148/201] 800G Client Related Additions (#1079) * Add tributary types up to 3200G. * 800G updates --- .../openconfig-transport-types.yang | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index e78dc88f1..dc5699842 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,14 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.23.0"; + oc-ext:openconfig-version "0.24.0"; + + revision "2024-03-20" { + description + "FlexO support, 800G trib protocol, and OSFP + description update for 800G."; + reference "0.24.0"; + } revision "2024-03-12" { description @@ -808,6 +815,11 @@ module openconfig-transport-types { description "400G Ethernet protocol"; } + identity PROT_800GE { + base TRIBUTARY_PROTOCOL_TYPE; + description "800G Ethernet protocol"; + } + identity PROT_OTSIG { base TRIBUTARY_PROTOCOL_TYPE; description "Optical tributary signal group protocol"; @@ -818,6 +830,12 @@ module openconfig-transport-types { description "ODU Flex with CBR protocol"; } + identity PROT_FLEXO { + base TRIBUTARY_PROTOCOL_TYPE; + description + "FlexO protocol as defined in ITU-T G.709.1 and ITU-T G.709.3"; + } + identity PROT_ODUFLEX_GFP { base TRIBUTARY_PROTOCOL_TYPE; description "ODU Flex with GFP protocol"; @@ -998,7 +1016,7 @@ module openconfig-transport-types { base TRANSCEIVER_FORM_FACTOR_TYPE; description "Octal small form factor pluggable transceiver supporting - 400 Gb/s."; + 400 Gb/s or 800 Gb/s."; } identity NON_PLUGGABLE { From 33bd0407ee6ea4aa1ded0084b9611938dc00cbcd Mon Sep 17 00:00:00 2001 From: rszarecki <46606165+rszarecki@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:46:26 -0700 Subject: [PATCH 149/201] ISIS graceful-restart timers and planned restart toggle (#1058) * Extending ISIS GR to support configuration of RFC5306/REFC8706 timers --- release/models/isis/openconfig-isis-lsp.yang | 8 +- .../models/isis/openconfig-isis-routing.yang | 8 +- release/models/isis/openconfig-isis.yang | 108 +++++++++++++++++- 3 files changed, 120 insertions(+), 4 deletions(-) diff --git a/release/models/isis/openconfig-isis-lsp.yang b/release/models/isis/openconfig-isis-lsp.yang index 04ac1dae3..707a8706e 100644 --- a/release/models/isis/openconfig-isis-lsp.yang +++ b/release/models/isis/openconfig-isis-lsp.yang @@ -34,7 +34,13 @@ submodule openconfig-isis-lsp { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "1.6.2"; + oc-ext:openconfig-version "1.7.0"; + + revision "2024-02-28" { + description + "ISIS graceful-restart timers and per-level configuration."; + reference "1.7.0"; + } revision "2024-02-20" { description diff --git a/release/models/isis/openconfig-isis-routing.yang b/release/models/isis/openconfig-isis-routing.yang index 12c243421..80a3154ff 100644 --- a/release/models/isis/openconfig-isis-routing.yang +++ b/release/models/isis/openconfig-isis-routing.yang @@ -20,7 +20,13 @@ submodule openconfig-isis-routing { description "This module describes YANG model for ISIS Routing"; - oc-ext:openconfig-version "1.6.2"; + oc-ext:openconfig-version "1.7.0"; + + revision "2024-02-28" { + description + "ISIS graceful-restart timers and per-level configuration."; + reference "1.7.0"; + } revision "2024-02-20" { description diff --git a/release/models/isis/openconfig-isis.yang b/release/models/isis/openconfig-isis.yang index d08e14d14..fcad2fb68 100644 --- a/release/models/isis/openconfig-isis.yang +++ b/release/models/isis/openconfig-isis.yang @@ -54,7 +54,13 @@ module openconfig-isis { +-> { levels config } +-> { level adjacencies }"; - oc-ext:openconfig-version "1.6.2"; + oc-ext:openconfig-version "1.7.0"; + + revision "2024-02-28" { + description + "ISIS graceful-restart timers and per-level configuration."; + reference "1.7.0"; + } revision "2024-02-20" { description @@ -925,7 +931,60 @@ module openconfig-isis { graceful restart procedures during its own restart, but supports retaining forwarding information during a remote speaker's restart."; } - reference "RFC 5306: Restart Signaling for IS-IS."; + + leaf non-planned-only { + type boolean; + description + "When this leaf is set to TRUE, planned restart procedures as + described in RFC 8706 are not used."; + reference + "RFC 5706: Restart Signaling for IS-IS"; + } + + reference + "RFC 5306: Restart Signaling for IS-IS; RFC 5706: Restart Signaling + for IS-IS"; + } + + grouping isis-graceful-restart-level-config { + description + "This grouping defines ISIS graceful restart configuration relevant + for ISIS level/LSDB"; + + leaf restart-time { + type uint16; + default 30; + description + "Value of RFC5306/RFC8706 T2 timer"; + } + + reference + "RFC 5306: Restart Signaling for IS-IS; RFC 5706: Restart Signaling + for IS-IS"; + } + + grouping isis-graceful-restart-interface-config { + description + "This grouping defines ISIS graceful restart configuration relevant + for ISIS interface/adjacency"; + + leaf interface-timer { + type uint16; + description + "Value of RFC5306/RFC8706 T1 timer"; + } + + leaf interface-time-expirations { + type int64; + description + "Number of times T1 expires before IIH without Restart TLV's RR flag + set is sent. That is GR helper is not supported by adjacents + Inermediate System"; + } + + reference + "RFC 5306: Restart Signaling for IS-IS; RFC 5706: Restart Signaling + for IS-IS"; } // configuration context containers @@ -1127,6 +1186,8 @@ module openconfig-isis { uses admin-config; uses isis-graceful-restart-config; + uses isis-graceful-restart-level-config; + uses isis-graceful-restart-interface-config; } container state { @@ -1136,6 +1197,8 @@ module openconfig-isis { uses admin-config; uses isis-graceful-restart-config; + uses isis-graceful-restart-level-config; + uses isis-graceful-restart-interface-config; } } @@ -1401,6 +1464,25 @@ module openconfig-isis { uses isis-bfd-config; } } + container graceful-restart { + description + "This container defines ISIS Graceful Restart for interface"; + + container config { + description + "This container defines interface config parameters for ISIS + graceful-restart."; + + uses isis-graceful-restart-interface-config; + } + container state { + config false; + description + "This container defines information for ISIS graceful-restart."; + + uses isis-graceful-restart-interface-config; + } + } } grouping isis-bfd-config { @@ -1494,6 +1576,28 @@ module openconfig-isis { uses isis-authentication-check-config; } + container graceful-restart { + description + "This container defines ISIS Graceful Restart."; + + container config { + description + "This container defines ISIS graceful-restart configuration."; + + uses admin-config; + uses isis-graceful-restart-level-config; + } + + container state { + config false; + description + "This container defines state information for ISIS graceful-restart."; + + uses admin-config; + uses isis-graceful-restart-level-config; + } + } + container system-level-counters { description "This container defines ISIS system level counters."; From 4f408783df925f4eb9d3bf7cd320c66cae4b6fb0 Mon Sep 17 00:00:00 2001 From: kcroussore <159063602+kcroussore@users.noreply.github.com> Date: Thu, 4 Apr 2024 18:22:00 -0700 Subject: [PATCH 150/201] Add media-channel expected-power to openconfig-channel-monitor (#1087) * Add media-channel target-power to openconfig-channel-monitor #1066 --- .../openconfig-channel-monitor.yang | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/release/models/optical-transport/openconfig-channel-monitor.yang b/release/models/optical-transport/openconfig-channel-monitor.yang index fff223b55..3623681c6 100644 --- a/release/models/optical-transport/openconfig-channel-monitor.yang +++ b/release/models/optical-transport/openconfig-channel-monitor.yang @@ -26,7 +26,13 @@ module openconfig-channel-monitor { channel monitor (OCM) for optical transport line system elements such as wavelength routers (ROADMs) and amplifiers."; - oc-ext:openconfig-version "0.4.0"; + oc-ext:openconfig-version "0.5.0"; + + revision "2024-04-04" { + description + "Add new leaf media-channel target-power."; + reference "0.5.0"; + } revision "2019-10-24" { description @@ -168,8 +174,16 @@ module openconfig-channel-monitor { description "Average measured optical power over the specified spectrum"; } - } + leaf target-power { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "Target optical power over the specified spectrum"; + } + } grouping media-channel-spectrum-power-top { description From 4177f941c54017b160da1839c65c74f1ebc9ed88 Mon Sep 17 00:00:00 2001 From: Mike Wiebe Date: Thu, 11 Apr 2024 19:35:36 -0400 Subject: [PATCH 151/201] Add support for vni-peer-group container (#1015) * Add support for /network-instances/network-instance/connection-points/connection-point/endpoints/endpoint/vxlan/endpoint-peers/vni-peer-groups container * deprecate control-plane-vnis, router-mac --- .../network-instance/openconfig-evpn.yang | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/release/models/network-instance/openconfig-evpn.yang b/release/models/network-instance/openconfig-evpn.yang index d82ceffc6..3b201e809 100644 --- a/release/models/network-instance/openconfig-evpn.yang +++ b/release/models/network-instance/openconfig-evpn.yang @@ -40,7 +40,13 @@ module openconfig-evpn { domains, this is not currently supported and requires an extension of the model."; - oc-ext:openconfig-version "0.7.0"; + oc-ext:openconfig-version "0.8.0"; + + revision "2024-04-03" { + description + "Add vni-peer-groups container"; + reference "0.8.0"; + } revision "2024-02-01" { description @@ -917,7 +923,50 @@ module openconfig-evpn { "Container for state parameters related to this VTEP peer"; uses evpn-endpoint-peer-state; uses evpn-endpoint-counters; - } + } + container vni-peer-groups { + config false; + description + "Container for associating ingress and egress VNIs to router MACs"; + list vni-peer-group { + key "cp-vni egress-vni"; + description + "List of VNI peer groups"; + leaf cp-vni { + type leafref { + path "../state/cp-vni"; + } + description + "A reference to the control-plane VNI for the VNI peer group"; + } + leaf egress-vni { + type leafref { + path "../state/egress-vni"; + } + description + "A reference to the egress VNI for the VNI peer group"; + } + + container state { + description "State container for the VNI peer group"; + config false; + + leaf cp-vni { + type oc-evpn-types:vni-id; + description + "The control-plane VNI discovered behind this peer VTEP"; + } + leaf egress-vni { + type oc-evpn-types:vni-id; + description "Egress VNI associated with the remote VTEP"; + } + leaf router-mac { + type oc-yang:mac-address; + description "MAC address of the remote VTEP"; + } + } + } + } } } @@ -988,6 +1037,7 @@ module openconfig-evpn { leaf-list control-plane-vnis { type oc-evpn-types:vni-id; + status deprecated; description "The control-plane VNIs are all of the VNIs that are discovered by the control-plane behind this peer VTEP"; @@ -995,6 +1045,7 @@ module openconfig-evpn { leaf router-mac { type oc-yang:mac-address; + status deprecated; description "MAC address of the remote VTEP"; } } From 28e102efd3986256ecfd820c4411e383b4b199b1 Mon Sep 17 00:00:00 2001 From: kcroussore <159063602+kcroussore@users.noreply.github.com> Date: Tue, 16 Apr 2024 10:46:09 -0700 Subject: [PATCH 152/201] Add OpenConfig Support for Configurable Media-Channel Compensation Range and ASE recovery offset #1067 (#1090) * Add config for attenuation-control-range and media-channel-injection-offset #1067 --- .../openconfig-wavelength-router.yang | 84 ++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/release/models/optical-transport/openconfig-wavelength-router.yang b/release/models/optical-transport/openconfig-wavelength-router.yang index eded5e217..2684521ee 100644 --- a/release/models/optical-transport/openconfig-wavelength-router.yang +++ b/release/models/optical-transport/openconfig-wavelength-router.yang @@ -41,7 +41,13 @@ module openconfig-wavelength-router { target spectrum power profile over the full spectrum instead of individual media channels."; - oc-ext:openconfig-version "1.1.0"; + oc-ext:openconfig-version "1.2.0"; + + revision "2024-04-08" { + description + "Add attenuation-control-range to media channel config"; + reference "1.2.0"; + } revision "2021-07-26" { description @@ -168,6 +174,29 @@ module openconfig-wavelength-router { within the order of minutes"; } + // identity statements + identity ATTENUATION_CONTROL_RANGE { + description + "The definition for different types of modes to specify + attenuation control range settings on a media channel"; + } + + identity CONTROL_RANGE_FULL { + base ATTENUATION_CONTROL_RANGE; + description + "Media channel power compensation range is not constrained, + and is limited by available WSS dynamic range. Operator does not + explicitly set the undershoot and overshoot compensation range"; + } + + identity CONTROL_RANGE_LIMITED { + base ATTENUATION_CONTROL_RANGE; + description + "Media channel undershoot and overshoot compensation ranges + are defined by max-undershoot-compensation and + max-overshoot-compensation"; + } + identity ASE_CONTROL_MODE { description "The definition for different types of ASE control modes @@ -554,6 +583,19 @@ module openconfig-wavelength-router { is configured"; } + leaf media-channel-injection-offset { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "Defines the optical power offset value relative to the + ASE injection threshold at which point ASE should be removed + and the media-channel should be injected. Requires + ase-injection-delta or ase-injection-threshold to be + configured"; + } + leaf attenuation-control-mode { type identityref { base ATTENUATION_CONTROL_MODE; @@ -563,6 +605,46 @@ module openconfig-wavelength-router { The control mode defines the behavior of how the attenuation across a media channel is set"; } + + leaf attenuation-control-range { + type identityref { + base ATTENUATION_CONTROL_RANGE; + } + description + "Sets the attenuation control range for the media channel. + The control range defines the amount of media channel + undershoot and overshoot compensation that will be applied + when performing power targeting to meet the defined output + port spectrum power profile"; + } + + leaf max-undershoot-compensation { + type decimal64 { + fraction-digits 2; + } + when "../attenuation-control-range = 'CONTROL_RANGE_LIMITED'"; + units dB; + description + "Defines the maximum allowable WSS attenuation adjustment + the system will use to compensate a channel with input power + lower than the defined target power at the input. This value + is measured relative to the baseline WSS attenuation + established for an individual media-channel"; + } + + leaf max-overshoot-compensation { + type decimal64 { + fraction-digits 2; + } + when "../attenuation-control-range = 'CONTROL_RANGE_LIMITED'"; + units dB; + description + "Defines the maximum allowable WSS attenuation adjustment + the system will use to compensate a channel with input power + higher than the defined target power at the input. This + value is measured relative to the baseline WSS attenuation + established for an individual media-channel"; + } } grouping media-channel-state { From b493367ef30d11978237cea51ec81da87204558c Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Wed, 17 Apr 2024 09:30:47 -0700 Subject: [PATCH 153/201] replace backtick with apostrophe (#1089) --- .../models/interfaces/openconfig-interfaces.yang | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/release/models/interfaces/openconfig-interfaces.yang b/release/models/interfaces/openconfig-interfaces.yang index 3c94df5be..2cf2bdc84 100644 --- a/release/models/interfaces/openconfig-interfaces.yang +++ b/release/models/interfaces/openconfig-interfaces.yang @@ -51,7 +51,14 @@ module openconfig-interfaces { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "3.7.0"; + oc-ext:openconfig-version "3.7.1"; + + revision "2024-04-04" { + description + "Use single quotes in descriptions."; + reference + "3.7.1"; + } revision "2023-11-06" { description @@ -520,7 +527,7 @@ module openconfig-interfaces { units milliseconds; default 0; description - "Maximum time an interface can remain damped since the last link down event no matter how unstable it has been prior to this period of stability. In a damped state, the interface’s state change will not be advertised."; + "Maximum time an interface can remain damped since the last link down event no matter how unstable it has been prior to this period of stability. In a damped state, the interface's state change will not be advertised."; } leaf decay-half-life { @@ -528,7 +535,7 @@ module openconfig-interfaces { units milliseconds; default 0; description - "The amount of time after which an interface’s penalty is decreased by half. Decay-half-time should not be more than max-suppress-time."; + "The amount of time after which an interface's penalty is decreased by half. Decay-half-time should not be more than max-suppress-time."; } leaf suppress-threshold { @@ -1326,4 +1333,4 @@ module openconfig-interfaces { uses interfaces-top; -} \ No newline at end of file +} From 7e546dec00d95ba76ffb7b24d728b230ce8dc7ec Mon Sep 17 00:00:00 2001 From: Shashank-arista <153792517+Shashank-arista@users.noreply.github.com> Date: Wed, 17 Apr 2024 22:27:44 +0530 Subject: [PATCH 154/201] Augmented attributes interface-ref and metric fields to mpls-static lsp (#1021) * Add interface-ref and metric fields to mpls-static lsp --- release/models/mpls/openconfig-mpls-igp.yang | 9 ++++++++- .../models/mpls/openconfig-mpls-static.yang | 19 ++++++++++++++++++- release/models/mpls/openconfig-mpls-te.yang | 9 ++++++++- .../models/mpls/openconfig-mpls-types.yang | 9 ++++++++- release/models/mpls/openconfig-mpls.yang | 9 ++++++++- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/release/models/mpls/openconfig-mpls-igp.yang b/release/models/mpls/openconfig-mpls-igp.yang index e71c26657..6bbbf1cd8 100644 --- a/release/models/mpls/openconfig-mpls-igp.yang +++ b/release/models/mpls/openconfig-mpls-igp.yang @@ -21,7 +21,14 @@ submodule openconfig-mpls-igp { "Configuration generic configuration parameters for IGP-congruent LSPs"; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; + + revision "2023-12-14" { + description + "Added additional attributes oc-if:interface-ref + and metric attributes to static lsp"; + reference "3.5.0"; + } revision "2023-07-25" { description diff --git a/release/models/mpls/openconfig-mpls-static.yang b/release/models/mpls/openconfig-mpls-static.yang index 0a60e9628..d114fe16c 100644 --- a/release/models/mpls/openconfig-mpls-static.yang +++ b/release/models/mpls/openconfig-mpls-static.yang @@ -10,6 +10,7 @@ submodule openconfig-mpls-static { import openconfig-mpls-types {prefix oc-mplst; } import openconfig-inet-types { prefix inet; } import openconfig-extensions { prefix oc-ext; } + import openconfig-interfaces { prefix oc-if; } // meta @@ -23,7 +24,14 @@ submodule openconfig-mpls-static { "Defines static LSP configuration"; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; + + revision "2023-12-14" { + description + "Added additional attributes oc-if:interface-ref + and metric attributes to static lsp"; + reference "3.5.0"; + } revision "2023-07-25" { description @@ -170,6 +178,15 @@ submodule openconfig-mpls-static { "label value to push at the current hop for the LSP"; } + + // interface-ref + uses oc-if:interface-ref-common; + + leaf metric { + type uint8; + description + "Specifies metric value used for the MPLS route"; + } } grouping static-lsp-ingress-config { diff --git a/release/models/mpls/openconfig-mpls-te.yang b/release/models/mpls/openconfig-mpls-te.yang index 2fe988e1a..4b12dc66e 100644 --- a/release/models/mpls/openconfig-mpls-te.yang +++ b/release/models/mpls/openconfig-mpls-te.yang @@ -30,7 +30,14 @@ submodule openconfig-mpls-te { signaling protocol or mechanism (see related submodules for signaling protocol-specific configuration)."; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; + + revision "2023-12-14" { + description + "Added additional attributes oc-if:interface-ref + and metric attributes to static lsp"; + reference "3.5.0"; + } revision "2023-07-25" { description diff --git a/release/models/mpls/openconfig-mpls-types.yang b/release/models/mpls/openconfig-mpls-types.yang index 1df30b3b9..765e467cf 100644 --- a/release/models/mpls/openconfig-mpls-types.yang +++ b/release/models/mpls/openconfig-mpls-types.yang @@ -19,7 +19,14 @@ module openconfig-mpls-types { description "General types for MPLS / TE data model"; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; + + revision "2023-12-14" { + description + "Added additional attributes oc-if:interface-ref + and metric attributes to static lsp"; + reference "3.5.0"; + } revision "2021-12-01" { description diff --git a/release/models/mpls/openconfig-mpls.yang b/release/models/mpls/openconfig-mpls.yang index dde71fba3..f78e1a0ec 100644 --- a/release/models/mpls/openconfig-mpls.yang +++ b/release/models/mpls/openconfig-mpls.yang @@ -70,7 +70,14 @@ module openconfig-mpls { +------+ |ROUTING| +-----+ +-------+ "; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; + + revision "2023-12-14" { + description + "Added additional attributes oc-if:interface-ref + and metric attributes to static lsp"; + reference "3.5.0"; + } revision "2023-07-25" { description From bf857b7f09425b8e1b88e64745315d9b5e816b46 Mon Sep 17 00:00:00 2001 From: Jake Snyder Date: Thu, 25 Apr 2024 09:26:03 -0600 Subject: [PATCH 155/201] jakesnyder-1097 adding INACTIVE to client_state #1098 (#1099) * jakesnyder-1097 adding INACTIVE to client_state * jakesnyder-1097 adding INACTIVE to client_state * jakesnyder-1097 adding INACTIVE to client_state --- release/models/wifi/openconfig-wifi-types.yang | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/release/models/wifi/openconfig-wifi-types.yang b/release/models/wifi/openconfig-wifi-types.yang index 30e358ae3..225cc2a76 100644 --- a/release/models/wifi/openconfig-wifi-types.yang +++ b/release/models/wifi/openconfig-wifi-types.yang @@ -22,7 +22,13 @@ module openconfig-wifi-types { that are used in the openconfig-wifi modules. It can be imported by any module to make use of these types."; - oc-ext:openconfig-version "1.1.2"; + oc-ext:openconfig-version "1.1.3"; + + revision "2024-04-25" { + description + "Adding INACTIVE client_state"; + reference "1.1.3"; + } revision "2023-09-01" { description @@ -154,6 +160,13 @@ module openconfig-wifi-types { (signature) mechanisms."; } + identity INACTIVE { + base CLIENT_STATE; + description + "Client is no longer active in the 802.11 state machine. Client data + remains in the client state, but client is no longer active on AP."; + } + identity AP_STATE { description "The Up/Down state of an AP."; } From e519064497caace8e7b92a519d7be802423fb6c5 Mon Sep 17 00:00:00 2001 From: romeyod <78448014+romeyod@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:09:11 -0400 Subject: [PATCH 156/201] Add `gre` container under next-hops aft entry state. Add `src-ip`, `dst-ip` and `ttl` under `gre` aft entry state for telemetry. (#1038) * Add gre container under next-hops aft entry state. Add src-ip, dst-ip and ttl under gre aft entry state for telemetry. --------- Co-authored-by: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Co-authored-by: Darren Loher --- release/models/aft/openconfig-aft-common.yang | 57 ++++++++++++++++++- .../models/aft/openconfig-aft-ethernet.yang | 10 +++- release/models/aft/openconfig-aft-ipv4.yang | 10 +++- release/models/aft/openconfig-aft-ipv6.yang | 10 +++- release/models/aft/openconfig-aft-mpls.yang | 10 +++- release/models/aft/openconfig-aft-pf.yang | 10 +++- .../aft/openconfig-aft-state-synced.yang | 10 +++- release/models/aft/openconfig-aft.yang | 10 +++- 8 files changed, 118 insertions(+), 9 deletions(-) diff --git a/release/models/aft/openconfig-aft-common.yang b/release/models/aft/openconfig-aft-common.yang index 51e527edd..ac924b67c 100644 --- a/release/models/aft/openconfig-aft-common.yang +++ b/release/models/aft/openconfig-aft-common.yang @@ -23,7 +23,16 @@ submodule openconfig-aft-common { "Submodule containing definitions of groupings that are re-used across multiple contexts within the AFT model."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry. Updated description for + tunnel-src-ip-address properties under next-hops."; + reference "2.5.0"; + } revision "2023-09-26" { description @@ -213,6 +222,22 @@ submodule openconfig-aft-common { } } + container gre { + description + "When specified, the packet has an GRE + (Generic Routing Encapsulation)header applied to + it before forwarding to the specified next-hop. + encapsulate-header leaf should be set to GRE for this + to apply"; + + container state { + config false; + description + "State parameters relating to GRE encapsulation."; + uses aft-common-entry-nexthop-gre-state; + } + } + uses oc-if:interface-ref-state; } } @@ -269,7 +294,7 @@ submodule openconfig-aft-common { leaf tunnel-src-ip-address { type oc-inet:ip-address; description - "Where applicable this represents the tunnel source ip address. + "Where applicable this represents the vxlan tunnel source ip address. For VXLAN this represents the source VTEP ip address"; } } @@ -385,6 +410,34 @@ submodule openconfig-aft-common { } } + grouping aft-common-entry-nexthop-gre-state { + description + "GRE encapsulation applied on a IPv4 and IPv6 next-hop."; + + leaf src-ip { + type oc-inet:ip-address; + description + "The source IP address for the GRE encapsulation may be expressed + using this leaf (src-ip) or if may be derived from + '../../interface-ref/state/subinterface'"; + } + + leaf dst-ip { + type oc-inet:ip-address; + description + "Destination IP address to use for the encapsulated packet."; + } + + leaf ttl { + type uint8; + description + "This leaf reflects the configured/default TTL value that is used in the + outer header during packet encapsulation. When this leaf is not set, + the TTL value of the inner packet is copied over as the outer packet's + TTL value during encapsulation."; + } + } + grouping aft-common-install-protocol { description "Grouping for a common reference to the protocol which diff --git a/release/models/aft/openconfig-aft-ethernet.yang b/release/models/aft/openconfig-aft-ethernet.yang index 196447d97..2845c9383 100644 --- a/release/models/aft/openconfig-aft-ethernet.yang +++ b/release/models/aft/openconfig-aft-ethernet.yang @@ -20,7 +20,15 @@ submodule openconfig-aft-ethernet { "Submodule containing definitions of groupings for the abstract forwarding tables for Ethernet."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry."; + reference "2.5.0"; + } revision "2023-09-26" { description diff --git a/release/models/aft/openconfig-aft-ipv4.yang b/release/models/aft/openconfig-aft-ipv4.yang index c887857cc..f6152aca8 100644 --- a/release/models/aft/openconfig-aft-ipv4.yang +++ b/release/models/aft/openconfig-aft-ipv4.yang @@ -20,7 +20,15 @@ submodule openconfig-aft-ipv4 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv4."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry."; + reference "2.5.0"; + } revision "2023-09-26" { description diff --git a/release/models/aft/openconfig-aft-ipv6.yang b/release/models/aft/openconfig-aft-ipv6.yang index 85ac46a97..1976a7271 100644 --- a/release/models/aft/openconfig-aft-ipv6.yang +++ b/release/models/aft/openconfig-aft-ipv6.yang @@ -20,7 +20,15 @@ submodule openconfig-aft-ipv6 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv6."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry."; + reference "2.5.0"; + } revision "2023-09-26" { description diff --git a/release/models/aft/openconfig-aft-mpls.yang b/release/models/aft/openconfig-aft-mpls.yang index 6f07233e2..77091afa4 100644 --- a/release/models/aft/openconfig-aft-mpls.yang +++ b/release/models/aft/openconfig-aft-mpls.yang @@ -21,7 +21,15 @@ submodule openconfig-aft-mpls { "Submodule containing definitions of groupings for the abstract forwarding table for MPLS label forwarding."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry."; + reference "2.5.0"; + } revision "2023-09-26" { description diff --git a/release/models/aft/openconfig-aft-pf.yang b/release/models/aft/openconfig-aft-pf.yang index 125b3d9a2..fc72ece6e 100644 --- a/release/models/aft/openconfig-aft-pf.yang +++ b/release/models/aft/openconfig-aft-pf.yang @@ -28,7 +28,15 @@ submodule openconfig-aft-pf { fields other than the destination address that is used in other forwarding tables."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry."; + reference "2.5.0"; + } revision "2023-09-26" { description diff --git a/release/models/aft/openconfig-aft-state-synced.yang b/release/models/aft/openconfig-aft-state-synced.yang index 76f35975d..166ad7ead 100644 --- a/release/models/aft/openconfig-aft-state-synced.yang +++ b/release/models/aft/openconfig-aft-state-synced.yang @@ -16,7 +16,15 @@ submodule openconfig-aft-state-synced { "Submodule containing definitions of groupings for the state synced signals corresponding to various abstract forwarding tables."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry."; + reference "2.5.0"; + } revision "2023-09-26" { description diff --git a/release/models/aft/openconfig-aft.yang b/release/models/aft/openconfig-aft.yang index 4af67e426..011956948 100644 --- a/release/models/aft/openconfig-aft.yang +++ b/release/models/aft/openconfig-aft.yang @@ -42,7 +42,15 @@ module openconfig-aft { is referred to as an Abstract Forwarding Table (AFT), rather than the FIB."; - oc-ext:openconfig-version "2.4.0"; + oc-ext:openconfig-version "2.5.0"; + + revision "2024-01-26" { + description + "Add gre container under next-hops aft entry state. + Add src-ip, dst-ip and ttl under gre aft entry state + for telemetry."; + reference "2.5.0"; + } revision "2023-09-26" { description From 130ef96dacaa319dc32ee581c971b5f249fa5166 Mon Sep 17 00:00:00 2001 From: hyun-arista <152904206+hyun-arista@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:28:02 -0500 Subject: [PATCH 157/201] Adding configuration and operation state for interface rates (#1012) --- release/models/interfaces/.spec.yml | 2 + .../interfaces/openconfig-if-rates.yang | 114 ++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 release/models/interfaces/openconfig-if-rates.yang diff --git a/release/models/interfaces/.spec.yml b/release/models/interfaces/.spec.yml index 9535719e6..2e66f339e 100644 --- a/release/models/interfaces/.spec.yml +++ b/release/models/interfaces/.spec.yml @@ -8,6 +8,7 @@ - yang/interfaces/openconfig-if-poe.yang - yang/interfaces/openconfig-if-ip-ext.yang - yang/interfaces/openconfig-if-8021x.yang + - yang/interfaces/openconfig-if-rates.yang - yang/vlan/openconfig-vlan.yang - yang/interfaces/openconfig-if-tunnel.yang - yang/platform/openconfig-platform-port.yang @@ -26,6 +27,7 @@ - yang/interfaces/openconfig-if-poe.yang - yang/interfaces/openconfig-if-ip-ext.yang - yang/interfaces/openconfig-if-8021x.yang + - yang/interfaces/openconfig-if-rates.yang - yang/vlan/openconfig-vlan.yang - yang/interfaces/openconfig-if-tunnel.yang - yang/platform/openconfig-platform-port.yang diff --git a/release/models/interfaces/openconfig-if-rates.yang b/release/models/interfaces/openconfig-if-rates.yang new file mode 100644 index 000000000..78d972e14 --- /dev/null +++ b/release/models/interfaces/openconfig-if-rates.yang @@ -0,0 +1,114 @@ +module openconfig-if-rates { + + yang-version "1"; + + namespace "http://openconfig.net/yang/interfaces/rates"; + + prefix "oc-if-rates"; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-interfaces { prefix "oc-if"; } + + organization + "OpenConfig working group"; + + contact + "www.openconfig.net"; + + description + "This module adds configuration and operational state for interface rates."; + + oc-ext:openconfig-version "0.1.0"; + + revision 2024-04-02 { + description + "Augment of /interfaces/interface to include interface rates."; + reference + "0.1.0"; + } + + grouping interface-rates-config { + description + "Grouping of interface rates related configuration"; + + leaf load-interval { + type uint16 { + range "1..600"; + } + units "seconds"; + default 300; + description + "The interval of interface rates calculation in seconds"; + } + } + + grouping interface-rates-state { + description + "Grouping of interface rates with different direction and units"; + + leaf load-interval { + type uint16; + units "seconds"; + description + "The interval of interface rates calculation in seconds"; + } + + leaf out-bits-rate { + type uint64; + units "bps"; + description + "The calculated transmitted rate of the interface, measured in bits + per second."; + } + + leaf in-bits-rate { + type uint64; + units "bps"; + description + "The calculated received rate of the interface, measured in bits + per second."; + } + + leaf out-pkts-rate { + type uint64; + units "pps"; + description + "The calculated transmitted rate of the interface, measured in packets + per second."; + } + + leaf in-pkts-rate { + type uint64; + units "pps"; + description + "The calculated received rate of the interface, measured in packets + per second."; + } + } + + augment "/oc-if:interfaces/oc-if:interface" { + description + "Adds interface rates."; + + container rates { + description + "Enclosing container for interface rates."; + + container config { + description + "Enclosing container for interface rates related configuration"; + + uses interface-rates-config; + } + + container state { + config false; + description + "Enclosing container for operational state representing + interface rates."; + + uses interface-rates-state; + } + } + } +} From cd61659ae8f8c34fc1d94a9dab0d0785ad5babe4 Mon Sep 17 00:00:00 2001 From: sachendras <44847441+sachendras@users.noreply.github.com> Date: Tue, 30 Apr 2024 09:31:36 -0700 Subject: [PATCH 158/201] Add rules for controller-card power-off (#1041) * Update openconfig-platform.yang Add rules for controller-card power-off. Internal doc go/controller_card_gnmi_shutdown for more context. --------- Co-authored-by: Darren Loher --- doc/controller-card_poweroff.md | 165 ++++++++++++++++++ doc/img/controller_card.png | Bin 0 -> 152474 bytes .../platform/openconfig-platform-common.yang | 14 +- .../openconfig-platform-controller-card.yang | 18 +- .../platform/openconfig-platform-types.yang | 56 +++++- .../models/platform/openconfig-platform.yang | 38 +++- 6 files changed, 280 insertions(+), 11 deletions(-) create mode 100644 doc/controller-card_poweroff.md create mode 100644 doc/img/controller_card.png diff --git a/doc/controller-card_poweroff.md b/doc/controller-card_poweroff.md new file mode 100644 index 000000000..db2ecf762 --- /dev/null +++ b/doc/controller-card_poweroff.md @@ -0,0 +1,165 @@ + + +## Controller Card Power Control + +This document describes operational use cases, rules and telemetry for power control of `CONTROLLER-CARD` components in network devices using OpenConfig. + + +## Operational use cases for CONTROLLER_CARD power control + +1. Operator suspects a network device issue is occurring due to faults on a CONTROLLER_CARD. The operator wants to quickly disable the CONTROLLER_CARD and later, troubleshoot the issue in a maintenance window. The operator also wants to ensure that the card stays disabled even if the device is rebooted. Some example scenarios below: + + a. It is possible that the faulty controller card is in a boot loop and the operator finds it best to disable the card to prevent undesired state. Expectations are also that the power remains disabled even after a system reboot. + + b. CPU overheating, memory errors or other hardware problems with the PRIMARY card may require the operator to proactively power-off the card and not let it be online during regular operation until replacement of the hardware is completed. + +2. Operator feels it important to keep the card shutdown to prevent unexpected outcomes post the physical swap of the faulty/alerting card so the operator can online the card in a controlled environment post replacement. + + +## CONTROLLER_CARD power and redundancy requirements + +Electrical power for a CONTROLLER_CARD can be configured off using the OC-Path [/components/component/controller-card/config/power-admin-state](https://openconfig.net/projects/models/schemadocs/yangdoc/openconfig-platform.html#components-component-controller-card-config-power-admin-state) and setting its value to POWER\_DISABLED. The following rules regarding CONTROLLER_CARD redundancy and changes to `power-admin-state` must be followed by the device: + + + +1. Only a CONTROLLER_CARD in `state/redundant-role` 'SECONDARY' will honor a change in `config/power-admin-state` to POWER_DISABLED. If the controller-card's `redundant-role` is 'PRIMARY', and its `config/power-admin-state` is set to 'POWER_DISABLED', the NOS must allow the configuration. However, the `state/power-admin-state` must remain as 'POWER_ENABLED'. A change in `state/power-admin-state` must take effect only on the next reboot or if the CONTROLLER_CARD is 'SECONDARY'. Examples of scenarios include: + +### Scenario 1 - Power off a secondary CONTROLLER_CARD + +Let's say controller-card0 is PRIMARY and controller-card1 is SECONDARY and controller-card1 receives an operator driven change of config/power-admin-state = POWER_DISABLED, then controller-card0 will power-off controller-card1 immediately. The leaf state/power-admin-state for controller-card1 must also be POWER_DISABLED. The 'state/last-poweroff-reason/trigger' should show as USER_INITIATED. The NOS may optionally update state/last-poweroff-reason/details. state/last-poweroff-time should record the time when the card was powered-off. For example: + +``` +/components/component[name=controller0]/state/redundant-role, PRIMARY +/components/component[name=controller0]/controller-card/config/power-admin-state, POWER_ENABLED +/components/component[name=controller0]/controller-card/state/power-admin-state, POWER_ENABLED +/components/component[name=controller1]/state/redundant-role, SECONDARY +/components/component[name=controller1]/controller-card/config/power-admin-state, POWER_DISABLED +/components/component[name=controller1]/controller-card/state/power-admin-state, POWER_DISABLED +/components/component[name=controller1]/state/last-poweroff-reason/trigger, USER_INITIATED +/components/component[name=controller1]/state/last-poweroff-reason/details, "User initiated Shutdown" +/components/component[name=controller1]/state/last-poweroff-time, 1706590714681765937 +``` + +### Scenario 2 - Power off primary CONTROLLER_CARD + +1. If controller-card0 is PRIMARY and controller-card1 is SECONDARY and if controller-card0 is set to config/power-admin-state = POWER_DISABLED by an operator, then controller-card0 will stay powered-on until the next reboot. `state/power-admin-state` must show as POWER_ENABLED. If a reboot of the PRIMARY CONTROLLER_CARD occurs, `state/last-poweroff-time` must record the time when the card powers-off, `state/last-poweroff-reason/trigger` must show as USER_INITIATED and `/state/last-poweroff-reason/details` may be updated. For example: + +When controller-card0 is PRIMARY: + +``` +/components/component[name=controller0]/state/redundant-role, PRIMARY +/components/component[name=controller0]/controller-card/config/power-admin-state, POWER_DISABLED +/components/component[name=controller0]/controller-card/state/power-admin-state, POWER_ENABLED +/components/component[name=controller1]/state/redundant-role, SECONDARY +/components/component[name=controller1]/controller-card/state/power-admin-state, POWER_ENABLED +``` + +After controller-card0 transitions to redundant-role SECONDARY: + +``` +/components/component[name=controller0]/state/redundant-role, SECONDARY +/components/component[name=controller0]/controller-card/config/power-admin-state, POWER_DISABLED +/components/component[name=controller0]/controller-card/state/power-admin-state, POWER_DISABLED +/components/component[name=controller0]/state/last-poweroff-reason/trigger, USER_INITIATED +/components/component[name=controller0]/state/last-poweroff-reason/details, "User initiated Shutdown" +/components/component[name=controller0]/state/last-poweroff-time, 1706590714681765937 +/components/component[name=controller1]/state/redundant-role, PRIMARY +/components/component[name=controller1]/controller-card/config/power-admin-state, POWER_ENABLED +/components/component[name=controller1]/controller-card/state/power-admin-state, POWER_ENABLED +``` + +2. A controller-card which is in state/redundant-role=SECONDARY and is config/power-admin-state=POWER_DISABLED must remain powered off, even after a reboot. It is possible that after a reboot, both the controller cards are powered-on. However as soon as the configuration is loaded, the system must power-off the subject controller-card. + +3. A CONTROLLER_CARD in redundant-role SECONDARY and state/power-admin-state = POWER_DISABLED cannot transition to redundant-role PRIMARY. If the PRIMARY CONTROLLER_CARD goes down, the device will be offline. + +4. When a controller card boots up and loads it’s configuration, power-admin-state may be set to POWER_DISABLED. The CONTROLLER_CARD must then power off and never enter into any controller card primary/secondary election process. This also means that an implementation shouldn't start a controller card election process until the configuration is loaded and consumed. + + **Note:-** If an implementation's architecture do not allow for controlling the order in which the configuration is loaded and the PRIMARY/SECONDARY election process, then this rule can be relaxed as long as the implementation has proper arrangements to power-off the controller-card with `config/power-admin-state=POWER_DISABLED` configuration during reboots (Warm/Cold). + + +5. On boot (cold or warm), if the chassis has a single controller card and it is configured for config/power-admin-state=POWER_DISABLED, it must continue with the boot process ignoring the configuration. As per Rule#1 above, the controller-card must have it's state/power-admin-state as POWER_ENABLED given that a single CONTROLLER_CARD will have it's state/redundant-role=PRIMARY. In this case too, the system must log a message using severity "Warning", to inform the Operator about the situation. + +6. In a Dual controller-card scenario, if a config is pushed for config/power-admin-state=POWER_DISABLED for either both controller-cards simultaneously or for one of the controller-cards while the other controller-card in the system is already configured for config/power-admin-state=POWER_DISABLED, then the implementation Must fail the configuration commit operation with an error similar to: "Not allowed to have both controller-cards configured for power-admin-state = POWER_DISABLED" + +## Flowchart on the Rules above: + +![Overview of the expected behavior](https://github.com/openconfig/public/tree/master/doc/img/controller_card.png?raw=true) + +## Concerns and possible failure scenarios + +1. If a PRIMARY card malfunctions and ends up in a bootloop, would this approach help? + + **Response:** + + + In this scenario the expectations are that the implementation takes steps to initiate a controller-card switchover operation. Therefore, the standby controller card takes over the PRIMARY role and the system stabilizes allowing for gRPC connections to be established. In this situation if the operator pushes a configuration to shutdown the SECONDARY card, the PRIMARY card must be able to power-off the SECONDARY controller-card. In this scenario, the implementation (depending on their architecture) may also initiate a shutdown of the faulty card from the new PRIMARY card. + +2. Since the operation relies on configuration, it is possible that the failure scenario may kick in before the configuration takes effect post a reboot. + + **Response:** + + + Response here is the same as "1" above. + + + +3. Both controller-cards are functional and the the secondary controller card is attempted to be powered off. + + **Response:** + + + The shutdown can be initiated by pushing the command [/components/component[controller-card#]/controller-card/config/power-admin-state = POWER\_DISABLED](https://openconfig.net/projects/models/schemadocs/yangdoc/openconfig-platform.html#components-component-controller-card-config-power-admin-state) to the box. As a result, the secondary controller card whose [/components/component/state/redundant-role](https://openconfig.net/projects/models/schemadocs/yangdoc/openconfig-platform.html#components-component-state-redundant-role) is SECONDARY will be shutdown and its [/components/component[name="my_secondary_controller-card"]/controller-card/state/power-admin-state](https://openconfig.net/projects/models/schemadocs/yangdoc/openconfig-platform.html#components-component-controller-card-state-power-admin-state) will change to "POWER\_DISABLED". If the configuration is saved and when the device reboots, the subject controller-card is expected to remain powered off. + +4. Both controller-cards are functional and the the primary controller card is attempted to be shutdown + + **Response:** + + + Follow Rule#1 above + +5. Only one controller-card is present and the card is attempted to be shutdown. + + **Response:** + + + Since the lone controller-card is PRIMARY, please follow Rule#1 above. After reboot, please follow Rule#5 + +6. Faulty card is shutdown and then replaced with a working card but device still has the config of `/components/component[controller-card#]/controller-card/config/power-admin-state = POWER_DISABLED` + + **Response:** + + + The new card must remain powered off. Power should only be enabled on the new card by a configuration change to set `/components/component[controller-card#]/controller-card/config/power-admin-state = POWER_ENABLED` + + +7. Both controller-cards present during the initial boot operation. However, the controller card that is configured as "POWER\_DISABLED" boots up sooner than the other card and takes over the ACTIVE role. + + **Response:** + + + Follow Rule#4 above. The only exception is when it is the only controller card in the chassis. In the latter case, Rule#5 above must be followed. + + +8. Say we have a situation whereby, A dual controller card device is functional, secondary is powered off by changing power-admin-state to POWER\_DISABLED. Later, the PRIMARY card is removed and the system goes offline. If the device is rebooted (for example via externally removing and reapplying power ), what should happen? + + **Response:** + + If during reboot the device continues to have a single controller-card, then Rule#5 above should be followed. + +9. According to Rule#5, a controller-card must ignore the configuration of `config/power-admin-state=POWER_DISABLED` and must continue with its boot process if it is the only controller-card in the chassis. This also means that, under split-brain situations when the communication between the controller-cards is broken, the option to use `config/power-admin-state=POWER_DISABLED` for one of the cards may not help post reboot? + + **Response** + + Lets walk through this situation to set the right context. We have a dual controller-card system which due to some reason (Hardware/Soaftware failure) got in to a split-brain scenaio. As per the question here, the operator decides to use `config/power-admin-state=POWER_DISABLED` command on one of the cards, somehow intiatiates a reboot process (Cold or Warm) and expects that the controller-card with `config/power-admin-state=POWER_DISABLED` stays disabled post reboot. There are several assumptions and nuances to this situation: + + a. One of the assumptions is that, the device is in a split-brain situation and would still allow connections for a configuration change. + + b. If somehow "9.a" above works, since both the controller-cards expect to be the master, none will power-down immediately as per Rule#1 above. Therefore the Chassis would need to be cold booted. + +Now after the system reboots following "9.b", if we consider that the original problem of broken communication between the controller-cards persists, the configration of `config/power-admin-state=POWER_DISABLED` on one of the controller-cards wouldn't help because of Rule#5 above. However, it is expected that the implementation has other hardware/software means to gracefully handle the split-brain situation. The proposal here to allow for power-disable of a controller-card using configuration has no impact whatsoever on the implementations ability to handle split-brain like conditions. + + ***Definition for Split-brain situation:*** + `In network routers/switches that use redundant controller-cards for high availability, a split-brain scenario occurs when the primary and secondary cards lose communication with each other, and both believe they should be the active controller. Probable causees for a Split-brain scenario can be configuration error or software bug preventing exchange of control messages between the cards breaking the communication` + + + diff --git a/doc/img/controller_card.png b/doc/img/controller_card.png new file mode 100644 index 0000000000000000000000000000000000000000..4599258dd4620ba343a00b2a33d042e24cea2bb4 GIT binary patch literal 152474 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 SjIIt7_|n4}{#&GD8}T1~_^#yu literal 0 HcmV?d00001 diff --git a/release/models/platform/openconfig-platform-common.yang b/release/models/platform/openconfig-platform-common.yang index afb533067..fd121c09d 100644 --- a/release/models/platform/openconfig-platform-common.yang +++ b/release/models/platform/openconfig-platform-common.yang @@ -20,7 +20,13 @@ submodule openconfig-platform-common { "This modules contains common groupings that are used in multiple components within the platform module."; - oc-ext:openconfig-version "0.24.0"; + oc-ext:openconfig-version "0.25.0"; + + revision "2024-01-30" { + description + "Updated description for component-power-type"; + reference "0.25.0"; + } revision "2023-11-28" { description @@ -232,7 +238,11 @@ submodule openconfig-platform-common { type oc-platform-types:component-power-type; default POWER_ENABLED; description - "Enable or disable power to the component"; + "When set to POWER_DISABLED, the component should be shut down by removing + electrical power. This is intended to be used to prevent the component + from becoming active even after a reboot of the system. A component + (if controller-card) may not honor power-admin-state depending on rules + defined in the description of the component config container."; } } diff --git a/release/models/platform/openconfig-platform-controller-card.yang b/release/models/platform/openconfig-platform-controller-card.yang index 1bea20fe3..4ed5156c7 100644 --- a/release/models/platform/openconfig-platform-controller-card.yang +++ b/release/models/platform/openconfig-platform-controller-card.yang @@ -22,7 +22,13 @@ module openconfig-platform-controller-card { "This module defines data related to CONTROLLER_CARD components in the openconfig-platform model"; - oc-ext:openconfig-version "0.1.0"; + oc-ext:openconfig-version "0.2.0"; + + revision "2024-04-10" { + description + "Added details on power-admin-state leaf"; + reference "0.2.0"; + } revision "2022-07-28" { description @@ -58,8 +64,14 @@ module openconfig-platform-controller-card { augment "/oc-platform:components/oc-platform:component/" + "oc-platform:controller-card/oc-platform:config" { description - "Adding controller card data to physical inventory. This subtree - is only valid when the type of the component is CONTROLLER_CARD."; + "Configuration data for controller card components. + A controller-card can be configured for persistent powered-off + mode using the config/power-admin-state leaf. The reference + path below defines rules for such a configuration."; + + reference + "Rules around power-off configuration in controller-cards: + https://github.com/openconfig/public/blob/master/doc/controller-card_poweroff.md"; uses controller-card-config; } diff --git a/release/models/platform/openconfig-platform-types.yang b/release/models/platform/openconfig-platform-types.yang index d28881f9e..05bc4c306 100644 --- a/release/models/platform/openconfig-platform-types.yang +++ b/release/models/platform/openconfig-platform-types.yang @@ -22,7 +22,13 @@ module openconfig-platform-types { "This module defines data types (e.g., YANG identities) to support the OpenConfig component inventory model."; - oc-ext:openconfig-version "1.6.0"; + oc-ext:openconfig-version "1.7.0"; + + revision "2024-01-30" { + description + "Add component-last-poweroff-reason grouping"; + reference "1.7.0"; + } revision "2023-06-27" { description @@ -218,6 +224,34 @@ module openconfig-platform-types { uses oc-types:min-max-time; } + grouping component-last-poweroff-reason { + description + "Common grouping for recording the reason of a component's + power-off state"; + + leaf trigger { + type component-last-poweroff-reason-trigger; + description + "Records the generic triggers for the last poweroff + event. Component power-off can be triggered + in various ways, + - USER_INITIATED + - SYSTEM_INITIATED + - POWER_FAILURE + This field is not updated during reboots; those are + tracked in the 'last-reboot-reason' leaf."; + } + + leaf details { + type string; + description + "Provides a detailed reason for component power-off. + For system-initiated power-offs, this field can include + specific causes (e.g., critical errors resulting in a + controller-card bootloop)."; + } + } + grouping component-redundant-role-switchover-reason { description "Common grouping for recording the reason of a component's @@ -538,4 +572,24 @@ module openconfig-platform-types { description "Records how the role switchover is triggered."; } + + typedef component-last-poweroff-reason-trigger { + type enumeration { + enum USER_INITIATED { + description + "User initiated the power-off, e.g. via command line."; + } + enum SYSTEM_INITIATED { + description + "The system initiated the power-off, e.g. due to + critical errors in the component of the primary role."; + } + enum POWER_FAILURE { + description + "The last power-off was due to power failure."; + } + } + description + "Records how the last power-off was triggered."; + } } diff --git a/release/models/platform/openconfig-platform.yang b/release/models/platform/openconfig-platform.yang index bbcf931a6..61b1426fd 100644 --- a/release/models/platform/openconfig-platform.yang +++ b/release/models/platform/openconfig-platform.yang @@ -65,7 +65,15 @@ module openconfig-platform { (presence or absence of a component) and state (physical attributes or status)."; - oc-ext:openconfig-version "0.24.0"; + oc-ext:openconfig-version "0.25.0"; + + revision "2024-01-30" { + description + "Add rules for controller-card power-off + Also introduces last-poweroff-reason container + and last-poweroff-time leaf"; + reference "0.25.0"; + } revision "2023-11-28" { description @@ -531,6 +539,27 @@ module openconfig-platform { this reports the role of the component."; } + container last-poweroff-reason { + description + "Records last power-off reason for a component."; + + uses oc-platform-types:component-last-poweroff-reason; + } + + leaf last-poweroff-time { + type oc-types:timeticks64; + units "nanoseconds"; + description + "This records the last time a component was directly powered + down. The value is a Unix Epoch timestamp (nanoseconds since + Jan 1, 1970 00:00:00 UTC). Component power-off can be: + - USER_INITIATED + - SYSTEM_INITIATED + - POWER_FAILURE + This field is not updated during reboots; those are tracked + in the 'last-reboot-time' leaf."; + } + container last-switchover-reason { description "For components that have redundant roles (e.g. two @@ -567,7 +596,8 @@ module openconfig-platform { description "This reports the time of the last reboot of the component. The value is the timestamp in nanoseconds relative to the Unix Epoch - (Jan 1, 1970 00:00:00 UTC)."; + (Jan 1, 1970 00:00:00 UTC). This timer is not updated during + power shutdowns; those are tracked in 'last-poweroff-time' leaf."; } leaf switchover-ready { @@ -1142,9 +1172,7 @@ module openconfig-platform { container config { description - "Configuration data for controller card components. Note that disabling - power to the primary supervisor should be rejected, and the operator is - required to perform a switchover first."; + "Configuration data for controller card components."; } container state { From a2c7a09e619c56782b3f4495a065fd7c34ef1175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20de=20Dios?= Date: Tue, 30 Apr 2024 11:06:48 -0700 Subject: [PATCH 159/201] Configure BFD min interval, multipleir when activated in protocols (#856) * Added the options to configure BFD in protocols Min-tx-interval, required-minimum-receive and multiplier added for the case when BFD is activated at a protocol --- release/models/bfd/openconfig-bfd.yang | 93 +++++++++++++++----------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/release/models/bfd/openconfig-bfd.yang b/release/models/bfd/openconfig-bfd.yang index 481021d33..8f5041b79 100644 --- a/release/models/bfd/openconfig-bfd.yang +++ b/release/models/bfd/openconfig-bfd.yang @@ -26,7 +26,14 @@ module openconfig-bfd { "An OpenConfig model of Bi-Directional Forwarding Detection (BFD) configuration and operational state."; - oc-ext:openconfig-version "0.2.6"; + oc-ext:openconfig-version "0.3.0"; + + revision "2024-03-05" { + description + "Add configuration of min interval, multiplier when + BFD is enabled at protocol level"; + reference "0.3.0"; + } revision "2023-08-09" { description @@ -220,43 +227,7 @@ module openconfig-bfd { interface."; } - leaf desired-minimum-tx-interval { - type uint32; - units microseconds; - description - "The minimum interval between transmission of BFD control - packets that the operator desires. This value is advertised to - the peer, however the actual interval used is specified by - taking the maximum of desired-minimum-tx-interval and the - value of the remote required-minimum-receive interval value. - - This value is specified as an integer number of microseconds."; - } - - leaf required-minimum-receive { - type uint32; - units microseconds; - description - "The minimum interval between received BFD control packets that - this system should support. This value is advertised to the - remote peer to indicate the maximum frequency (i.e., minimum - inter-packet interval) between BFD control packets that is - acceptable to the local system."; - } - - // rjs: Could have required-minimum-echo-receive here, but this is - // generally not configurable. - - leaf detection-multiplier { - type uint8 { - range "1..max"; - } - description - "The number of packets that must be missed to declare this - session as down. The detection interval for the BFD session - is calculated by multiplying the value of the negotiated - transmission interval by this value."; - } + uses bfd-configuration; leaf enable-per-member-link { type boolean; @@ -698,6 +669,49 @@ module openconfig-bfd { } } + grouping bfd-configuration { + description + "Configuration parameters of BFD when it is enabled in protocols."; + leaf desired-minimum-tx-interval { + type uint32; + units microseconds; + description + "The minimum interval between transmission of BFD control + packets that the operator desires. This value is advertised to + the peer, however the actual interval used is specified by + taking the maximum of desired-minimum-tx-interval and the + value of the remote required-minimum-receive interval value. + This value is specified as an integer number of microseconds. + The value 0 is reserved and cannot be used."; + reference "section 4.1 of RFC 5880"; + } + + leaf required-minimum-receive { + type uint32; + units microseconds; + description + "The minimum interval between received BFD control packets that + this system should support. This value is advertised to the + remote peer to indicate the maximum frequency (i.e., minimum + inter-packet interval) between BFD control packets that is + acceptable to the local system."; + reference "section 4.1 of RFC 5880"; + } + + leaf detection-multiplier { + type uint8 { + range "1..max"; + } + description + "The number of packets that must be missed to declare this + session as down. The detection interval for the BFD session + is calculated by multiplying the value of the negotiated + transmission interval by this value."; + reference "section 4.1 of RFC 5880"; + } + + } + grouping enable-bfd-state { description "Operational state parameters relating to enabling BFD."; @@ -741,6 +755,8 @@ module openconfig-bfd { "Configuration parameters relating to enabling BFD."; uses enable-bfd-config; + uses bfd-configuration; + } container state { @@ -749,6 +765,7 @@ module openconfig-bfd { "Operational state parameters relating to enabing BFD."; uses enable-bfd-config; + uses bfd-configuration; //uses enable-bfd-state; } } From b8391e3da1d8edf377ba797d24d6f973cca6935f Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 7 May 2024 10:58:52 -0700 Subject: [PATCH 160/201] Add worklow to close stale issue/pr (#1104) * add worklow to close stale issue/pr --- .github/workflows/stale.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/stale.yaml diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml new file mode 100644 index 000000000..3fdc49dda --- /dev/null +++ b/.github/workflows/stale.yaml @@ -0,0 +1,14 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '42 2 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + stale-issue-message: 'This issue is stale because it has been open 180 days with no activity. If you wish to keep this issue active, please remove the stale label or add a comment, otherwise will be closed in 14 days.' + days-before-stale: 180 + days-before-close: 14 From 4d4aa4b7dd94acfae84e3f567b534116e6bd5ca4 Mon Sep 17 00:00:00 2001 From: SydneyCaulfeild <47483016+SydneyCaulfeild@users.noreply.github.com> Date: Tue, 7 May 2024 11:26:58 -0700 Subject: [PATCH 161/201] Add FAN_TRAY component type. (#1094) * Add FAN_TRAY component type. --- .../platform/openconfig-platform-types.yang | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/release/models/platform/openconfig-platform-types.yang b/release/models/platform/openconfig-platform-types.yang index 05bc4c306..88b0ef521 100644 --- a/release/models/platform/openconfig-platform-types.yang +++ b/release/models/platform/openconfig-platform-types.yang @@ -22,7 +22,14 @@ module openconfig-platform-types { "This module defines data types (e.g., YANG identities) to support the OpenConfig component inventory model."; - oc-ext:openconfig-version "1.7.0"; + oc-ext:openconfig-version "1.8.0"; + + + revision "2024-04-30" { + description + "Add FAN_TRAY"; + reference "1.8.0"; + } revision "2024-01-30" { description @@ -326,6 +333,12 @@ module openconfig-platform-types { "Cooling fan, or could be some other heat-reduction component"; } + identity FAN_TRAY { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Contains multiple fans that work in unison to cool the router components."; + } + identity SENSOR { base OPENCONFIG_HARDWARE_COMPONENT; description From 541fbd64f9a399caed2878aed344c20a93dcbad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabr=C3=ADcio=20Abr=C3=A3o=20Costa?= Date: Wed, 15 May 2024 14:18:07 -0300 Subject: [PATCH 162/201] Fix yang namespace URI to openconfig.net (#1111) (#1112) --- .../openconfig-terminal-device-properties.yang | 10 ++++++++-- .../openconfig-terminal-device-property-types.yang | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/release/models/devices-manifest/openconfig-terminal-device-properties.yang b/release/models/devices-manifest/openconfig-terminal-device-properties.yang index 4e3202c85..85bf510a8 100644 --- a/release/models/devices-manifest/openconfig-terminal-device-properties.yang +++ b/release/models/devices-manifest/openconfig-terminal-device-properties.yang @@ -10,7 +10,7 @@ module openconfig-terminal-device-properties { yang-version "1"; // namespace - namespace "http://example.net/yang/openconfig-terminal-device-properties"; + namespace "http://openconfig.net/yang/openconfig-terminal-device-properties"; prefix "oc-opt-term-properties"; import openconfig-extensions { prefix oc-ext; } @@ -35,10 +35,16 @@ module openconfig-terminal-device-properties { the OTSi (OTSiMC). It also includes (optional) aspects such as filter characterization, CD and DGD tolerance."; - oc-ext:openconfig-version "0.1.1"; + oc-ext:openconfig-version "0.1.2"; // Revisions + revision "2024-05-15" { + description + "Fix yang namespace URI to openconfig.net."; + reference "0.1.2"; + } + revision "2023-12-13" { description "Add reference to the terminal-device-properties-guide.md doc for operational-modes."; diff --git a/release/models/devices-manifest/openconfig-terminal-device-property-types.yang b/release/models/devices-manifest/openconfig-terminal-device-property-types.yang index 13a019294..f389b602c 100644 --- a/release/models/devices-manifest/openconfig-terminal-device-property-types.yang +++ b/release/models/devices-manifest/openconfig-terminal-device-property-types.yang @@ -10,7 +10,7 @@ module openconfig-terminal-device-property-types { yang-version "1"; // namespace - namespace "http://example.net/yang/openconfig-terminal-device-property-types"; + namespace "http://openconfig.net/yang/openconfig-terminal-device-property-types"; prefix "oc-opt-term-prop-types"; import openconfig-extensions { prefix oc-ext; } @@ -29,10 +29,16 @@ module openconfig-terminal-device-property-types { definitions of the set of modulation format, FEC codes and adjustment granularity types use in the reffered model."; - oc-ext:openconfig-version "0.1.0"; + oc-ext:openconfig-version "0.1.1"; // Revisions + revision "2024-05-15" { + description + "Fix yang namespace URI to openconfig.net."; + reference "0.1.1"; + } + revision "2022-03-08" { description "Initial version to provide the initial set of identities used in the openconfig-terminal-device-properties model."; From e3ac23b19f2317a2a88a21e1bb6c838eef9f9da9 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 28 May 2024 18:37:14 -0700 Subject: [PATCH 163/201] Clarify /network-instances/network-instance/tables (#1116) * Clarify /network-instances/network-instance/tables are only created by the system, not users. --- .../openconfig-network-instance-l2.yang | 9 ++++++++- .../openconfig-network-instance.yang | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/release/models/network-instance/openconfig-network-instance-l2.yang b/release/models/network-instance/openconfig-network-instance-l2.yang index 76afb139f..fb8b515d3 100644 --- a/release/models/network-instance/openconfig-network-instance-l2.yang +++ b/release/models/network-instance/openconfig-network-instance-l2.yang @@ -24,7 +24,14 @@ submodule openconfig-network-instance-l2 { Layer 2 network instance configuration and operational state parameters."; - oc-ext:openconfig-version "4.4.0"; + oc-ext:openconfig-version "4.4.1"; + + revision "2024-02-27" { + description + "Clarify that tables are created only by the system and not + users."; + reference "4.4.1"; + } revision "2024-02-27" { description diff --git a/release/models/network-instance/openconfig-network-instance.yang b/release/models/network-instance/openconfig-network-instance.yang index f6d32cbc2..574caa1ab 100644 --- a/release/models/network-instance/openconfig-network-instance.yang +++ b/release/models/network-instance/openconfig-network-instance.yang @@ -48,7 +48,14 @@ module openconfig-network-instance { virtual switch instance (VSI). Mixed Layer 2 and Layer 3 instances are also supported."; - oc-ext:openconfig-version "4.4.0"; + oc-ext:openconfig-version "4.4.1"; + + revision "2024-02-27" { + description + "Clarify that tables are created only by the system and not + users."; + reference "4.4.1"; + } revision "2024-02-27" { description @@ -608,7 +615,8 @@ module openconfig-network-instance { container tables { description "The routing tables that are managed by this network - instance"; + instance. Tables are created and removed by the system. + Users do not create tables."; list table { key "protocol address-family"; @@ -633,7 +641,10 @@ module openconfig-network-instance { address families enabled, the protocol=BGP, address-family=IPv4 table is created by the system. The removal of the table should not require additional or - explicit configurations"; + explicit configurations. + + Users cannot create or delete tables. Instead a user may + configure table-connections which reference these tables."; leaf protocol { type leafref { From 9eeeb2019ac61d501feae5127eb31bc4db15a048 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Wed, 29 May 2024 11:49:37 -0700 Subject: [PATCH 164/201] Add component install-position, install-component and deprecate location (#1095) * (M) release/models/platform/openconfig-platform.yang * (M) release/models/platform/openconfig-platform-linecard.yang * (M) release/models/platform/openconfig-platform-common.yang Add install-component, install-position and deprecate slot-id --- .../platform/openconfig-platform-common.yang | 9 ++- .../openconfig-platform-linecard.yang | 16 ++++- .../models/platform/openconfig-platform.yang | 62 ++++++++++++++++++- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/release/models/platform/openconfig-platform-common.yang b/release/models/platform/openconfig-platform-common.yang index fd121c09d..299ed3a8c 100644 --- a/release/models/platform/openconfig-platform-common.yang +++ b/release/models/platform/openconfig-platform-common.yang @@ -20,7 +20,14 @@ submodule openconfig-platform-common { "This modules contains common groupings that are used in multiple components within the platform module."; - oc-ext:openconfig-version "0.25.0"; + oc-ext:openconfig-version "0.26.0"; + + revision "2024-04-12" { + description + "Add install-position, install-component and deprecate location and + slot-id."; + reference "0.26.0"; + } revision "2024-01-30" { description diff --git a/release/models/platform/openconfig-platform-linecard.yang b/release/models/platform/openconfig-platform-linecard.yang index 46c5d2ccd..d0429b640 100644 --- a/release/models/platform/openconfig-platform-linecard.yang +++ b/release/models/platform/openconfig-platform-linecard.yang @@ -22,7 +22,14 @@ module openconfig-platform-linecard { "This module defines data related to LINECARD components in the openconfig-platform model"; - oc-ext:openconfig-version "1.1.0"; +oc-ext:openconfig-version "1.2.0"; + + revision "2024-04-12" { + description + "Add install-position, install-component and deprecate location and + slot-id."; + reference "1.2.0"; + } revision "2023-02-13" { description @@ -89,10 +96,15 @@ module openconfig-platform-linecard { "Operational state data for linecard components"; leaf slot-id { + status deprecated; type string; description "Identifier for the slot or chassis position in which the - linecard is installed"; + linecard is installed. + + This leaf is deprecated and will be replaced by install-position + and install-component leaves in a future major revision of this + model."; } } diff --git a/release/models/platform/openconfig-platform.yang b/release/models/platform/openconfig-platform.yang index 61b1426fd..334522039 100644 --- a/release/models/platform/openconfig-platform.yang +++ b/release/models/platform/openconfig-platform.yang @@ -65,7 +65,14 @@ module openconfig-platform { (presence or absence of a component) and state (physical attributes or status)."; - oc-ext:openconfig-version "0.25.0"; +oc-ext:openconfig-version "0.26.0"; + + revision "2024-04-12" { + description + "Add install-position, install-component and deprecate location and + slot-id."; + reference "0.26.0"; + } revision "2024-01-30" { description @@ -411,12 +418,63 @@ module openconfig-platform { leaf location { type string; + status deprecated; description "System-supplied description of the location of the component within the system. This could be a bay position, slot number, socket location, etc. For component types that have an explicit slot-id attribute, such as linecards, the - system should populate the more specific slot-id."; + system should populate the more specific slot-id. + + This leaf is deprecated and replaced by install-position and + install-component."; + } + + leaf install-position { + type leafref { + path "../name"; + } + description + "System-supplied index to a position where this component is + installed. The position may be referred in device documenation + as a port, slot, bay, socket, etc. This string must only + indicate the name of the position, and not any indication of + the name of the parent component within the system. Instead, + parent component name should be present in the 'parent' leaf. + + Typically the install-position is a number, but it is observed + that some devices may use letters or alphanumerics. The + position name should be the same name used to physically + identify the position in documentation or printed on the + device. + + Any component which is removable is expected to have + an install-position and an install-component which points to + an ancestor component where the connection occurs. + + For component types that have an explicit slot-id attribute, + such as LINECARD, the system should populate slot-id, + install-position and install-component. This will facilitate a + transition to deprecate slot-id."; + } + + leaf install-component { + type leafref { + path "../name"; + } + description + "This leaf contains the name of the ancestor component which + contains the 'install-position'. This creates a distinct + mapping between a removable component and the target component + it is installed into. Note there may be zero or more + intermediate components between the removable component and + the install-component. + + For example, consider the component tree + PORT ['eth1/2']-> INTEGRATED_CIRCUIT ['npu1']-> LINECARD ['lc1']. + The PORT has an install-position of '2' and install-component named + 'lc1'. The intermediate INTEGRATED-CIRCUIT component is not + present in either install-position or install-component leaves."; } leaf description { From c50178f2d1df28ed88df43eb9d32209d946786a0 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Thu, 30 May 2024 15:19:56 -0700 Subject: [PATCH 165/201] fix install-position (#1117) Correct install-position to be a string, not a leaf-ref. --- .../models/platform/openconfig-platform-common.yang | 8 +++++++- release/models/platform/openconfig-platform.yang | 12 ++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/release/models/platform/openconfig-platform-common.yang b/release/models/platform/openconfig-platform-common.yang index 299ed3a8c..04f58b3ac 100644 --- a/release/models/platform/openconfig-platform-common.yang +++ b/release/models/platform/openconfig-platform-common.yang @@ -20,7 +20,13 @@ submodule openconfig-platform-common { "This modules contains common groupings that are used in multiple components within the platform module."; - oc-ext:openconfig-version "0.26.0"; + oc-ext:openconfig-version "0.27.0"; + + revision "2024-05-29" { + description + "Change install-position from leaf-ref to string."; + reference "0.27.0"; + } revision "2024-04-12" { description diff --git a/release/models/platform/openconfig-platform.yang b/release/models/platform/openconfig-platform.yang index 334522039..89ebb559b 100644 --- a/release/models/platform/openconfig-platform.yang +++ b/release/models/platform/openconfig-platform.yang @@ -65,7 +65,13 @@ module openconfig-platform { (presence or absence of a component) and state (physical attributes or status)."; -oc-ext:openconfig-version "0.26.0"; + oc-ext:openconfig-version "0.27.0"; + + revision "2024-05-29" { + description + "Change install-position from leaf-ref to string."; + reference "0.27.0"; + } revision "2024-04-12" { description @@ -431,9 +437,7 @@ oc-ext:openconfig-version "0.26.0"; } leaf install-position { - type leafref { - path "../name"; - } + type string; description "System-supplied index to a position where this component is installed. The position may be referred in device documenation From 3c810f3b1168e74de473d0d0592151cfbffd27b5 Mon Sep 17 00:00:00 2001 From: sallylsy <108024270+sallylsy@users.noreply.github.com> Date: Thu, 30 May 2024 16:09:52 -0700 Subject: [PATCH 166/201] Support gNPSI in OpenConfig (#1085) * (M) release/models/gnpsi/openconfig-gnpsi-types.yang * (M) release/models/grpc/openconfig-grpc-types.yang * (M) release/models/system/openconfig-system-grpc.yang * Add gRPC connections and statistics in OpenConfig * Add gNPSI as a gRPC service type --------- Co-authored-by: Darren Loher --- release/models/gnpsi/.spec.yml | 6 + .../models/gnpsi/openconfig-gnpsi-types.yang | 38 +++++++ release/models/grpc/.spec.yml | 6 + .../models/grpc/openconfig-grpc-types.yang | 36 ++++++ .../models/system/openconfig-system-grpc.yang | 103 +++++++++++++++++- 5 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 release/models/gnpsi/.spec.yml create mode 100644 release/models/gnpsi/openconfig-gnpsi-types.yang create mode 100644 release/models/grpc/.spec.yml create mode 100644 release/models/grpc/openconfig-grpc-types.yang diff --git a/release/models/gnpsi/.spec.yml b/release/models/gnpsi/.spec.yml new file mode 100644 index 000000000..a38191a7f --- /dev/null +++ b/release/models/gnpsi/.spec.yml @@ -0,0 +1,6 @@ +- name: openconfig-gnpsi + docs: + - yang/gnpsi/openconfig-gnpsi-types.yang + build: + - yang/gnpsi/openconfig-gnpsi-types.yang + run-ci: false diff --git a/release/models/gnpsi/openconfig-gnpsi-types.yang b/release/models/gnpsi/openconfig-gnpsi-types.yang new file mode 100644 index 000000000..ef241b635 --- /dev/null +++ b/release/models/gnpsi/openconfig-gnpsi-types.yang @@ -0,0 +1,38 @@ +module openconfig-gnpsi-types { + yang-version "1"; + namespace "http://openconfig.net/yang/gnpsi/types"; + prefix "oc-gnpsit"; + + import openconfig-extensions { + prefix oc-ext; + } + + import openconfig-grpc-types { + prefix oc-grpct; + } + + organization + "OpenConfig working group"; + contact + "www.openconfig.net"; + + description + "This module adds gRPC server type relating to gNPSI running on + a network device."; + + oc-ext:openconfig-version "0.1.0"; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + revision 2024-05-29 { + description + "Initial revision."; + reference "0.1.0"; + } + + identity GNPSI { + base oc-grpct:GRPC_SERVICE; + description + "gNMI: gRPC Network Management Interface"; + } +} diff --git a/release/models/grpc/.spec.yml b/release/models/grpc/.spec.yml new file mode 100644 index 000000000..5e9761d03 --- /dev/null +++ b/release/models/grpc/.spec.yml @@ -0,0 +1,6 @@ +- name: openconfig-grpc + docs: + - yang/grpc/openconfig-grpc-types.yang + build: + - yang/grpc/openconfig-grpc-types.yang + run-ci: false diff --git a/release/models/grpc/openconfig-grpc-types.yang b/release/models/grpc/openconfig-grpc-types.yang new file mode 100644 index 000000000..d9944070b --- /dev/null +++ b/release/models/grpc/openconfig-grpc-types.yang @@ -0,0 +1,36 @@ +module openconfig-grpc-types { + yang-version "1"; + namespace "http://openconfig.net/yang/grpc/types"; + prefix "oc-grpct"; + + import openconfig-extensions { + prefix oc-ext; + } + + organization + "OpenConfig working group"; + contact + "www.openconfig.net"; + + description + "This module adds gRPC server type relating to gRPC services running on + a network device. + The GRPC_SERVICE identity is used to create an extensible list of services + that can be instantiated, with a base set defined in this module. New + services can extend the identity to be included in the list."; + + oc-ext:openconfig-version "0.1.0"; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + revision "2024-05-29" { + description + "Initial revision."; + reference "0.1.0"; + } + + identity GRPC_SERVICE { + description + "Base identity for a gRPC-based service."; + } +} diff --git a/release/models/system/openconfig-system-grpc.yang b/release/models/system/openconfig-system-grpc.yang index fb16870a2..6560806c1 100644 --- a/release/models/system/openconfig-system-grpc.yang +++ b/release/models/system/openconfig-system-grpc.yang @@ -8,6 +8,7 @@ module openconfig-system-grpc { import openconfig-system { prefix oc-sys; } import openconfig-inet-types { prefix oc-inet; } import openconfig-network-instance { prefix oc-ni; } + import openconfig-yang-types { prefix oc-yang; } organization "OpenConfig working group"; @@ -22,10 +23,16 @@ module openconfig-system-grpc { to be included in the list."; - oc-ext:openconfig-version "1.0.0"; + oc-ext:openconfig-version "1.1.0"; oc-ext:catalog-organization "openconfig"; oc-ext:origin "openconfig"; + revision "2024-05-29" { + description + "Add support for gRPC connections."; + reference "1.1.0"; + } + revision "2022-04-19" { description "Description and default value updates for grpc-server @@ -97,6 +104,7 @@ module openconfig-system-grpc { "Operational state relating to the gRPC service."; uses grpc-server-config; } + uses connections-top; } } } @@ -200,6 +208,99 @@ module openconfig-system-grpc { } } + grouping grpc-counters { + description + "Top-level container for gRPC counters."; + container counters { + description + "Operational data for gRPC counters."; + uses grpc-counters-top; + } + } + + grouping grpc-counters-top { + description + "Top-level container of operational data for gRPC counters."; + + leaf bytes-sent { + type oc-yang:counter64; + description + "The total number of bytes sent to the client."; + } + + leaf packets-sent { + type oc-yang:counter64; + description + "The total number of packets sent to the client."; + } + + leaf data-send-error { + type oc-yang:counter64; + description + "A count of errors the gRPC server encountered when + sending data to a grpc client."; + } + } + + grouping grpc-server-connections-state { + description + "Operational data for gRPC server connections."; + + leaf address { + type oc-inet:ip-address; + description + "IPv4/IPv6 address of the gRPC server connection."; + } + + leaf port { + type oc-inet:port-number; + description + "TCP/UDP port number for the gRPC server connection."; + } + } + + grouping connections-top { + description + "Top-level grouping for data related to gRPC connections."; + + container connections { + config false; + description + "Enclosing container for list of gRPC connections."; + + list connection { + key "address port"; + description + "List of gRPC connections"; + + leaf address { + type leafref { + path "../state/address"; + } + description + "Reference to address list key."; + } + + leaf port { + type leafref { + path "../state/port"; + } + description + "Reference to port list key."; + } + + container state { + config false; + description + "Operational state data for gRPC connections."; + + uses grpc-server-connections-state; + uses grpc-counters; + } + } + } + } + augment "/oc-sys:system" { description "Add gRPC service configuration to the openconfig-system model."; From c00868ed96e8e48993e26d8fba20f093722c0e39 Mon Sep 17 00:00:00 2001 From: Eric Breverman Date: Tue, 4 Jun 2024 09:18:59 -0700 Subject: [PATCH 167/201] Correct description of QSFP56_DD to be generic. (#1110) * Update QSFP56_DD description to be generic to future data rates as intended. --- .../openconfig-transport-types.yang | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index dc5699842..a6dcfab7a 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,13 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.24.0"; + oc-ext:openconfig-version "0.24.1"; + + revision "2024-05-13" { + description + "Fix the QSFP56_DD description as it is meant to be generic."; + reference "0.24.1"; + } revision "2024-03-20" { description @@ -915,9 +921,8 @@ module openconfig-transport-types { identity QSFP56_DD { base TRANSCEIVER_FORM_FACTOR_TYPE; description - "QSFP-DD electrical interfaces will employ 8 lanes that operate up to - 25 Gbps NRZ modulation or 50 Gbps PAM4 modulation, providing - solutions up to 200 Gbps or 400 Gbps aggregate"; + "QSFP-DD quad small form factor pluggable double density + optic providing an 8 lane electrical interface"; reference "http://qsfp-dd.com"; } From 0c7f5d0049a916c363bfac5d9effcdd5250dc8d2 Mon Sep 17 00:00:00 2001 From: Brandon Stoll Date: Wed, 3 Jul 2024 17:26:06 -0700 Subject: [PATCH 168/201] Add 25G SR/LR PMDs to openconfig-transport-types. (#1144) * Add 25G SR/LR PMDs to openconfig-transport-types. --- .../openconfig-transport-types.yang | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index a6dcfab7a..b38fb1c2c 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,13 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.24.1"; + oc-ext:openconfig-version "0.25.0"; + + revision "2024-06-28" { + description + "Add ETH_25GBASE_LR and ETH_25GBASE_SR PMD types."; + reference "0.25.0"; + } revision "2024-05-13" { description @@ -1109,6 +1115,18 @@ module openconfig-transport-types { description "Ethernet compliance code: 10GBASE_SR"; } + identity ETH_25GBASE_LR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 25GBASE_LR"; + reference "IEEE 802.3cc-2022 (CL114)"; + } + + identity ETH_25GBASE_SR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 25GBASE_SR"; + reference "IEEE 802.3by-2022 (CL112)"; + } + identity ETH_40GBASE_CR4 { base ETHERNET_PMD_TYPE; description "Ethernet compliance code: 40GBASE_CR4. From 1d1edd12ad5e8dc191b1d01fe53d55f72bf893d8 Mon Sep 17 00:00:00 2001 From: Arturo Mayoral Date: Thu, 11 Jul 2024 18:29:16 +0200 Subject: [PATCH 169/201] Terminal-device-properties-v2 initial commit (#911) * Terminal-device-properties-v2 This initial commit push the proposal consolidated from TIP OOPT community where it addresses the issues reported in Issue #910. --- doc/terminal-device-properties-guide.md | 92 ++- ...openconfig-terminal-device-properties.yang | 721 ++++++++++++++---- ...config-terminal-device-property-types.yang | 25 +- 3 files changed, 674 insertions(+), 164 deletions(-) diff --git a/doc/terminal-device-properties-guide.md b/doc/terminal-device-properties-guide.md index 88f3f0706..682f839d2 100644 --- a/doc/terminal-device-properties-guide.md +++ b/doc/terminal-device-properties-guide.md @@ -36,4 +36,94 @@ Manifest files are a special OpenConfig model category since they do not represe In order to keep separated them from the rest of operational models, the following openconfig extension is included in the model, to enrich the module metadata: ``` oc-ext:origin "openconfig-properties"; -``` \ No newline at end of file +``` +# Extensions introduced in the v0.2.0 release of the model. + +### Motivation + +After the initial release of the [openconfig-terminal-device-properties.yang](https://github.com/openconfig/public/blob/master/release/models/devices-manifest/openconfig-terminal-device-properties.yang), there have been significant technical questions and discussions happening within the Telecom Infra Project (TIP) Open Optical & Packet Transport (OOPT) community between operators and vendors. + +This issue summarizes the motivation and issues detected in the first release of the model and it will serve as an introduction and motivation of a new pull request (#911) with a new proposed comprehensive update of the model which will be accompanied by the relevant explanations on how the new model proposal will try to overcome the detected issues. It is worth mentioning that the current analysis and the new proposal are the outcomes of an extensive technical discussion within the OOPT community between vendors and service providers and that it consolidates an already discussed proposal starting from the issues and motivations explained here. + +### Context + +The current proposed terminal-device-properties model was designed with the objective of allowing the terminal devices' system vendors to expose the intrinsic properties (Modulation Format, FEC, Baud-rate) and performance characteristics (Rx-OSNR, CD/PMD limits) of the device's supported transmission modes. + +The initial version of the model was designed as a flat list of mode properties, where each entry represents a mode supported by the terminal device and includes the list of characteristics of that mode. However, this initial version presents a significant list of limitations. + +### Initial release limitations +- **First issue**: The current model exposes a list of modes available in the device, however, the characteristics of a mode of transmission are affected by the HW transceiver supplying it. In other words, two different transceivers (supported by the same terminal device) might support the same mode, but their mode characteristics are different. + +image + +- **Second issue**: There is not an interoperability matrix within the Terminal Device's which exposes the compatibility between Terminal Device's chassis, linecards, transceivers and modes. Right now there is no compatibility information available in the model, to allow the supplier to properly describe which modes are supported by each transceiver module available in the terminal device. + +#### Operational challenges + +- It is not clear how mode IDs will be assigned and who will assign them. +- Clarification of the bookended solution target by the model. + +### New proposal scope and initial assumptions + +Clarify the target of the next extension targets + +1. Bookended solutions, and interoperability between terminal devices of the same system vendor. +2. Interoperability between different system vendors O-OTs through standard modes + +### Solution proposed + +This pull request covers a proposed solution to the issues described in #910. + +The changes to the existing model **are not backward compatible.** + +The summary of the changes proposed is the following: + +**1. Operational-mode list:** + - The list of the exposed operational modes properties by the Terminal Device is augmented with the set of **CHARacteristic properties** of the operational mode. + - The mode-ids are the same used within the operational datastore of the terminal device (exposed by the [openconfig-terminal-device.yang](https://github.com/openconfig/public/blob/master/release/models/optical-transport/openconfig-terminal-device.yang) model) and have network-wide scope assuming they guarantee interoperability in bookended scenarios (two Terminal Devices of the same system vendor supporting the same mode). + - The mode-ids are defined by the system vendor. + +**2. Mode-descriptors list:** + - The **design properties** of the modes, which are dependent on the transceiver component that implements the mode, are exposed as a nested list within the operational mode list. It is assumed that a single operational mode might be implemented by different transceivers which might have associated different design properties exposed by different mode descriptors. + - The **mode-descriptor-id** is a local index that does not have interoperability meaning outside the specific Terminal device which reports it. In other words, the same mode descriptors might be exported by different Terminal Devices with different IDs. + +**3. Interoperable mode list.** + - A given proprietary operational mode might be capable to comply with a certain number of standards or elsewhere publicly defined operational modes defined by other organizations e.g., ITU-T or OpenROADM. + - This compatibility characteristic shall be assured by the system vendor and imply that the design properties of the implementations of that specific operational mode are a superset of all listed supported standard modes. + - This model block will replace the previous "G.698.2" node tree with a more generic definition able to accommodate multiple standards or MSA-defined modes. + +**4. Transceiver-descriptors list.** + - The Terminal Device exposes the list of the transceiver components which are supported by the device. + - Each transceiver exposes the list of compatible modes and their associated mode descriptor. + - This new model block enhances the previous version by allowing to expose explicitly the compatibility matrix between the Terminal Device, the set of transceiver modules supported and the associated modes supported. + +**5. Linecard-descriptors list.** + - The Terminal Device exposes the list of linecard components which are supported by the device. + - Each linecard component exposes the list of transceivers that are supported. + - Each linecard constrains the list of modes that can be supported among the ones supported by the transceiver. + - Each linecard constrains the optical-channel configuration, e.g., target-output-power and frequency range. + - This new model block enhances the previous version by allowing to expose explicitly the compatibility matrix between the Terminal Device, the line cards, the set of transceiver module per line card and the associated modes supported. + +Following the model tree with the 5 blocks described above. In green the new leaves/containers are added in this proposal; in black the non-modified leaves, even if they have been reallocated within the tree under different containers/lists. + +image + +For more clarity on the above please check the following common definitions and assumptions defined during the design process of this proposal within the Telecom Infra Project (TIP) OOPT MUST project. + +#### Common definitions +- System-vendor = the O-OT host platform provider (e.g. muxponder shelf, router, switch) and system integrator including the network operating system of the O-OT +- Manufacturer = Transceiver manufacturer (pluggable) +- Bookended scenario definition. + - The System Vendor is the same in the two O-OTs. + - The O-OTs of the same system vendor might host different Transceiver manufacturers. + - Mode-ids are defined and maintained by the system vendor. + - Interoperability shall be guaranteed by the system vendor if the same mode-id is configured in the line interfaces /optical-channels of the two O-OTs. + +#### Assumptions +- The **openconfig-terminal-device-properties.yang** is a standalone model which represents static properties of a given terminal device, including: + - **Operational-modes’ characteristic properties** on the transceiver configuration which characterize the mode (modulation-format, baud-rate, bit-rate, fec-format, filter…) + - **Mode-descriptors** which describe the transmission design properties (Tx/Rx properties + CHARacteristic properties) of the implementation of the mode conditioned by the HW platform (transceiver + linecard) (Rx/Tx-OSNR, CD/PMD tolerances, penalties…) + - **optical-channel’s configuration constraints** introduced by the HW implementation (min/max-central-frequency, min/max-output-power…) +- The openconfig-terminal-device-properties.yang is a standalone model representing a given mode’s static properties. We shall avoid any reference btw the manifest files and the operational openconfig trees which change dynamically. In other words, the references between mode-descriptors and operational modes, shall be through absolute identifiers. + + diff --git a/release/models/devices-manifest/openconfig-terminal-device-properties.yang b/release/models/devices-manifest/openconfig-terminal-device-properties.yang index 85bf510a8..862676c40 100644 --- a/release/models/devices-manifest/openconfig-terminal-device-properties.yang +++ b/release/models/devices-manifest/openconfig-terminal-device-properties.yang @@ -35,10 +35,18 @@ module openconfig-terminal-device-properties { the OTSi (OTSiMC). It also includes (optional) aspects such as filter characterization, CD and DGD tolerance."; - oc-ext:openconfig-version "0.1.2"; + oc-ext:openconfig-version "0.2.0"; // Revisions + revision "2024-05-28" { + description "Comprehensive model update to undertake the limitations + of the first version of the model, such the introduction of modes + dependencies on hardware components and the interoperability information + between terminal devices, linecards, transceviers and modes."; + reference "0.2.0"; + } + revision "2024-05-15" { description "Fix yang namespace URI to openconfig.net."; @@ -131,15 +139,6 @@ module openconfig-terminal-device-properties { It may vary depending on the modulation format used in the associated transmission mode (operational-mode)."; } - leaf pre-fec-ber-threshold { - type decimal64 { - fraction-digits 18; - } - units bit-errors-per-second; - description - "Threshold on the PRE-FEC-BER, for which FEC code is able to - correct errors."; - } } grouping filter-attributes-top { @@ -237,46 +236,22 @@ module openconfig-terminal-device-properties { } } - grouping operational-mode-descriptor-explicit-capabilities-state { + grouping mode-descriptor-design-properties-state { description - "Operational-mode capabilities leafs."; - - leaf modulation-format { - type union { - type string; - type oc-opt-term-prop-types:modulation-format; - } - description - "Optical modulation format associated to the mode. The - modulation format associated to the optical signal."; - } - - leaf bit-rate { - type oc-opt-term-prop-types:bit-rate; - description - "Rounded bit rate of the tributary signal delivered by the - optical channel associated to the specific operational mode. - Exact bit rate will be refined by protocol selection at the - associated tributary logical channel."; - } - - leaf baud-rate { - type decimal64 { - fraction-digits 2; - } - units Bd; - description - "Baud-rate or symbol rate."; - } - - leaf optical-channel-spectrum-width { - type decimal64 { - fraction-digits 2; - } - units GHz; + "For each given mode supported by the device there might be + one or multiple implementations related to the transceiver hardware + modules which implements the mode. For a given implementation, + a set of design properties are represented within the mode-descriptor + data structure, which is identified by a unique local identifier. + A mode-descriptor shall uniquely characterize a given operational mode + implemented by a given transceiver component described within the + terminal-device manfiest file."; + + leaf mode-descriptor-id { + type uint16; description - "Spectrum width of the optical channel associated to this - operational mode, calculated as the baud-rate*(1+roll-off)."; + "Two-octet encoding of the vendor-defined operational + mode"; } leaf min-tx-osnr { @@ -357,9 +332,19 @@ module openconfig-terminal-device-properties { optical channel associated to the associated transmission mode (operational model), expressed in decibels (dB)"; } + + leaf pre-fec-ber-threshold { + type decimal64 { + fraction-digits 18; + } + units bit-errors-per-second; + description + "Threshold on the PRE-FEC-BER, for which FEC code is able to + correct errors."; + } } - grouping operational-mode-descriptor-explicit-top { + grouping operational-mode-descriptor-design-properties-top { description "Definition of proprietary or non-standard operational-modes, which can be uniformly characterized by the set of attributes included in their @@ -369,150 +354,172 @@ module openconfig-terminal-device-properties { allowed values to be configured at the oc-component:optical-channel instance configured to this mode."; - container explicit-mode { + container mode-descriptors { description "Explicit definition of the operational-mode. Typically this is used for non-standard/proprietary modes defined by the terminal-device vendor and it is self-described by the capabilities included in the subtree underneath."; - container operational-mode-capabilities{ + list mode-descriptor{ + key "mode-descriptor-id"; description - "Set of attributes which characterizes the operational-mode for optimal - optical-channel transmission and receiver functions. This attributes - are intending to describe all the relevant data used during the - network planning phase, to estimate the physical-impairment - tolerances which can be introduced by the DWDM optical path, - while assuring optimal transmission function."; + ""; + leaf mode-descriptor-id { + type leafref { + path "../state/mode-descriptor-id"; + } + description + "Reference to mode-descriptor-id"; + } container state { config false; description - "Operational-mode explicit mode capabilities state container."; - - uses operational-mode-descriptor-explicit-capabilities-state; + "Mode-descriptor state attributes top container."; + uses mode-descriptor-design-properties-state; } - container fec { - description - "The Forward Error Coding (FEC) coding schema used, - including the name, overhead, pre-fec-ber threshold and - gain properties."; + uses operational-mode-descriptor-penalties-top; + uses operational-mode-descriptor-interoperable-modes-top; + } + } + } - container state { - config false; - description - "FEC state attributes top container."; + grouping interoperable-mode-properties-state { + description + "System-defined configuration data for component properties"; - uses fec-codes-attributes; - } + leaf name { + type string; + description + "System-supplied name of the property -- this is typically + non-configurable"; + } + + leaf value { + type union { + type string; + type boolean; + type int64; + type uint64; + type decimal64 { + fraction-digits 2; } + } + description + "Property values can take on a variety of types. Signed and + unsigned integer types may be provided in smaller sizes, + e.g., int8, uint16, etc."; + } + } - container penalties { - description - "Enconsing list's container."; + grouping operational-mode-descriptor-interoperable-mode-state { + description + "Interoperable mode features attributes grouping."; - list penalty { - key "parameter-and-unit up-to-boundary"; - description - "Penalties includes contributions from different impairments including - cd, pmd, low RX Power, pdl,... - - For parameter values below lowest up-to-boundary value, the penalty is 0. - - For parameter values between lowest and highest up-to-boundary - values, penalty could be linearly interpolated. - - For parameter values above highest up-to-boundary value, the penalty is the one - included within penalty-value attribute associated to the highest up-to-boundary"; - - leaf parameter-and-unit { - type leafref { - path "../state/parameter-and-unit"; - } - description - "Impairment and unit leading to the penalty (i.e., cd-ps)"; - } - - leaf up-to-boundary { - type leafref { - path "../state/up-to-boundary"; - } - description - "defines the upper (for positive values) and lower (for negative values) - limit for which the penalty value is valid."; - } - - container state { - config false; - description - "Penalties list element's state attributes top container."; - uses penalties-list-element-attributes; - } - } - } + leaf mode-name { + type string; + description + "Public well-know free-format name reference to the mode name."; + } - container filter { - description - "This container includes information which characterises the filter at - transceiver transmission for the given operational-mode."; + leaf publisher-organization { + type union { + type string; + type oc-opt-term-prop-types:interoperability-modes-organization; + } + description + "Name of the organization, standard body, Multi-Source Agreement, or + open source project, responsible of the definition of the interoperable + mode."; + } + } + grouping operational-mode-descriptor-penalties-top { + description + "Top container grouping for operational-mode-descriptor."; + container penalties { + description + "Enconsing list's container."; - container state { - config false; - description - "Filter's state attributes top container."; - uses filter-attributes-top; + list penalty { + key "parameter-and-unit up-to-boundary"; + description + "Penalties includes contributions from different impairments including + cd, pmd, low RX Power, pdl,... + - For parameter values below lowest up-to-boundary value, the penalty is 0. + - For parameter values between lowest and highest up-to-boundary + values, penalty could be linearly interpolated. + - For parameter values above highest up-to-boundary value, the penalty is the one + included within penalty-value attribute associated to the highest up-to-boundary"; + + leaf parameter-and-unit { + type leafref { + path "../state/parameter-and-unit"; } + description + "Impairment and unit leading to the penalty (i.e., cd-ps)"; } - } - container optical-channel-config-value-constraints{ - description - "Set of constraints of the configuration attributes - of the optical-channel associated to the selected - operational-mode."; + leaf up-to-boundary { + type leafref { + path "../state/up-to-boundary"; + } + description + "defines the upper (for positive values) and lower (for negative values) + limit for which the penalty value is valid."; + } container state { config false; description - "Operational-mode explicit mode config value constrains state top - container."; - - uses operational-mode-descriptor-explicit-config-constraints-state; + "Penalties list element's state attributes top container."; + uses penalties-list-element-attributes; } } } } - grouping operational-mode-descriptor-standard-state { + grouping operational-mode-descriptor-interoperable-modes-top { description - "Standard mode features attributes grouping."; + "Each mode-descriptor of a given operational-mode could be compatible + with many interoperable modes which are defined, elsewhere, by standard + bodies, multi-source agreements, vendor forums or any other public forum. + This compatibility characteristic shall be assured by the system-vendor + and imply that the design properties of the implementations of that + specific operational mode are a superset of the all listed supported + standard modes"; - leaf standard-mode { - type oc-opt-term-prop-types:standard-mode; + container interoperable-modes { description - "G.698.2 (11/18) standard mode"; - } - } + "Top level container of interoperable modes."; - grouping operational-mode-descriptor-standard-top { - description - "Standard mode features description grouping. It is used if the - 'mode-type' attribute is set to 'TRANSCEIVER_MODE_TYPE_STANDARD"; + list interoperable-mode { + key "mode-name"; + description + "Each interoperable mode is defined by its public name reference + and a set of free form key-value properties which augments with + the required information provided by the system-vendor."; - container G.698.2 { - description - "ITU-T G.698.2 (11/18) standard mode that guarantees interoperability. - It must be an string with the following format: - B-DScW-ytz(v) where all these attributes are conformant - to the ITU-T G.698.2 (11/18) recommendation."; + leaf mode-name { + type leafref { + path "../state/mode-name"; + } + description + "Reference to mode-name."; + } - container state { + container state { config false; description - "Operational-mode standard mode state top container."; + "Operational-mode interoperbale mode state top container."; - uses operational-mode-descriptor-standard-state; + uses operational-mode-descriptor-interoperable-mode-state; + } } } } + grouping operational-mode-descriptor-state{ description "Top-level operational-mode-features grouping definitions"; @@ -524,13 +531,74 @@ module openconfig-terminal-device-properties { mode"; } - leaf mode-type { - type identityref{ - base oc-opt-term-prop-types:TRANSCEIVER_MODE_TYPE; + leaf modulation-format { + type union { + type string; + type oc-opt-term-prop-types:modulation-format; + } + description + "Optical modulation format associated to the mode. The + modulation format associated to the optical signal."; + } + + leaf bit-rate { + type oc-opt-term-prop-types:bit-rate; + description + "Rounded bit rate of the tributary signal delivered by the + optical channel associated to the specific operational mode. + Exact bit rate will be refined by protocol selection at the + associated tributary logical channel."; + } + + leaf baud-rate { + type decimal64 { + fraction-digits 2; + } + units Bd; + description + "Baud-rate or symbol rate."; + } + + leaf optical-channel-spectrum-width { + type decimal64 { + fraction-digits 2; + } + units GHz; + description + "Spectrum width of the optical channel associated to this + operational mode, calculated as the baud-rate*(1+roll-off)."; + } + } + + grouping operation-mode-filter-and-fec { + description + "Enclosing grouping for Operational Mode filter and FEC attributes."; + + container filter { + description + "This container includes information which characterises the filter at + transceiver transmission for the given operational-mode."; + + container state { + config false; + description + "Filter's state attributes top container."; + uses filter-attributes-top; } + } + container fec { description - "Indicates whether the transceiver's mode is a standard - mode, an organizational mode or an explicit mode."; + "The Forward Error Coding (FEC) coding schema used, + including the name, overhead, pre-fec-ber threshold and + gain properties."; + + container state { + config false; + description + "FEC state attributes top container."; + + uses fec-codes-attributes; + } } } @@ -538,7 +606,7 @@ module openconfig-terminal-device-properties { description "top-level operational-mode definitions"; - container operational-modes { + container operational-mode-descriptors { config false; description "Indicates the transceiver's list of supported operational @@ -546,12 +614,12 @@ module openconfig-terminal-device-properties { reference "https://github.com/openconfig/public/blob/master/doc/terminal-device-properties-guide.md"; - list mode-descriptor { + list operational-modes { key "mode-id"; description - "List of operational modes supported by the platform. - The operational mode provides a platform-defined summary - of information such as symbol rate, modulation, pulse + "List of operational modes supported by the terminal-device. + The operational mode descriptor list provides a platform-defined + summary of the modes' information such as symbol rate, modulation, pulse shaping, etc."; leaf mode-id { @@ -569,11 +637,342 @@ module openconfig-terminal-device-properties { uses operational-mode-descriptor-state; } - uses operational-mode-descriptor-standard-top; - uses operational-mode-descriptor-explicit-top; + uses operation-mode-filter-and-fec; + uses operational-mode-descriptor-design-properties-top; + } + } + } + + // Definition of terminal-device transceiver descriptors. + + grouping terminal-device-component-descriptor-state { + description + "State data for terminal device descriptor components."; + + leaf component-descriptor-id { + type string; + description + "Unique identifier assigned by the system vendor for the + component descriptor."; + } + + leaf system-vendor-name { + type string; + description + "System vendor company name"; + } + + leaf system-vendor-part-no { + type string; + description + "System-vendor assigned part number for the component. This should + be present in particular if the component is also an FRU + (field replaceable unit)"; + } + + leaf mfg-name { + type string; + description + "System-supplied identifier for the manufacturer of the + component. This data is particularly useful when a + component manufacturer is different than the overall + device vendor."; + } + + leaf mfg-part-no { + type string; + description + "Transceiver manufacturer assigned part number for the component."; + } + + leaf hardware-version { + type string; + description + "For hardware components, this is the hardware revision of + the component."; + } + + leaf firmware-version { + type string; + description + "For hardware components, this is the version of associated + firmware that is running on the component, if applicable."; + } + + leaf software-version { + type string; + description + "For software components such as operating system or other + software module, this is the version of the currently + running software."; + } + + leaf clei-code { + type string; + description + "Common Language Equipment Identifier (CLEI) code of the + component. This should be present in particular if the + component is also an FRU (field replaceable unit)"; + } + } + grouping transceiver-compatible-mode-state { + description + "Each compatible mode has associated a mode-descriptor which represents + the operational mode design properties associated to the transceiver which + transmits the mode."; + + container state { + description + "State container of transciever compatible modes."; + + leaf mode-id { + type uint16; + must "../../../../../../operational-mode-descriptors/operational-modes[mode-id=current()]/mode-id"; + + description + "Two-octet encoding of the vendor-defined operational mode. + Each value shall reference a valid mode-id included in the + operational-mode-descriptors list."; + } + + leaf mode-descriptor-id { + type leafref { + path "/oc-opt-term-properties:operational-mode-descriptors/operational-modes/mode-descriptors/mode-descriptor/mode-descriptor-id"; + } + description + "Reference to the associated mode-descriptor-id which describes + the specific design properties of the mode once it is being transmitted + by the parent transceiver component."; + } + } + } + + grouping transceiver-compatible-modes { + description + "Transceiver compatible modes definition."; + + container transceiver-compatible-modes { + config false; + description + "Indicates the set of operatational-modes, present in the terminal- + device manifest, which are compatible with the described transceiver + component."; + + list transceiver-compatible-mode { + key "mode-id"; + description + "List of operational modes supported by the target transceiver."; + + leaf mode-id { + type leafref { + path "../state/mode-id"; + } + description + "Reference to a ../state/mode-id."; + } + uses transceiver-compatible-mode-state; + } + } + } + + grouping transceiver-descriptor-top { + description + "top-level transceiver-descriptor definitions"; + + container transceiver-descriptors { + config false; + description + "Indicates the terminal-device's list of compatible transceiver + component and its associated modes and mode descriptors compatibility + matrix."; + + list transceiver-descriptor { + key "component-descriptor-id"; + description + "List of transceiver components supported by the terminal-device. + The operational mode provides a platform-defined summary + of information such as symbol rate, modulation, pulse + shaping, etc."; + + leaf component-descriptor-id { + type leafref { + path "../state/component-descriptor-id"; + } + description + "Reference to component-descriptor-id"; + } + + container state { + description + "Static features or properties which characterize the + component descriptor."; + + uses terminal-device-component-descriptor-state; + } + uses transceiver-compatible-modes; + } + } + } + + // Definition of terminal-device linecard descriptors. + + grouping linecards-constrained-compatible-modes-state { + description + "Grouping for the linecards' contrained compatible modes + state attributes."; + + container state { + description + "State container for linecard constrained compatible modes"; + + leaf mode-id { + type uint16; + must "../../../../../../../../operational-mode-descriptors/operational-modes[mode-id=current()]/mode-id"; + + description + "Absolute reference to an operational-mode-id. Each value shall + reference a valid mode-id included in the operational-mode-descriptors + list."; + } + + leaf mode-descriptor-id { + type leafref { + path "/oc-opt-term-properties:operational-mode-descriptors/operational-modes/mode-descriptors/mode-descriptor/mode-descriptor-id"; + } + description + "Reference to the associated mode-descriptor-id which describes + the specific design properties of the mode once it is being transmitted + by the parent transceiver component."; + } + } + } + + grouping constrained-compatible-modes { + description + "Linecards' compatible transceiver list of compatible modes which are + constrained by the integration made by the system vendor of the given + terminal-device."; + + container constrained-compatible-modes { + config false; + description + "Indicates the set of operatational-modes, present in the terminal- + device manifest, which are compatible with the described transceiver + component within the linecard component."; + + list constrained-compatible-mode { + key "mode-id"; + description + "List of operational modes supported by the target transceiver."; + + leaf mode-id { + type leafref { + path "../state/mode-id"; + } + description + "Reference to linecard-descriptor/constrained-compatible-mode/state/mode-id."; + } + + uses linecards-constrained-compatible-modes-state; + + container optical-channel-config-value-constraints{ + description + "Set of constraints of the configuration attributes + of the optical-channel associated to the selected + operational-mode."; + + container state { + config false; + description + "Operational-mode explicit mode config value constrains state top + container."; + + uses operational-mode-descriptor-explicit-config-constraints-state; + } + } + } + } + } + + grouping linecard-compatible-transceivers { + description + "Linecard-transceiver compatibility matrix definition."; + + container compatible-transceivers { + config false; + description + "Indicates the set of transceiver component which are compatible + with the described linecard component."; + + list compatible-transceiver { + key "transceiver-descriptor-id"; + description + "List of transceiver descriptor ids."; + + leaf transceiver-descriptor-id { + type leafref { + path "../state/transceiver-descriptor-id"; + } + description + "Reference to transceiver-descriptor-id"; + } + container state { + description + "Static features or properties which characterize the + component descriptor."; + + leaf transceiver-descriptor-id { + type string; + description + "String rerference of the system vendor defined transciever + component descriptor id."; + } + } + uses constrained-compatible-modes; + } + } + } + + grouping linecard-descriptor-top { + description + "top-level linecard-descriptor definitions"; + + container linecard-descriptors { + config false; + description + "Indicates the terminal-device's list of compatible linecard + component and its associated modes and mode descriptors compatibility + matrix."; + + list linecard-descriptor { + key "component-descriptor-id"; + description + "List of linecard components supported by the terminal-device. + The operational mode provides a platform-defined summary + of information such as symbol rate, modulation, pulse + shaping, etc."; + + leaf component-descriptor-id { + type leafref { + path "../state/component-descriptor-id"; + } + description + "Reference to component-descriptor-id"; + } + + container state { + description + "Static features or properties which characterize the + component descriptor."; + + uses terminal-device-component-descriptor-state; + } + uses linecard-compatible-transceivers; } } } + uses transceiver-descriptor-top; + uses linecard-descriptor-top; uses operational-mode-top; } diff --git a/release/models/devices-manifest/openconfig-terminal-device-property-types.yang b/release/models/devices-manifest/openconfig-terminal-device-property-types.yang index f389b602c..b1fd0ef9b 100644 --- a/release/models/devices-manifest/openconfig-terminal-device-property-types.yang +++ b/release/models/devices-manifest/openconfig-terminal-device-property-types.yang @@ -29,10 +29,18 @@ module openconfig-terminal-device-property-types { definitions of the set of modulation format, FEC codes and adjustment granularity types use in the reffered model."; - oc-ext:openconfig-version "0.1.1"; + oc-ext:openconfig-version "0.2.0"; // Revisions + revision "2024-05-28" { + description "Comprehensive model update to undertake the limitations + of the first version of the model, such the introduction of modes + dependencies on hardware components and the interoperability information + between terminal devices, linecards, transceviers and modes."; + reference "0.2.0"; + } + revision "2024-05-15" { description "Fix yang namespace URI to openconfig.net."; @@ -62,6 +70,14 @@ module openconfig-terminal-device-property-types { reference "ITU-T G.698.2 (11/2018)"; } + typedef interoperability-modes-organization { + type identityref { + base INTEROPERABILITY_MODES_ORGANIZATION; + } + description + "Optical modulation format associated to the mode"; + } + typedef bit-rate { type identityref { base oc-opt-types:TRIBUTARY_RATE_CLASS_TYPE; @@ -123,6 +139,11 @@ module openconfig-terminal-device-property-types { "Definition of impairment type and unit used in penaty list"; } + identity INTEROPERABILITY_MODES_ORGANIZATION { + description + "Base identity for interoperability modes' defining organizations."; + } + identity SHAPING_TYPE { description "Base identity for pulse-shaping-type, to help characterize the @@ -260,7 +281,6 @@ module openconfig-terminal-device-property-types { no minimun spacing between channels is defined."; } - identity FEC { description "Forward Error Correction base identity."; @@ -279,6 +299,7 @@ module openconfig-terminal-device-property-types { "Generic FEC, Reed Solomon (255,239) coding schema, defined in ITU-T G.975 (10/2000)."; } + identity FEC_E { base FEC; description From ce4fd10a8078e89d4a2c7408b0462831f45e0165 Mon Sep 17 00:00:00 2001 From: Wen Bo Li <50884368+wenovus@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:02:29 -0700 Subject: [PATCH 170/201] Add `ext-community-count` container and clarify that `community-count` does not include extended communities. (#1084) * Clarify that `community-count` does not include extended communities. --- release/models/bgp/openconfig-bgp-policy.yang | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-policy.yang b/release/models/bgp/openconfig-bgp-policy.yang index 03dd2ab8d..f4c0c18c4 100644 --- a/release/models/bgp/openconfig-bgp-policy.yang +++ b/release/models/bgp/openconfig-bgp-policy.yang @@ -28,7 +28,15 @@ module openconfig-bgp-policy { It augments the base routing-policy module with BGP-specific options for conditions and actions."; - oc-ext:openconfig-version "7.0.0"; + oc-ext:openconfig-version "7.1.0"; + + revision "2024-07-02" { + description + "Add ext-community-count container, which also clarifies that + community-count does not include other types of communities (e.g. + extended)."; + reference "7.1.0"; + } revision "2024-01-31" { description @@ -384,28 +392,52 @@ module openconfig-bgp-policy { grouping community-count-config { description - "Configuration data for community count condition"; + "Configuration data for different community count conditions"; uses oc-pol-types:attribute-compare-operators; } grouping community-count-state { description - "Operational state data for community count condition"; + "Operational state data for different community count conditions"; } grouping community-count-top { description - "Top-level grouping for community count condition"; + "Top-level grouping for different community count conditions"; container community-count { description "Value and comparison operations for conditions based on the - number of communities in the route update"; + number of regular communities in the route update."; + + container config { + description + "Configuration data for regular community count condition"; + + uses community-count-config; + } + + container state { + + config false; + + description + "Operational state data for regular community count condition"; + + uses community-count-config; + uses community-count-state; + } + } + + container ext-community-count { + description + "Value and comparison operations for conditions based on the + number of extended communities in the route update."; container config { description - "Configuration data for community count condition"; + "Configuration data for extended community count condition"; uses community-count-config; } @@ -415,7 +447,7 @@ module openconfig-bgp-policy { config false; description - "Operational state data for community count condition"; + "Operational state data for extended community count condition"; uses community-count-config; uses community-count-state; From d23641eeb2c576f3d07b67361d526b3a39ffa8fa Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Campos Date: Tue, 16 Jul 2024 20:04:40 +0200 Subject: [PATCH 171/201] Add vpws local and remote identifiers to EVPN-VPWS configuration (#930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update openconfig-evpn.yang with vpws identifiers Extend openconfig-evpn.yang model with those two leafs for setting both local and remote vpws service identifiers within container evpn/evpn-instances/evpn-instance --------- Co-authored-by: Óscar González de Dios --- .../network-instance/openconfig-evpn.yang | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/release/models/network-instance/openconfig-evpn.yang b/release/models/network-instance/openconfig-evpn.yang index 3b201e809..b9870e461 100644 --- a/release/models/network-instance/openconfig-evpn.yang +++ b/release/models/network-instance/openconfig-evpn.yang @@ -40,7 +40,14 @@ module openconfig-evpn { domains, this is not currently supported and requires an extension of the model."; - oc-ext:openconfig-version "0.8.0"; + oc-ext:openconfig-version "0.9.0"; + + revision "2024-05-14" { + description + "Add configuration of VPWS identifier + for EVPN Virtual Private Wire Services (RFC 8214)"; + reference "0.9.0"; + } revision "2024-04-03" { description @@ -555,6 +562,30 @@ module openconfig-evpn { draft-ietf-bess-rfc7432bis-05 BGP MPLS-Based Ethernet VPN"; } + + leaf local-vpws-service-id { + type uint32 { + range "1..16777215"; + } + description + "Indicates the local VPWS identifier assigned + to the Attachment Circuit (AC)."; + reference + "RFC8214 Virtual Private Wire Service Support + in Ethernet VPN."; + } + + leaf remote-vpws-service-id { + type uint32 { + range "1..16777215"; + } + description + "Indicates the remote VPWS identifier assigned + to the Attachment Circuit (AC)."; + reference + "RFC8214 Virtual Private Wire Service Support + in Ethernet VPN."; + } } grouping evpn-import-export-config { From 5ba5c936a21560fe5edcda3010d6219f298c8112 Mon Sep 17 00:00:00 2001 From: Ebben Aries Date: Tue, 16 Jul 2024 11:58:19 -0700 Subject: [PATCH 172/201] Remove unused top-level 'messages' container (#1151) * (M) system/openconfig-messages.yang - Remove unused `uses` of the top-level `messages` container --- release/models/system/openconfig-messages.yang | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/release/models/system/openconfig-messages.yang b/release/models/system/openconfig-messages.yang index 894704479..bfed7afd2 100644 --- a/release/models/system/openconfig-messages.yang +++ b/release/models/system/openconfig-messages.yang @@ -32,12 +32,18 @@ module openconfig-messages { /yang/system/openconfig-system.yang model, rather it provies the Operator with an alternative method of consuming messages."; - oc-ext:openconfig-version "0.0.1"; + oc-ext:openconfig-version "0.1.0"; + + revision 2024-07-15 { + description + "Remove unused top-level messages container."; + reference "0.1.0"; + } revision "2018-08-13" { - description - "Initial draft."; - reference "0.0.1"; + description + "Initial draft."; + reference "0.0.1"; } // identity statements @@ -217,5 +223,4 @@ module openconfig-messages { uses debug-messages-top; } } - uses messages-top; } From daf73c37e9062b458bb9eab645840e5d3835c74d Mon Sep 17 00:00:00 2001 From: Jake Snyder Date: Wed, 17 Jul 2024 17:15:37 -0600 Subject: [PATCH 173/201] Add transition OPMODES to wifi-phy models (#895) * adding opmodes for WPA3 * Adding transition modes to phy opmodes --- release/models/wifi/openconfig-wifi-phy.yang | 28 +++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/release/models/wifi/openconfig-wifi-phy.yang b/release/models/wifi/openconfig-wifi-phy.yang index 41d727f61..cf328248d 100644 --- a/release/models/wifi/openconfig-wifi-phy.yang +++ b/release/models/wifi/openconfig-wifi-phy.yang @@ -25,7 +25,13 @@ module openconfig-wifi-phy { description "Model for managing PHY layer configuration of Radio interfaces."; - oc-ext:openconfig-version "1.2.3"; + oc-ext:openconfig-version "1.2.4"; + + revision "2024-07-10" { + description + "Adding TRANSITION modes to PHY OPMODES"; + reference "1.2.4"; + } revision "2023-11-30" { description @@ -484,20 +490,40 @@ module openconfig-wifi-phy { description "Open authentication with Opportunistic Wireless Encryption."; } + enum ENHANCED_OPEN_TRANSITION { + description + "Open authentication with Opportunistic Wireless Encryption and + support for transition mode."; + } enum WPA3_SAE { description "WPA3-SAE using Simultaneous Authentication of Equals (SAE)."; } + enum WPA3_2_SAE_TRANSITION { + description + "WPA3-SAE using Simultaneous Authentication of Equals (SAE) and + WPA2-PSK AKMs."; + } enum WPA3_ENTERPRISE { description "WPA3-Enterprise with 802.1X SHA-256 authentication key management."; } + enum WPA3_2_ENTERPRISE_TRANSITION { + description + "WPA3-Enterprise with 802.1X SHA-256 authentication key + management."; + } enum WPA3_ENTERPRISE_192_BIT { description "WPA3-Enterprise with 802.1X SHA-384 authentication key management."; } + enum WPA3_ENTERPRISE_GCM_256_BIT { + description + "WPA3-Enterprise with 802.1X GCM256 authentication key + management."; + } } description "Operating mode of the BSS."; From 4e238f6c56909a8870c6a7b0958dab59ba7572bb Mon Sep 17 00:00:00 2001 From: J vanBemmel Date: Fri, 26 Jul 2024 00:52:06 +0000 Subject: [PATCH 174/201] Add regression tests for bugs in route-distinguisher regex (#454) Co-authored-by: Rob Shakir --- regexp-tests/openconfig-network-instance-types-test.yang | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/regexp-tests/openconfig-network-instance-types-test.yang b/regexp-tests/openconfig-network-instance-types-test.yang index 9a4edf22d..9047cd777 100644 --- a/regexp-tests/openconfig-network-instance-types-test.yang +++ b/regexp-tests/openconfig-network-instance-types-test.yang @@ -13,6 +13,7 @@ module openconfig-network-instance-types-test { pt:pattern-test-pass "99:4294967295"; pt:pattern-test-pass "999:999999999"; pt:pattern-test-pass "9999:99999999"; + pt:pattern-test-fail "09999:99999999"; // regression: not canonical pt:pattern-test-pass "65535:0"; pt:pattern-test-pass "59999:65536"; pt:pattern-test-pass "64999:4294967289"; @@ -24,6 +25,7 @@ module openconfig-network-instance-types-test { pt:pattern-test-pass "65535:4289999999"; pt:pattern-test-pass "65535:4199999999"; pt:pattern-test-pass "65535:3999999999"; + pt:pattern-test-pass "65535:2999999999"; // regression: [1-3][0-9]{9}, not just 3[0-9]{9} pt:pattern-test-fail "0:4294967296"; pt:pattern-test-fail "65536:777777"; pt:pattern-test-fail "65540:777777"; @@ -52,6 +54,7 @@ module openconfig-network-instance-types-test { pt:pattern-test-fail "1.1.1.1:65600"; pt:pattern-test-fail "1.1.1.1:66000"; pt:pattern-test-fail "1.1.1.1:70000"; + pt:pattern-test-fail "1.1.1.1:09999"; // regression pt:pattern-test-fail "256.255.255.255:99"; pt:pattern-test-fail "1.1.1.256:99"; pt:pattern-test-fail "256.1.1.1%eth0:99"; @@ -71,7 +74,9 @@ module openconfig-network-instance-types-test { pt:pattern-test-pass "4293999999:65535"; pt:pattern-test-pass "4289999999:65535"; pt:pattern-test-pass "4199999999:65535"; + pt:pattern-test-pass "1999999999:65535"; // regression pt:pattern-test-pass "3999999999:65535"; + pt:pattern-test-fail "3999999999:05535"; // regression pt:pattern-test-fail "4294967296:0"; pt:pattern-test-fail "777777:65536"; pt:pattern-test-fail "777777:65540"; From 72d3b679c5081340da079af4db87643a55a16ebd Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Thu, 25 Jul 2024 17:55:38 -0700 Subject: [PATCH 175/201] add hex-string-prefixed typedef (#1014) * add hex-string-colon typedef * deprecate hex-string * Update openconfig-keychain.yang --- regexp-tests/openconfig-yang-types-test.yang | 13 ++++++++++ .../models/keychain/openconfig-keychain.yang | 17 ++++++++++--- .../policy/openconfig-policy-types.yang | 25 +++++++++++++------ .../models/types/openconfig-yang-types.yang | 24 ++++++++++++++++-- 4 files changed, 66 insertions(+), 13 deletions(-) diff --git a/regexp-tests/openconfig-yang-types-test.yang b/regexp-tests/openconfig-yang-types-test.yang index 2f6ca1ba6..6539ba6b7 100644 --- a/regexp-tests/openconfig-yang-types-test.yang +++ b/regexp-tests/openconfig-yang-types-test.yang @@ -5,6 +5,19 @@ module openconfig-yang-types-test { import pattern-test { prefix "pt"; } import openconfig-yang-types { prefix "oc-yang"; } + leaf hex-string-prefixed { + type oc-yang:hex-string-prefixed; + pt:pattern-test-pass "0x0000"; + pt:pattern-test-pass "0xffff"; + pt:pattern-test-pass "0xFFFF"; + pt:pattern-test-pass "0x0123456789abcdefABCDEF"; + pt:pattern-test-pass "0xFEDCBAfedcba9876543210"; + pt:pattern-test-fail "0xg"; + pt:pattern-test-fail "0xG"; + pt:pattern-test-fail "0x0123456789abcdefABCDEFG"; + pt:pattern-test-fail "0xFED0xba9876543210"; + } + leaf hex-string { type oc-yang:hex-string; pt:pattern-test-pass "00000"; diff --git a/release/models/keychain/openconfig-keychain.yang b/release/models/keychain/openconfig-keychain.yang index adf35eaad..d073f13a1 100644 --- a/release/models/keychain/openconfig-keychain.yang +++ b/release/models/keychain/openconfig-keychain.yang @@ -33,7 +33,13 @@ module openconfig-keychain { which may be then referenced by other models such as routing protocol management."; - oc-ext:openconfig-version "0.4.0"; + oc-ext:openconfig-version "0.5.0"; + +revision "2024-05-30" { + description + "Update key-id to a union of hex-string-prefixed and uint64."; + reference "0.5.0"; + } revision "2022-11-05" { description @@ -194,13 +200,16 @@ module openconfig-keychain { leaf key-id { type union { - type oc-yang:hex-string { - length "1..64"; + type oc-yang:hex-string-prefixed { + length "3..66"; } type uint64; } description - "Identifier for the key within the keychain."; + "Identifier for the key within the keychain. Note that the + hex-string type is deprecated and will be removed from a future + version of this model. Implementations should transition to using + the hex-string-prefixed type."; } leaf secret-key { diff --git a/release/models/policy/openconfig-policy-types.yang b/release/models/policy/openconfig-policy-types.yang index d33dfe28d..dea5bf0fa 100644 --- a/release/models/policy/openconfig-policy-types.yang +++ b/release/models/policy/openconfig-policy-types.yang @@ -10,6 +10,7 @@ module openconfig-policy-types { // import some basic types import ietf-yang-types { prefix yang; } import openconfig-extensions { prefix oc-ext; } + import openconfig-yang-types { prefix oc-yang; } // meta organization @@ -24,9 +25,15 @@ module openconfig-policy-types { policy. It can be imported by modules that contain protocol- specific policy conditions and actions."; - oc-ext:openconfig-version "3.2.3"; + oc-ext:openconfig-version "3.3.0"; - revision "2022-11-08" { + revision "2024-05-14" { + description + "Add hex-string-prefixed to typedef tag-type."; + reference "3.3.0"; + } + +revision "2022-11-08" { description "Add INSTALL_PROTOCOL_TYPE local."; reference "3.2.3"; @@ -165,14 +172,18 @@ module openconfig-policy-types { type union { type uint32; type yang:hex-string; + type oc-yang:hex-string-prefixed { + length "3..18"; + } } - description "type for expressing route tags on a local system, - including IS-IS and OSPF; may be expressed as either decimal or - hexidecimal integer"; + description + "Type for expressing route tags on a local system, including IS-IS + and OSPF; This may be expressed as either decimal or hexidecimal + integer."; reference - "RFC 2178 OSPF Version 2 + "RFC 2178 OSPF Version 2 specifies a 32 bit value RFC 5130 A Policy Control Mechanism in IS-IS Using - Administrative Tags"; + Administrative Tags specifies 32 bit and 64 bit values."; } identity INSTALL_PROTOCOL_TYPE { diff --git a/release/models/types/openconfig-yang-types.yang b/release/models/types/openconfig-yang-types.yang index c978cd049..dbbf88a6d 100644 --- a/release/models/types/openconfig-yang-types.yang +++ b/release/models/types/openconfig-yang-types.yang @@ -32,7 +32,13 @@ module openconfig-yang-types { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "0.3.1"; + oc-ext:openconfig-version "1.0.0"; + + revision "2024-05-30" { + description + "Add hex-string-prefixed typedef"; + reference "1.0.0"; + } revision "2021-07-14" { description @@ -109,12 +115,26 @@ module openconfig-yang-types { } typedef hex-string { + status deprecated; type string { pattern '[0-9a-fA-F]*'; oc-ext:posix-pattern '^[0-9a-fA-F]*$'; } description - "A string consisting of a hexadecimal characters."; + "A string consisting of a hexadecimal characters. This leaf is + deprecated and will removed in a future version of this model. + The type hex-string-prefixed should be used instead."; + } + + typedef hex-string-prefixed { + type string { + pattern '(0x)([0-9a-fA-F]{2})*'; + oc-ext:posix-pattern '^(0x)([0-9a-fA-F]{2})*$'; + length "3..max"; + } + description + "A string encoding a hexadecimal number with a prefix of '0x' followed + by a list of bytes."; } typedef counter32 { From 8dc427e2d7a8242848821566ca33e120f6845f2e Mon Sep 17 00:00:00 2001 From: Eric Breverman Date: Tue, 30 Jul 2024 09:39:06 -0700 Subject: [PATCH 176/201] Optical channel reference to it's logical channel (#1130) * Add a state leaf to optical channels to reference their logical channel assignment --- .../openconfig-terminal-device.yang | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/release/models/optical-transport/openconfig-terminal-device.yang b/release/models/optical-transport/openconfig-terminal-device.yang index c9289282a..8001cfb60 100644 --- a/release/models/optical-transport/openconfig-terminal-device.yang +++ b/release/models/optical-transport/openconfig-terminal-device.yang @@ -77,7 +77,14 @@ module openconfig-terminal-device { ports per linecard, separate linecards for client and line ports, etc.)."; - oc-ext:openconfig-version "1.9.1"; + oc-ext:openconfig-version "1.9.2"; + + revision "2024-06-12" { + description + "Add a state leaf to optical channels to reference their logical + channel assignment."; + reference "1.9.2"; + } revision "2023-12-13" { description @@ -1325,6 +1332,18 @@ module openconfig-terminal-device { to the same value across related optical channels."; } + leaf logical-channel-assignment { + type leafref { + path "/oc-opt-term:terminal-device/oc-opt-term:logical-channels" + + "/oc-opt-term:channel/oc-opt-term:index"; + } + description + "Reference to the logical channel that is directly assigned + to this optical channel if it is assigned to a logical channel. + The logical channel must also reference this optical channel at + logical-channel-assignments/assignment/state/optical-channel"; + } + uses oc-transceiver:optical-power-state; container chromatic-dispersion { From e03930aea3338a07738b5805551d98f8a34bbe94 Mon Sep 17 00:00:00 2001 From: Anukul Verma <163091262+Verma-Anukul@users.noreply.github.com> Date: Tue, 6 Aug 2024 22:19:37 +0530 Subject: [PATCH 177/201] Adding NTP auth-key reference for NTP server config (#1149) Issue : NTP model has key-list, but there is no way to reference the same from ntp servers. Fix : Added a new leafref in server config container to reference configured key. --- release/models/system/openconfig-system.yang | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/release/models/system/openconfig-system.yang b/release/models/system/openconfig-system.yang index e63b5859c..3352fd221 100644 --- a/release/models/system/openconfig-system.yang +++ b/release/models/system/openconfig-system.yang @@ -47,7 +47,13 @@ module openconfig-system { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "2.0.0"; + oc-ext:openconfig-version "2.1.0"; + + revision "2024-07-15" { + description + "Added auth key reference in ntp server configuration."; + reference "2.1.0"; + } revision "2023-12-20" { description @@ -748,6 +754,14 @@ module openconfig-system { description "Source address to use on outgoing NTP packets"; } + + leaf key-id { + type leafref { + path "../../../../ntp-keys/ntp-key/key-id"; + } + description + "Reference to NTP authentication key for this server."; + } } grouping system-ntp-server-state { From 5f0f4e5ab66f11c34661378599e32bff873ec2dd Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 6 Aug 2024 09:50:26 -0700 Subject: [PATCH 178/201] Add backup-active to AFT NHG state (#1100) * add backup-active to AFT NHG state --- release/models/aft/openconfig-aft-common.yang | 22 ++++++++++++++++++- .../models/aft/openconfig-aft-ethernet.yang | 8 ++++++- release/models/aft/openconfig-aft-ipv4.yang | 8 ++++++- release/models/aft/openconfig-aft-ipv6.yang | 8 ++++++- release/models/aft/openconfig-aft-mpls.yang | 16 ++++++-------- release/models/aft/openconfig-aft-pf.yang | 8 ++++++- .../aft/openconfig-aft-state-synced.yang | 8 ++++++- release/models/aft/openconfig-aft.yang | 8 ++++++- 8 files changed, 70 insertions(+), 16 deletions(-) diff --git a/release/models/aft/openconfig-aft-common.yang b/release/models/aft/openconfig-aft-common.yang index ac924b67c..c69587e0f 100644 --- a/release/models/aft/openconfig-aft-common.yang +++ b/release/models/aft/openconfig-aft-common.yang @@ -23,7 +23,13 @@ submodule openconfig-aft-common { "Submodule containing definitions of groupings that are re-used across multiple contexts within the AFT model."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; + + revision "2024-04-25" { + description + "Add backup-active to AFT NHG state."; + reference "2.6.0"; + } revision "2024-01-26" { description @@ -693,6 +699,20 @@ submodule openconfig-aft-common { entries within the next-hop group become unusable, the backup next-hop group is used if specified."; } + + leaf backup-active { + type boolean; + default false; + description + "Set to true if and only if the device no longer forwards traffic + using the primary NextHops of this NextHopGroup and instead uses + the specified backup-next-hop-group. This leaf should be set to + false if the backup-next-hop-group is either unspecified or unused + by the device."; + } + + + } grouping aft-nhg-nh-state { diff --git a/release/models/aft/openconfig-aft-ethernet.yang b/release/models/aft/openconfig-aft-ethernet.yang index 2845c9383..b2c0758df 100644 --- a/release/models/aft/openconfig-aft-ethernet.yang +++ b/release/models/aft/openconfig-aft-ethernet.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ethernet { "Submodule containing definitions of groupings for the abstract forwarding tables for Ethernet."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; + + revision "2024-04-25" { + description + "Add backup-active to AFT NHG state."; + reference "2.6.0"; + } revision "2024-01-26" { description diff --git a/release/models/aft/openconfig-aft-ipv4.yang b/release/models/aft/openconfig-aft-ipv4.yang index f6152aca8..d582b2ad7 100644 --- a/release/models/aft/openconfig-aft-ipv4.yang +++ b/release/models/aft/openconfig-aft-ipv4.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ipv4 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv4."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; + + revision "2024-04-25" { + description + "Add backup-active to AFT NHG state."; + reference "2.6.0"; + } revision "2024-01-26" { description diff --git a/release/models/aft/openconfig-aft-ipv6.yang b/release/models/aft/openconfig-aft-ipv6.yang index 1976a7271..c8aede635 100644 --- a/release/models/aft/openconfig-aft-ipv6.yang +++ b/release/models/aft/openconfig-aft-ipv6.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ipv6 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv6."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; + + revision "2024-04-25" { + description + "Add backup-active to AFT NHG state."; + reference "2.6.0"; + } revision "2024-01-26" { description diff --git a/release/models/aft/openconfig-aft-mpls.yang b/release/models/aft/openconfig-aft-mpls.yang index 77091afa4..2418a5a9e 100644 --- a/release/models/aft/openconfig-aft-mpls.yang +++ b/release/models/aft/openconfig-aft-mpls.yang @@ -21,20 +21,18 @@ submodule openconfig-aft-mpls { "Submodule containing definitions of groupings for the abstract forwarding table for MPLS label forwarding."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; - revision "2024-01-26" { + revision "2024-04-25" { description - "Add gre container under next-hops aft entry state. - Add src-ip, dst-ip and ttl under gre aft entry state - for telemetry."; - reference "2.5.0"; + "Add backup-active to AFT NHG state."; + reference "2.6.0"; } - revision "2023-09-26" { + revision "2024-04-25" { description - "Add next-hop-group-name in NHG AFT entry state."; - reference "2.4.0"; + "Add backup-active to AFT NHG state."; + reference "2.5.0"; } revision "2023-04-19" { diff --git a/release/models/aft/openconfig-aft-pf.yang b/release/models/aft/openconfig-aft-pf.yang index fc72ece6e..8f0d5a243 100644 --- a/release/models/aft/openconfig-aft-pf.yang +++ b/release/models/aft/openconfig-aft-pf.yang @@ -28,7 +28,13 @@ submodule openconfig-aft-pf { fields other than the destination address that is used in other forwarding tables."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; + + revision "2024-04-25" { + description + "Add backup-active to AFT NHG state."; + reference "2.6.0"; + } revision "2024-01-26" { description diff --git a/release/models/aft/openconfig-aft-state-synced.yang b/release/models/aft/openconfig-aft-state-synced.yang index 166ad7ead..3e0950826 100644 --- a/release/models/aft/openconfig-aft-state-synced.yang +++ b/release/models/aft/openconfig-aft-state-synced.yang @@ -16,7 +16,13 @@ submodule openconfig-aft-state-synced { "Submodule containing definitions of groupings for the state synced signals corresponding to various abstract forwarding tables."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; + + revision "2024-04-25" { + description + "Add backup-active to AFT NHG state."; + reference "2.6.0"; + } revision "2024-01-26" { description diff --git a/release/models/aft/openconfig-aft.yang b/release/models/aft/openconfig-aft.yang index 011956948..d1af3e977 100644 --- a/release/models/aft/openconfig-aft.yang +++ b/release/models/aft/openconfig-aft.yang @@ -42,7 +42,13 @@ module openconfig-aft { is referred to as an Abstract Forwarding Table (AFT), rather than the FIB."; - oc-ext:openconfig-version "2.5.0"; + oc-ext:openconfig-version "2.6.0"; + + revision "2024-04-25" { + description + "Add backup-active to AFT NHG state."; + reference "2.6.0"; + } revision "2024-01-26" { description From 94683fe27ad513b88b1d71f9e0430ac8a3fbbdd9 Mon Sep 17 00:00:00 2001 From: Eric Breverman Date: Thu, 8 Aug 2024 17:44:00 -0700 Subject: [PATCH 179/201] Attenuator mode - system controlled (#1147) * SYSTEM_CONTROLLED attenuator mode. --- .../openconfig-optical-attenuator.yang | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/release/models/optical-transport/openconfig-optical-attenuator.yang b/release/models/optical-transport/openconfig-optical-attenuator.yang index 94b3d71bf..cffe56a5a 100644 --- a/release/models/optical-transport/openconfig-optical-attenuator.yang +++ b/release/models/optical-transport/openconfig-optical-attenuator.yang @@ -24,7 +24,13 @@ module openconfig-optical-attenuator { for variable optical attenuators, deployed as part of a transport line system."; - oc-ext:openconfig-version "0.1.0"; + oc-ext:openconfig-version "0.2.0"; + + revision "2024-07-10" { + description + "Adding SYSTEM_CONTROLLED mode with accompanying leaves"; + reference "0.2.0"; + } revision "2019-07-19" { description @@ -62,6 +68,12 @@ module openconfig-optical-attenuator { "Constant attenuation mode"; } + identity SYSTEM_CONTROLLED { + base OPTICAL_ATTENUATOR_MODE; + description + "System controls the attenuation value."; + } + // grouping statements @@ -112,6 +124,28 @@ module openconfig-optical-attenuator { maintain constant output power. When false, the attenuator is set max attenuation or blocked."; } + + leaf max-output-power { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The max power level allowed on the output of attenuator. This leaf + is optional when in SYSTEM_CONTROLLED mode."; + } + + leaf max-output-power-threshold { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "If the system-derived-target-output-power is equal to or greater than + 'max-output-power + max-output-power-threshold', a device alarm will + be raised within /system/alarms. This leaf is only relevant when + in SYSTEM_CONTROLLED mode."; + } } grouping optical-attenuator-state { @@ -150,6 +184,15 @@ module openconfig-optical-attenuator { port. This leaf is only valid for ports of type EGRESS."; } + leaf system-derived-target-output-power { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The target output power as determined by the device. + This leaf is only relevant when in SYSTEM_CONTROLLED mode."; + } container actual-attenuation { description From 6e28490719bd8a3966ce9a78c82c3b7a5a249412 Mon Sep 17 00:00:00 2001 From: Nathan Kitchen Date: Fri, 9 Aug 2024 13:26:30 -0700 Subject: [PATCH 180/201] Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION. (#239) * Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION. * (M) release/models/ospf/openconfig-ospfv2-lsdb.yang --- .../models/ospf/openconfig-ospfv2-area-interface.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-area.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-common.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-global.yang | 8 +++++++- release/models/ospf/openconfig-ospfv2-lsdb.yang | 10 ++++++++-- release/models/ospf/openconfig-ospfv2.yang | 8 +++++++- 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/release/models/ospf/openconfig-ospfv2-area-interface.yang b/release/models/ospf/openconfig-ospfv2-area-interface.yang index 3045ad03c..7fa65cee0 100644 --- a/release/models/ospf/openconfig-ospfv2-area-interface.yang +++ b/release/models/ospf/openconfig-ospfv2-area-interface.yang @@ -25,7 +25,13 @@ submodule openconfig-ospfv2-area-interface { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.5.1"; + oc-ext:openconfig-version "0.5.2"; + + revision "2024-06-17" { + description + "Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION."; + reference "0.5.2"; + } revision "2023-11-01" { description diff --git a/release/models/ospf/openconfig-ospfv2-area.yang b/release/models/ospf/openconfig-ospfv2-area.yang index e0f0020f8..f65f58979 100644 --- a/release/models/ospf/openconfig-ospfv2-area.yang +++ b/release/models/ospf/openconfig-ospfv2-area.yang @@ -23,7 +23,13 @@ submodule openconfig-ospfv2-area { "This submodule provides OSPFv2 configuration and operational state parameters that are specific to the area context"; - oc-ext:openconfig-version "0.5.1"; + oc-ext:openconfig-version "0.5.2"; + + revision "2024-06-17" { + description + "Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION."; + reference "0.5.2"; + } revision "2023-11-01" { description diff --git a/release/models/ospf/openconfig-ospfv2-common.yang b/release/models/ospf/openconfig-ospfv2-common.yang index 8bfd890b4..34f9c3b23 100644 --- a/release/models/ospf/openconfig-ospfv2-common.yang +++ b/release/models/ospf/openconfig-ospfv2-common.yang @@ -17,7 +17,13 @@ submodule openconfig-ospfv2-common { "This submodule provides OSPFv2 configuration and operational state parameters that are shared across multiple contexts"; - oc-ext:openconfig-version "0.5.1"; + oc-ext:openconfig-version "0.5.2"; + + revision "2024-06-17" { + description + "Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION."; + reference "0.5.2"; + } revision "2023-11-01" { description diff --git a/release/models/ospf/openconfig-ospfv2-global.yang b/release/models/ospf/openconfig-ospfv2-global.yang index e6c0256ec..96504073c 100644 --- a/release/models/ospf/openconfig-ospfv2-global.yang +++ b/release/models/ospf/openconfig-ospfv2-global.yang @@ -23,7 +23,13 @@ submodule openconfig-ospfv2-global { "This submodule provides OSPFv2 configuration and operational state parameters that are global to a particular OSPF instance"; - oc-ext:openconfig-version "0.5.1"; + oc-ext:openconfig-version "0.5.2"; + + revision "2024-06-17" { + description + "Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION."; + reference "0.5.2"; + } revision "2023-11-01" { description diff --git a/release/models/ospf/openconfig-ospfv2-lsdb.yang b/release/models/ospf/openconfig-ospfv2-lsdb.yang index e1eda9fdd..113d31630 100644 --- a/release/models/ospf/openconfig-ospfv2-lsdb.yang +++ b/release/models/ospf/openconfig-ospfv2-lsdb.yang @@ -22,7 +22,13 @@ submodule openconfig-ospfv2-lsdb { "An OpenConfig model for the Open Shortest Path First (OSPF) version 2 link-state database (LSDB)"; - oc-ext:openconfig-version "0.5.1"; + oc-ext:openconfig-version "0.5.2"; + + revision "2024-06-17" { + description + "Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION."; + reference "0.5.2"; + } revision "2023-11-01" { description @@ -749,7 +755,7 @@ submodule openconfig-ospfv2-lsdb { } // grace LSA container router-information { - when "../state/type = 'oc-ospf-types:ROUTER_INFORMATION_LSA'" { + when "../state/type = 'oc-ospf-types:ROUTER_INFORMATION'" { description "Include the router-information container when the opaque LSA type is specified to be an RI LSA"; diff --git a/release/models/ospf/openconfig-ospfv2.yang b/release/models/ospf/openconfig-ospfv2.yang index fb5a7e031..f909bdd85 100644 --- a/release/models/ospf/openconfig-ospfv2.yang +++ b/release/models/ospf/openconfig-ospfv2.yang @@ -34,7 +34,13 @@ module openconfig-ospfv2 { "An OpenConfig model for Open Shortest Path First (OSPF) version 2"; - oc-ext:openconfig-version "0.5.1"; + oc-ext:openconfig-version "0.5.2"; + + revision "2024-06-17" { + description + "Correct ROUTER_INFORMATION_LSA to ROUTER_INFORMATION."; + reference "0.5.2"; + } revision "2023-11-01" { description From 147cfe8027cf80d86cab485fc05d735f2b00538c Mon Sep 17 00:00:00 2001 From: Likai Liu Date: Mon, 19 Aug 2024 17:02:18 -0400 Subject: [PATCH 181/201] Correction to loopback-mode-type FACILITY and TERMINAL #1135 (#1155) * Correction to loopback-mode-type FACILITY and TERMINAL #1135 --- .../openconfig-transport-types.yang | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/release/models/optical-transport/openconfig-transport-types.yang b/release/models/optical-transport/openconfig-transport-types.yang index b38fb1c2c..7c3c6a481 100644 --- a/release/models/optical-transport/openconfig-transport-types.yang +++ b/release/models/optical-transport/openconfig-transport-types.yang @@ -22,7 +22,14 @@ module openconfig-transport-types { "This module contains general type definitions and identities for optical transport models."; - oc-ext:openconfig-version "0.25.0"; + oc-ext:openconfig-version "1.0.0"; + + revision "2024-07-24" { + description + "Corrected description for FACILITY and TERMINAL loopback-mode-type + enums."; + reference "1.0.0"; + } revision "2024-06-28" { description @@ -221,19 +228,19 @@ module openconfig-transport-types { "No loopback is applied"; } enum FACILITY { - description - "A port internal loopback at ASIC level. The loopback directs - traffic normally transmitted on the port back to the device as - if received on the same port from an external source. Note this - mode is used when internal loopback does NOT specify MAC or PHY."; - } - enum TERMINAL { description "A port external loopback at ASIC level. The loopback which directs traffic received from an external source on the port back out the transmit side of the same port. Note this mode is used when external loopback does NOT specify MAC or PHY"; } + enum TERMINAL { + description + "A port internal loopback at ASIC level. The loopback directs + traffic normally transmitted on the port back to the device as + if received on the same port from an external source. Note this + mode is used when internal loopback does NOT specify MAC or PHY."; + } enum ASIC_PHY_LOCAL { description "A port internal loopback at PHY module. The loopback directs From 5c402a135033b6e07b925e66a73eeab47aa87f0c Mon Sep 17 00:00:00 2001 From: Jake Snyder Date: Wed, 21 Aug 2024 11:27:06 -0600 Subject: [PATCH 182/201] #1159 wifi mac transition modes (#1162) * fixing #1159 adding transition modes * Update version and revision history * fixed trailing whitespace --- release/models/wifi/openconfig-wifi-mac.yang | 41 +++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/release/models/wifi/openconfig-wifi-mac.yang b/release/models/wifi/openconfig-wifi-mac.yang index 3bb25cfc4..2280a5a42 100644 --- a/release/models/wifi/openconfig-wifi-mac.yang +++ b/release/models/wifi/openconfig-wifi-mac.yang @@ -26,7 +26,13 @@ module openconfig-wifi-mac { description "Model for managing MAC layer configuration of Radio interfaces."; - oc-ext:openconfig-version "1.3.1"; + oc-ext:openconfig-version "1.3.2"; + + revision "2024-08-07" { + description + "Add transition modes ENHANCED_OPEN_TRANSITION, WPA3_2_SAE_TRANSITION and + WPA3_2_ENTERPRISE_TRANSITION"; + } revision "2023-05-26" { description @@ -253,15 +259,30 @@ module openconfig-wifi-mac { description "Open authentication with Opportunistic Wireless Encryption."; } + enum ENHANCED_OPEN_TRANSITION { + description + "Open authentication with Opportunistic Wireless Encryption and + support for transition mode."; + } enum WPA3_SAE { description "WPA3-SAE using Simultaneous Authentication of Equals (SAE)."; } + enum WPA3_2_SAE_TRANSITION { + description + "WPA3-SAE using Simultaneous Authentication of Equals (SAE) and + WPA2-PSK AKMs."; + } enum WPA3_ENTERPRISE { description "WPA3-Enterprise with 802.1X SHA-256 authentication key management."; } + enum WPA3_2_ENTERPRISE_TRANSITION { + description + "WPA3-Enterprise with 802.1X SHA-256 authentication key + management."; + } enum WPA3_ENTERPRISE_192_BIT { description "WPA3-Enterprise with 802.1X SHA-384 authentication key @@ -284,7 +305,8 @@ module openconfig-wifi-mac { } leaf wpa3-psk { - when "../opmode = 'WPA3_SAE'"; + when "../opmode = 'WPA3_SAE' or + ../opemode = 'WPA3_2_SAE_TRANSITION"; type string { length "8..63"; } @@ -296,8 +318,10 @@ module openconfig-wifi-mac { when "../opmode = 'WPA2_ENTERPRISE' or ../opmode = 'WPA2_PERSONAL' or ../opmode = 'WPA3_ENTERPRISE' or + ../opmode = 'WPA3_2_ENTERPRISE_TRANSITION ../opmode = 'WPA3_ENTERPRISE_192_BIT' or - ../opmode = 'WPA3_SAE'"; + ../opmode = 'WPA3_SAE' or + ../opmode = 'WPA3_2_SAE_TRANSITION'"; type string; description "Specifies the RADIUS server-group to be used, @@ -367,9 +391,14 @@ module openconfig-wifi-mac { } leaf mfp { - when "../opmode = 'WPA3_ENTERPRISE' or ../opmode = - 'WPA3_ENTERPRISE_192_BIT' or ../opmode = - 'WPA3_SAE' or ../opmode = 'ENHANCED_OPEN'"; + when "../opmode = 'WPA3_ENTERPRISE' or + ../opmode = 'WPA3_2_ENTERPRISE_TRANSITION + ../opmode = 'WPA3_ENTERPRISE_192_BIT' or + ../opmode = 'WPA3_SAE' or + ../opmode = 'WPA3_2_SAE_TRANSITION + ../opmode = 'ENHANCED_OPEN' + ../opmode = 'ENHANCED_OPEN_TRANSITION + "; type boolean; mandatory true; description From bdf3c7d725d75355317f75e02d34a49f2bf9c328 Mon Sep 17 00:00:00 2001 From: "Missae W. Sasaya" Date: Thu, 22 Aug 2024 15:40:19 -0300 Subject: [PATCH 183/201] Fix XPath syntax error caught by pyang in openconfig-wifi-mac.yang (#1169) * Fix XPath syntax caught by pyang: ./wifi/openconfig-wifi-mac.yang:309: error: XPath syntax error: syntax error ./wifi/openconfig-wifi-mac.yang:324: error: XPath syntax error: syntax error ./wifi/openconfig-wifi-mac.yang:401: error: XPath syntax error: syntax error * Fix revision statements --- release/models/wifi/openconfig-wifi-mac.yang | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/release/models/wifi/openconfig-wifi-mac.yang b/release/models/wifi/openconfig-wifi-mac.yang index 2280a5a42..b9c85f634 100644 --- a/release/models/wifi/openconfig-wifi-mac.yang +++ b/release/models/wifi/openconfig-wifi-mac.yang @@ -26,12 +26,18 @@ module openconfig-wifi-mac { description "Model for managing MAC layer configuration of Radio interfaces."; - oc-ext:openconfig-version "1.3.2"; + oc-ext:openconfig-version "1.3.3"; + + revision "2024-08-22" { + description "Fix XPath expression to avoid pyang error"; + reference "1.3.3"; + } revision "2024-08-07" { description "Add transition modes ENHANCED_OPEN_TRANSITION, WPA3_2_SAE_TRANSITION and WPA3_2_ENTERPRISE_TRANSITION"; + reference "1.3.2"; } revision "2023-05-26" { @@ -306,7 +312,7 @@ module openconfig-wifi-mac { leaf wpa3-psk { when "../opmode = 'WPA3_SAE' or - ../opemode = 'WPA3_2_SAE_TRANSITION"; + ../opmode = 'WPA3_2_SAE_TRANSITION'"; type string { length "8..63"; } @@ -318,7 +324,7 @@ module openconfig-wifi-mac { when "../opmode = 'WPA2_ENTERPRISE' or ../opmode = 'WPA2_PERSONAL' or ../opmode = 'WPA3_ENTERPRISE' or - ../opmode = 'WPA3_2_ENTERPRISE_TRANSITION + ../opmode = 'WPA3_2_ENTERPRISE_TRANSITION' or ../opmode = 'WPA3_ENTERPRISE_192_BIT' or ../opmode = 'WPA3_SAE' or ../opmode = 'WPA3_2_SAE_TRANSITION'"; @@ -392,12 +398,12 @@ module openconfig-wifi-mac { leaf mfp { when "../opmode = 'WPA3_ENTERPRISE' or - ../opmode = 'WPA3_2_ENTERPRISE_TRANSITION + ../opmode = 'WPA3_2_ENTERPRISE_TRANSITION' or ../opmode = 'WPA3_ENTERPRISE_192_BIT' or ../opmode = 'WPA3_SAE' or - ../opmode = 'WPA3_2_SAE_TRANSITION - ../opmode = 'ENHANCED_OPEN' - ../opmode = 'ENHANCED_OPEN_TRANSITION + ../opmode = 'WPA3_2_SAE_TRANSITION' or + ../opmode = 'ENHANCED_OPEN' or + ../opmode = 'ENHANCED_OPEN_TRANSITION' "; type boolean; mandatory true; From b492f6746dd957fc0e14bdfa408a584af991aeda Mon Sep 17 00:00:00 2001 From: Shashank-arista <153792517+Shashank-arista@users.noreply.github.com> Date: Tue, 27 Aug 2024 02:42:42 +0530 Subject: [PATCH 184/201] Augment mpls static model to support ECMP of next hops (#1138) Co-authored-by: Darren Loher --- release/models/mpls/openconfig-mpls-igp.yang | 11 +- .../models/mpls/openconfig-mpls-static.yang | 123 ++++++++++++++++-- release/models/mpls/openconfig-mpls-te.yang | 11 +- release/models/mpls/openconfig-mpls.yang | 11 +- 4 files changed, 144 insertions(+), 12 deletions(-) diff --git a/release/models/mpls/openconfig-mpls-igp.yang b/release/models/mpls/openconfig-mpls-igp.yang index 6bbbf1cd8..c88eb0807 100644 --- a/release/models/mpls/openconfig-mpls-igp.yang +++ b/release/models/mpls/openconfig-mpls-igp.yang @@ -21,7 +21,16 @@ submodule openconfig-mpls-igp { "Configuration generic configuration parameters for IGP-congruent LSPs"; - oc-ext:openconfig-version "3.5.0"; + oc-ext:openconfig-version "3.6.0"; + + revision "2024-06-19" { + description + "Added support with backward compatibility to configure ECMP + of next-hops for the same LSP name. Also marked attributes + push-label, next-hop and interface as deprecated under egress, + transit and ingress config"; + reference "3.6.0"; + } revision "2023-12-14" { description diff --git a/release/models/mpls/openconfig-mpls-static.yang b/release/models/mpls/openconfig-mpls-static.yang index d114fe16c..a8e7c2faf 100644 --- a/release/models/mpls/openconfig-mpls-static.yang +++ b/release/models/mpls/openconfig-mpls-static.yang @@ -24,7 +24,16 @@ submodule openconfig-mpls-static { "Defines static LSP configuration"; - oc-ext:openconfig-version "3.5.0"; + oc-ext:openconfig-version "3.6.0"; + + revision "2024-06-19" { + description + "Added support with backward compatibility to configure ECMP + of next-hops for the same LSP name. Also marked attributes + push-label, next-hop and interface as deprecated under egress, + transit and ingress config"; + reference "3.6.0"; + } revision "2023-12-14" { description @@ -156,36 +165,126 @@ submodule openconfig-mpls-static { // grouping statements - grouping static-lsp-common-config { + grouping static-lsp-nexthop-index { description - "common definitions for static LSPs"; + "Next hop index definition for static LSPs"; - leaf next-hop { + leaf index { + type uint32; + description + "An user-specified identifier utilised to uniquely reference + the next-hop entry in the next-hop list. The value of this + index has no semantic meaning other than for referencing + the entry."; + } + } + + grouping static-lsp-nexthop-common-config { + description + "Common definition of next hop configuration for static LSPs"; + + leaf ip-address { type inet:ip-address; description - "next hop IP address for the LSP"; + "Next hop IP address for the LSP"; + } + + leaf push-label { + type oc-mplst:mpls-label; + description + "Label value to push at the current hop for the + LSP"; } + // interface-ref + uses oc-if:interface-ref-common; + } + + grouping static-lsp-common-config { + description + "Common definitions for static LSPs"; + leaf incoming-label { type oc-mplst:mpls-label; description - "label value on the incoming packet"; + "Label value on the incoming packet"; + } + + leaf next-hop { + type inet:ip-address; + status deprecated; + description + "Next hop IP address for the LSP"; } leaf push-label { type oc-mplst:mpls-label; + status deprecated; description - "label value to push at the current hop for the + "Label value to push at the current hop for the LSP"; } // interface-ref - uses oc-if:interface-ref-common; + uses oc-if:interface-ref-common { + status deprecated; + } leaf metric { type uint8; description - "Specifies metric value used for the MPLS route"; + "Specifies metric value used for the MPLS route."; + } + } + + grouping static-lsp-nexthops-common { + description + "MPLS Static LSP next-hops configuration"; + + container lsp-next-hops { + description + "Configuration and state parameters relating to the + next-hops that are to be utilised for the MPLS static + route being specified"; + + list lsp-next-hop { + key "index"; + + description + "A list of next-hops to be utilised for the MPLS + static route being specified."; + + leaf index { + type leafref { + path "../config/index"; + } + description + "A reference to the index of the current next-hop. + The index is intended to be a user-specified value + which can be used to reference the next-hop in + question, without any other semantics being + assigned to it."; + } + + container config { + description + "Configuration parameters relating to the next-hop + entry"; + + uses static-lsp-nexthop-index; + uses static-lsp-nexthop-common-config; + } + + container state { + config false; + description + "Operational state parameters relating to the + next-hop entry"; + + uses static-lsp-nexthop-index; + uses static-lsp-nexthop-common-config; + } + } } } @@ -227,6 +326,8 @@ submodule openconfig-mpls-static { uses static-lsp-ingress-config; uses static-lsp-ingress-state; } + + uses static-lsp-nexthops-common; } } @@ -268,6 +369,8 @@ submodule openconfig-mpls-static { uses static-lsp-transit-config; uses static-lsp-transit-state; } + + uses static-lsp-nexthops-common; } } @@ -309,6 +412,8 @@ submodule openconfig-mpls-static { uses static-lsp-egress-config; uses static-lsp-egress-state; } + + uses static-lsp-nexthops-common; } } diff --git a/release/models/mpls/openconfig-mpls-te.yang b/release/models/mpls/openconfig-mpls-te.yang index 4b12dc66e..647325357 100644 --- a/release/models/mpls/openconfig-mpls-te.yang +++ b/release/models/mpls/openconfig-mpls-te.yang @@ -30,7 +30,16 @@ submodule openconfig-mpls-te { signaling protocol or mechanism (see related submodules for signaling protocol-specific configuration)."; - oc-ext:openconfig-version "3.5.0"; + oc-ext:openconfig-version "3.6.0"; + + revision "2024-06-19" { + description + "Added support with backward compatibility to configure ECMP + of next-hops for the same LSP name. Also marked attributes + push-label, next-hop and interface as deprecated under egress, + transit and ingress config"; + reference "3.6.0"; + } revision "2023-12-14" { description diff --git a/release/models/mpls/openconfig-mpls.yang b/release/models/mpls/openconfig-mpls.yang index f78e1a0ec..693d67e4c 100644 --- a/release/models/mpls/openconfig-mpls.yang +++ b/release/models/mpls/openconfig-mpls.yang @@ -70,7 +70,16 @@ module openconfig-mpls { +------+ |ROUTING| +-----+ +-------+ "; - oc-ext:openconfig-version "3.5.0"; + oc-ext:openconfig-version "3.6.0"; + + revision "2024-06-19" { + description + "Added support with backward compatibility to configure ECMP + of next-hops for the same LSP name. Also marked attributes + push-label, next-hop and interface as deprecated under egress, + transit and ingress config"; + reference "3.6.0"; + } revision "2023-12-14" { description From abba9293800de056022d333d9c79dd43c5be9c56 Mon Sep 17 00:00:00 2001 From: tengyiG <108433002+tengyiG@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:32:47 -0700 Subject: [PATCH 185/201] Update openconfig-keychain-types.yang (#1173) --- .../keychain/openconfig-keychain-types.yang | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/release/models/keychain/openconfig-keychain-types.yang b/release/models/keychain/openconfig-keychain-types.yang index d84b1f54c..c923f9ea1 100644 --- a/release/models/keychain/openconfig-keychain-types.yang +++ b/release/models/keychain/openconfig-keychain-types.yang @@ -21,7 +21,13 @@ module openconfig-keychain-types { "This module contains general data definitions for use in keychain-based authentication."; - oc-ext:openconfig-version "0.2.0"; + oc-ext:openconfig-version "0.3.0"; + + revision "2024-08-27" { + description + "Added AES_128_CMAC and AES_256_CMAC"; + reference "0.3.0"; + } revision "2022-03-01" { description @@ -137,4 +143,22 @@ module openconfig-keychain-types { reference "RFC 4494 - The AES-CMAC-96 Algorithm and Its Use with IPsec"; } + + identity AES_128_CMAC { + base CRYPTO_TYPE; + description + "AES-128-CMAC keyed hash function based on a AES-128 block + cipher."; + reference + "RFC 4493 - The AES-CMAC Algorithm and Its Use with IPsec"; + } + + identity AES_256_CMAC { + base CRYPTO_TYPE; + description + "AES-256-CMAC keyed hash function based on a AES-256 block + cipher."; + reference + "RFC 4493 - The AES-CMAC Algorithm and Its Use with IPsec"; + } } From b9845f14fa4c2f6f6c4975dcf9f264f94bc910ae Mon Sep 17 00:00:00 2001 From: Aaron Bamberger Date: Wed, 28 Aug 2024 18:34:04 -0500 Subject: [PATCH 186/201] Updates to network-instance EVPN models for VLAN-aware-bundle support (#1124) * Add a new conditional leaf-lest, "vni-list", to the EVI Vxlan model, to allow the configuration of VLAN-aware-bundle MACVRFs * Make the existing "vni" leaf conditional on the MACVRF being a VLAN-based MACVRF. Since this is the only type of MACVRF currently supported by the model, this is a backwards compatible change Co-authored-by: Darren Loher --- .../network-instance/openconfig-evpn.yang | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/release/models/network-instance/openconfig-evpn.yang b/release/models/network-instance/openconfig-evpn.yang index b9870e461..ab110a894 100644 --- a/release/models/network-instance/openconfig-evpn.yang +++ b/release/models/network-instance/openconfig-evpn.yang @@ -40,7 +40,14 @@ module openconfig-evpn { domains, this is not currently supported and requires an extension of the model."; - oc-ext:openconfig-version "0.9.0"; + oc-ext:openconfig-version "0.10.0"; + + revision "2024-06-07" { + description + "Add new vni-list leaf list to EVI config to support VLAN-aware-bundle + MACVRFs. Make existing vni leaf conditional on MACVRF type being VLAN-based"; + reference "0.10.0"; + } revision "2024-05-14" { description @@ -676,12 +683,27 @@ module openconfig-evpn { Using Ethernet VPN"; leaf vni { + when "../../../config/service-type = 'oc-evpn-types:VLAN_BASED' or + ../../../config/service-type = 'oc-evpn-types:VLAN_BUNDLE'" { + description + "For VLAN-based and VLAN-bundle EVIs, use a single VNI"; + } type oc-evpn-types:vni-id; description "Virtual Network Identifier (VNI) associated to the EVI. This VNI is used for ingress and egress in the VXLAN domain."; } + leaf-list vni-list { + when "../../../config/service-type = 'oc-evpn-types:VLAN_AWARE'" { + description + "For VLAN-aware-bundle EVIs, use a list of VNIs"; + } + type oc-evpn-types:vni-id; + description + "List of VNIs participating in a VLAN-aware-bundle EVI"; + } + leaf overlay-endpoint-network-instance { type leafref { path "/network-instances/network-instance/name"; From 6b19efbb170259b6fda5e1faa43188cb8a98337c Mon Sep 17 00:00:00 2001 From: Aaron Bamberger Date: Wed, 28 Aug 2024 20:48:44 -0500 Subject: [PATCH 187/201] Updates to network instance models for VLAN-VNI and VRF-VNI mappings (#1125) * Introduce new container "local-endpoint-vnis" in Vxlan endpoint model to allow the local configuration of VLAN-to-VNI and VRF-to-VNI mappings --- .../network-instance/openconfig-evpn.yang | 117 ++++++++++++------ 1 file changed, 81 insertions(+), 36 deletions(-) diff --git a/release/models/network-instance/openconfig-evpn.yang b/release/models/network-instance/openconfig-evpn.yang index ab110a894..a3fd800e3 100644 --- a/release/models/network-instance/openconfig-evpn.yang +++ b/release/models/network-instance/openconfig-evpn.yang @@ -40,7 +40,14 @@ module openconfig-evpn { domains, this is not currently supported and requires an extension of the model."; - oc-ext:openconfig-version "0.10.0"; + oc-ext:openconfig-version "0.11.0"; + + revision "2024-08-14" { + description + "Add new local-endpoint-vnis config container to Vxlan connection point to allow + configuration of local VNI-to-VLAN and VNI-to-VRF maps"; + reference "0.11.0"; + } revision "2024-06-07" { description @@ -1046,6 +1053,7 @@ module openconfig-evpn { config false; description "Container for state parameters related to this L2VNI or L3VNI"; + uses evpn-endpoint-vni-config; uses evpn-endpoint-vni-state; } @@ -1053,6 +1061,39 @@ module openconfig-evpn { uses ipv6-top; } } + + container local-endpoint-vnis { + description + "Top level container for local configuration related to Layer 2 virtual + network identifiers (L2VNIs) and Layer 3 virtual network identifiers + (L3VNIs) in the default network instance"; + + list local-endpoint-vni { + key "vni"; + description "List of L2VNIs and L3VNIs configured on the local VTEP"; + + leaf vni { + type leafref { + path '../config/vni'; + } + description "L2VNI or L3VNI Identifier"; + } + + container config { + description + "Container for configuration parameters related to this local L2VNI or + L3VNI"; + uses evpn-endpoint-vni-config; + } + + container state { + config false; + description + "Container for state parameters related to this local L2VNI or L3VNI"; + uses evpn-endpoint-vni-config; + } + } + } } grouping evpn-endpoint-peer-state { @@ -1197,16 +1238,52 @@ module openconfig-evpn { } } - grouping evpn-endpoint-vni-state { + grouping evpn-endpoint-vni-config { description - "Grouping for L2VNI and L3VNI state information learned on the - local VXLAN Tunnel End Point from remote VTEPs"; + "Grouping for L2VNI and L3VNI configuration parameters"; leaf vni { type oc-evpn-types:evi-id; description "L2VNI or L3VNI Identifier"; } + leaf vni-type { + type enumeration { + enum L2 { + description + "This is a Layer 2 service virtual network identifier (L2VNI) + that is used for communication within the same subnet or + broadcast domain"; + } + enum L3 { + description + "This is a Layer 3 service virtual network identifier (L3VNI) + or VRF VNI that is used for communication between subnets"; + } + } + description "The type of virtual network identfier"; + } + + leaf bridge-domain { + type uint32; + description + "This reflects the configured VLAN or Bridge Domain that maps to this + L2VNI in the VXLAN fabric"; + } + + leaf l3-vrf-name { + type string; + description + "This refects the configured VRF instance that maps to this L3VNI + that is used for routing between subnets in the VXLAN fabric"; + } + } + + grouping evpn-endpoint-vni-state { + description + "Grouping for L2VNI and L3VNI state information learned on the + local VXLAN Tunnel End Point from remote VTEPs"; + leaf multidestination-traffic { type union { type oc-inet:ip-address; @@ -1240,23 +1317,6 @@ module openconfig-evpn { control-plane or data-plane"; } - leaf vni-type { - type enumeration { - enum L2 { - description - "This is a Layer 2 service virtual network identifier (L2VNI) - that is used for communication within the same subnet or - broadcast domain"; - } - enum L3 { - description - "This is a Layer 3 service virtual network identifier (L3VNI) - or VRF VNI that is used for communication between subnets"; - } - } - description "The type of virtual network identfier"; - } - leaf vni-state { type enumeration { enum UP { @@ -1290,20 +1350,5 @@ module openconfig-evpn { "Operational status of the SVI mapped to the L3VNI that is used for routing between subnets in the VXLAN fabric"; } - - leaf bridge-domain { - type uint32; - description - "This reflects the configured VLAN or Bridge Domain that maps to this - L2VNI in the VXLAN fabric"; - } - - leaf l3-vrf-name { - type string; - description - "This refects the configured VRF instance that maps to this L3VNI - that is used for routing between subnets in the VXLAN fabric"; - } - } } From 2c81874b3199f35a0e34b90bef91a74308e0b29b Mon Sep 17 00:00:00 2001 From: Alex Webster <31635844+awebsters@users.noreply.github.com> Date: Tue, 10 Sep 2024 19:49:00 -0400 Subject: [PATCH 188/201] Ntp auth types (#1163) * adding additional auth key types --- release/models/system/openconfig-system.yang | 44 +++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/release/models/system/openconfig-system.yang b/release/models/system/openconfig-system.yang index 3352fd221..8534a909f 100644 --- a/release/models/system/openconfig-system.yang +++ b/release/models/system/openconfig-system.yang @@ -47,7 +47,13 @@ module openconfig-system { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "2.1.0"; + oc-ext:openconfig-version "2.2.0"; + + revision "2024-08-13" { + description + "Added additional auth key types"; + reference "2.2.0"; + } revision "2024-07-15" { description @@ -233,6 +239,42 @@ module openconfig-system { "MD5 encryption method"; } + identity NTP_AUTH_SHA1 { + base NTP_AUTH_TYPE; + description + "SHA1 encryption method"; + } + + identity NTP_AUTH_SHA256 { + base NTP_AUTH_TYPE; + description + "SHA256 encryption method"; + } + + identity NTP_AUTH_SHA384 { + base NTP_AUTH_TYPE; + description + "SHA384 encryption method"; + } + + identity NTP_AUTH_SHA512 { + base NTP_AUTH_TYPE; + description + "SHA512 encryption method"; + } + + identity NTP_AUTH_AES_CBC_128 { + base NTP_AUTH_TYPE; + description + "AES-CBC-128 encryption method"; + } + + identity NTP_AUTH_AES_CBC_256 { + base NTP_AUTH_TYPE; + description + "AES-CBC-256 encryption method"; + } + // typedef statements typedef timezone-name-type { From 2e49acd23578e9b6ee38da085a09bb13cc36ca04 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Thu, 12 Sep 2024 10:25:31 -0700 Subject: [PATCH 189/201] Add syslog TLS (#1166) * Add syslog over TLS --- .../system/openconfig-system-logging.yang | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/release/models/system/openconfig-system-logging.yang b/release/models/system/openconfig-system-logging.yang index f845547cb..c7eaae8a5 100644 --- a/release/models/system/openconfig-system-logging.yang +++ b/release/models/system/openconfig-system-logging.yang @@ -23,7 +23,13 @@ module openconfig-system-logging { "This module defines configuration and operational state data for common logging facilities on network systems."; - oc-ext:openconfig-version "0.6.0"; + oc-ext:openconfig-version "0.7.0"; + +revision "2024-08-20" { + description + "Adding tls support for syslog."; + reference "0.7.0"; + } revision "2023-07-20" { description @@ -429,6 +435,22 @@ revision "2023-07-20" { "Sets the destination port number for syslog UDP messages to the server. The default for syslog is 514."; } + + leaf transport-security { + type boolean; + description + "Indicates if syslog transport layer security (TLS) is enabled."; + } + + leaf tls-profile-id { + type string; + description + "The ID of this syslog client's TLS profile. TLS profiles are managed + using the gNSI Certz service or other certificate management service + provided by the system."; + reference + "https://github.com/openconfig/gnsi/tree/main/certz"; + } } grouping logging-remote-state { From 27eabe3b8e8a59c97da1e3af2dbc219fdd7e17c4 Mon Sep 17 00:00:00 2001 From: SydneyCaulfeild <47483016+SydneyCaulfeild@users.noreply.github.com> Date: Fri, 13 Sep 2024 13:41:58 -0400 Subject: [PATCH 190/201] Update description of the model-name leaf. (#1160) * Indicate model-name is mandatory if component is removable or oc-platform-type:CHASSIS --- .../platform/openconfig-platform-common.yang | 8 +++++++- release/models/platform/openconfig-platform.yang | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/release/models/platform/openconfig-platform-common.yang b/release/models/platform/openconfig-platform-common.yang index 04f58b3ac..da46ed60b 100644 --- a/release/models/platform/openconfig-platform-common.yang +++ b/release/models/platform/openconfig-platform-common.yang @@ -20,7 +20,13 @@ submodule openconfig-platform-common { "This modules contains common groupings that are used in multiple components within the platform module."; - oc-ext:openconfig-version "0.27.0"; + oc-ext:openconfig-version "0.28.0"; + + revision "2024-08-08" { + description + "Update description of model-name leaf."; + reference "0.28.0"; + } revision "2024-05-29" { description diff --git a/release/models/platform/openconfig-platform.yang b/release/models/platform/openconfig-platform.yang index 89ebb559b..3ddb6cef4 100644 --- a/release/models/platform/openconfig-platform.yang +++ b/release/models/platform/openconfig-platform.yang @@ -65,7 +65,13 @@ module openconfig-platform { (presence or absence of a component) and state (physical attributes or status)."; - oc-ext:openconfig-version "0.27.0"; + oc-ext:openconfig-version "0.28.0"; + + revision "2024-08-08" { + description + "Update description of model-name leaf."; + reference "0.28.0"; + } revision "2024-05-29" { description @@ -540,11 +546,13 @@ module openconfig-platform { } leaf model-name { + when "../removable = 'true' or ../type = 'oc-platform-types:CHASSIS'"; + mandatory true; type string; description - "A human readable string describing the model of a component. - This string is optional and should only be populated if part-no - is also populated."; + "Model name that would be found in a catalog of stock keeping + units (SKU) and should be the orderable name of the + component."; } leaf clei-code { From 21fa1c99bf4148806c7b8c9daee54beaaece4f68 Mon Sep 17 00:00:00 2001 From: Ebben Aries Date: Fri, 13 Sep 2024 12:34:57 -0600 Subject: [PATCH 191/201] Deprecate /components/component/state/id leaf (#1107) * (M) release/models/platform/openconfig-platform.yang * (M) release/models/platform/openconfig-platform-common.yang - Deprecation of undefined/duplicate 'id' leaf --- release/models/platform/openconfig-platform-common.yang | 8 +++++++- release/models/platform/openconfig-platform.yang | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/release/models/platform/openconfig-platform-common.yang b/release/models/platform/openconfig-platform-common.yang index da46ed60b..79514ea73 100644 --- a/release/models/platform/openconfig-platform-common.yang +++ b/release/models/platform/openconfig-platform-common.yang @@ -20,7 +20,13 @@ submodule openconfig-platform-common { "This modules contains common groupings that are used in multiple components within the platform module."; - oc-ext:openconfig-version "0.28.0"; + oc-ext:openconfig-version "0.29.0"; + + revision "2024-10-13" { + description + "Deprecate component id leaf"; + reference "0.29.0"; + } revision "2024-08-08" { description diff --git a/release/models/platform/openconfig-platform.yang b/release/models/platform/openconfig-platform.yang index 3ddb6cef4..3850f2e78 100644 --- a/release/models/platform/openconfig-platform.yang +++ b/release/models/platform/openconfig-platform.yang @@ -65,7 +65,13 @@ module openconfig-platform { (presence or absence of a component) and state (physical attributes or status)."; - oc-ext:openconfig-version "0.28.0"; + oc-ext:openconfig-version "0.29.0"; + + revision "2024-10-13" { + description + "Deprecate component id leaf"; + reference "0.29.0"; + } revision "2024-08-08" { description @@ -423,6 +429,7 @@ module openconfig-platform { leaf id { type string; + status deprecated; description "Unique identifier assigned by the system for the component"; From bab19fd0acb5bd97aadca872d213f22ccc715b07 Mon Sep 17 00:00:00 2001 From: sallylsy <108024270+sallylsy@users.noreply.github.com> Date: Fri, 13 Sep 2024 13:32:26 -0700 Subject: [PATCH 192/201] Add fallback leaf for LACP in OC model (#1176) * Add fallback leaf for LACP in OC model --- release/models/lacp/openconfig-lacp.yang | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/release/models/lacp/openconfig-lacp.yang b/release/models/lacp/openconfig-lacp.yang index 832a6a178..f69f15f71 100644 --- a/release/models/lacp/openconfig-lacp.yang +++ b/release/models/lacp/openconfig-lacp.yang @@ -26,7 +26,13 @@ module openconfig-lacp { managing aggregate interfaces. It works in conjunction with the OpenConfig interfaces and aggregate interfaces models."; - oc-ext:openconfig-version "2.0.0"; + oc-ext:openconfig-version "2.1.0"; + + revision "2024-09-24" { + description + "Add LACP fallback leaf under both config and state."; + reference "2.1.0"; + } revision "2023-12-11" { description @@ -407,6 +413,15 @@ grouping aggregation-lacp-members-statistics { system-id"; } + leaf fallback { + type boolean; + description + "If the fallback is set to true, current LACP interface is + able to establish a Link Aggregation (LAG) before it receives + LACP PDUs from its peer, and fallback to a single port active + after the expiry of the timeout period."; + } + uses aggregation-lacp-global-config; } From 9b0a82ee10b6a598d124250f4df51a927c5916a9 Mon Sep 17 00:00:00 2001 From: Ryan Shea <115602+sourcequench@users.noreply.github.com> Date: Fri, 13 Sep 2024 16:34:00 -0400 Subject: [PATCH 193/201] Adding glome key version and console state. (#1178) * Adding GLOME capabilities to gnsi credentialz. --- .../gnsi/openconfig-gnsi-credentialz.yang | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/release/models/gnsi/openconfig-gnsi-credentialz.yang b/release/models/gnsi/openconfig-gnsi-credentialz.yang index 0e4392a7a..cf611fd9c 100644 --- a/release/models/gnsi/openconfig-gnsi-credentialz.yang +++ b/release/models/gnsi/openconfig-gnsi-credentialz.yang @@ -39,7 +39,13 @@ module openconfig-gnsi-credentialz { /system/aaa/authentication/users/user/config/password-hashed /system/aaa/authentication/users/user/state/password-hashed"; - oc-ext:openconfig-version "0.6.0"; + oc-ext:openconfig-version "0.7.0"; + + revision 2024-09-10 { + description + "Adding GLOME capabilities."; + reference "0.7.0"; + } revision 2024-02-13 { description @@ -142,6 +148,26 @@ module openconfig-gnsi-credentialz { } } + // GLOME related definitions. + + grouping glome-key-version { + description + "Version identifier for the configured GLOME key."; + + leaf active-glome-key-version { + type version; + description + "The version of the GLOME key."; + } + + leaf active-glome-key-created-on { + type created-on; + description + "The timestamp of the moment when the GLOME key + was created."; + } + } + // Success/failure counters. grouping counters { description @@ -232,9 +258,16 @@ module openconfig-gnsi-credentialz { "Console-related state."; uses counters; + + leaf enabled { + type boolean; + description + "Whether GLOME is enabled or not."; + } } } } + // System role console related definitions. grouping user-console-credentials-version { From 16df0a6c331f6d22f101821ce943c90c14de819b Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 24 Sep 2024 10:26:50 -0700 Subject: [PATCH 194/201] Fix typo in AES_128_CMAC_96 Keychain identify (#1172) * Fix typo in AES_128_CMAC_96 Keychain identify --- .../keychain/openconfig-keychain-types.yang | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/release/models/keychain/openconfig-keychain-types.yang b/release/models/keychain/openconfig-keychain-types.yang index c923f9ea1..3a49c6857 100644 --- a/release/models/keychain/openconfig-keychain-types.yang +++ b/release/models/keychain/openconfig-keychain-types.yang @@ -21,7 +21,13 @@ module openconfig-keychain-types { "This module contains general data definitions for use in keychain-based authentication."; - oc-ext:openconfig-version "0.3.0"; + oc-ext:openconfig-version "0.3.1"; + + revision "2024-08-27" { + description + "fix typo on AES_128_CMAC"; + reference "0.3.1"; + } revision "2024-08-27" { description @@ -29,6 +35,12 @@ module openconfig-keychain-types { reference "0.3.0"; } + revision "2024-08-27" { + description + "Fix typo in identity AES_128_CMAC_96"; + reference "0.2.1"; + } + revision "2022-03-01" { description "Remove NONE identity from AUTH_TYPE"; @@ -135,7 +147,7 @@ module openconfig-keychain-types { HMAC and HKDF)"; } - identity AES_28_CMAC_96 { + identity AES_128_CMAC_96 { base CRYPTO_TYPE; description "AES-128-CMAC-96 keyed hash function based on a AES-128 block From 03f1c1fe582aeabbae67e80f74e099507a3e2343 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 24 Sep 2024 12:02:34 -0700 Subject: [PATCH 195/201] Add mount-point type (#1168) * add mount-point type --- release/models/system/openconfig-system.yang | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/release/models/system/openconfig-system.yang b/release/models/system/openconfig-system.yang index 8534a909f..a7eb1be7f 100644 --- a/release/models/system/openconfig-system.yang +++ b/release/models/system/openconfig-system.yang @@ -47,7 +47,13 @@ module openconfig-system { Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info)."; - oc-ext:openconfig-version "2.2.0"; + oc-ext:openconfig-version "2.3.0"; + + revision "2024-09-24" { + description + "Added mount-point type leaf to describe the type of file system."; + reference "2.3.0"; + } revision "2024-08-13" { description @@ -420,6 +426,14 @@ module openconfig-system { description "The amount of space currently in use on the filesystem."; } + + leaf type { + type string; + description + "A human readable string indicating the filesystem type used + for storage. Examples might include flash, hard disk, tmpfs/ramdisk + or remote/network based storage."; + } } grouping system-global-state { From 960cfd9366d78c8ab61facf2655dfc3e7f4169f1 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 24 Sep 2024 12:14:21 -0700 Subject: [PATCH 196/201] Add storage counters related to errors (#1091) Add /components/component/storage/state/counters/ as a container to represent storage device counters --- release/models/platform/.spec.yml | 2 + .../platform/openconfig-platform-common.yang | 8 +- .../platform/openconfig-platform-storage.yang | 164 ++++++++++++++++++ .../models/platform/openconfig-platform.yang | 14 +- 4 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 release/models/platform/openconfig-platform-storage.yang diff --git a/release/models/platform/.spec.yml b/release/models/platform/.spec.yml index 59ffb1c76..8dfd9472c 100644 --- a/release/models/platform/.spec.yml +++ b/release/models/platform/.spec.yml @@ -11,6 +11,7 @@ - yang/platform/openconfig-platform-cpu.yang - yang/platform/openconfig-platform-ext.yang - yang/platform/openconfig-platform-software.yang + - yang/platform/openconfig-platform-storage.yang - yang/platform/openconfig-platform-fabric.yang - yang/platform/openconfig-platform-pipeline-counters.yang - yang/platform/openconfig-platform-integrated-circuit.yang @@ -31,6 +32,7 @@ - yang/platform/openconfig-platform-ext.yang - yang/platform/openconfig-platform-cpu.yang - yang/platform/openconfig-platform-software.yang + - yang/platform/openconfig-platform-storage.yang - yang/platform/openconfig-platform-fabric.yang - yang/platform/openconfig-platform-pipeline-counters.yang - yang/platform/openconfig-platform-integrated-circuit.yang diff --git a/release/models/platform/openconfig-platform-common.yang b/release/models/platform/openconfig-platform-common.yang index 79514ea73..b0fcb1757 100644 --- a/release/models/platform/openconfig-platform-common.yang +++ b/release/models/platform/openconfig-platform-common.yang @@ -20,7 +20,13 @@ submodule openconfig-platform-common { "This modules contains common groupings that are used in multiple components within the platform module."; - oc-ext:openconfig-version "0.29.0"; + oc-ext:openconfig-version "0.30.0"; + + revision "2024-10-13" { + description + "Add storage state io-errors."; + reference "0.30.0"; + } revision "2024-10-13" { description diff --git a/release/models/platform/openconfig-platform-storage.yang b/release/models/platform/openconfig-platform-storage.yang new file mode 100644 index 000000000..230d03e07 --- /dev/null +++ b/release/models/platform/openconfig-platform-storage.yang @@ -0,0 +1,164 @@ +module openconfig-platform-storage { + +yang-version "1"; + +// namespace +namespace "http://openconfig.net/yang/platform/storage"; + +prefix "oc-storage"; + +import openconfig-platform { + prefix oc-platform; +} +import openconfig-extensions { + prefix oc-ext; +} +import openconfig-yang-types { + prefix oc-yang; +} + +// meta +organization + "OpenConfig working group"; + +contact + "OpenConfig working group + www.openconfig.net"; + +description + "This module defines data related to STORAGE components in the + OpenConfig platform model. + + Portions of this code were derived from the following copyright holders. + References to each copyright holder are mentioned where related content + is used. + + NVM Express Base Specification Revision 2.0a + https://nvmexpress.org/wp-content/uploads/NVMe-NVM-Express-2.0a-2021.07.26-Ratified.pdf + (c) Copyright 2007 to 2021 NVM Express, Inc. ALL RIGHTS RESERVED. + This NVM Express Base Specification, revision 2.0a is proprietary to the + NVM Express, Inc. (also referred to as “Company”) and/or its successors + and assigns. + + S.M.A.R.T. Attribute: Reallocated Sectors Count | Knowledge Base + http://kb.acronis.com."; + +oc-ext:openconfig-version "0.1.0"; + +revision "2024-08-26" { + description + "Initial revision."; + reference + "0.1.0"; +} + +// OpenConfig specific extensions for module metadata. +oc-ext:regexp-posix; +oc-ext:catalog-organization "openconfig"; +oc-ext:origin "openconfig"; + +// identity statements +// typedef statements +// grouping statements + grouping storage-counters-state { + description + "Operational state for storage component statistics. These leaves + are derived from a list of commonly supported S.M.A.R.T. counters. + Note that while common, these attributes may not be supported by + all storage device vendors and media types."; + + leaf soft-read-error-rate { + type oc-yang:counter64; + description + "Uncorrected read errors reported to the operating system. SMART ID + 201."; + reference + "S.M.A.R.T. Attribute: Soft Read Error Rate / Off Track Errors (Maxtor) + | Knowledge Base. kb.acronis.com."; + } + + leaf reallocated-sectors { + type oc-yang:counter64; + description + "Count of reallocated sectors. The raw value represents a count of + the bad sectors that have been found and remapped. SMART ID 5."; + reference + "S.M.A.R.T. Attribute: Reallocated Sectors Count | Knowledge Base - + kb.acronis.com"; + } + + leaf end-to-end-error { + type oc-yang:counter64; + description + "Count of parity errors which occur in the data path to the media. + SMART ID 184."; + reference + "Acronis Drive Monitor: Disk Health Calculation Knowledge Base - + kb.acronis.com"; + } + + leaf offline-uncorrectable-sectors-count { + type oc-yang:counter64; + description + "The total count of uncorrectable errors when reading/writing a + sector. SMART ID 198."; + reference + "Acronis Drive Monitor: Disk Health Calculation Knowledge Base - + kb.acronis.com"; + } + + leaf life-left { + type uint8; + description + "Indicates the approximate SSD life left, in terms of program/erase + cycles or available reserved blocks. A normalized value of 100 + represents a new drive, with a threshold value at 10 indicating a need + for replacement. A value of 0 may mean that the drive is operating in + read-only mode to allow data recovery. SMART ID 231."; + reference + "SMART attribute details, + https://media.kingston.com/support/downloads/MKP_306_SMART_attribute.pdf"; + } + + leaf percentage-used { + type uint8; + description + "Contains a vendor specific estimate of the percentage of NVM + subsystem life used based on the actual usage and the manufacturer’s + prediction of NVM life. A value of 100 indicates that the estimated + endurance of the NVM in the NVM subsystem has been consumed, but may + not indicate an NVM subsystem failure. The value is allowed to exceed + 100. Percentages greater than 254 shall be represented as 255."; + reference + "NVM Express Base Specification Revision 2.0a + https://nvmexpress.org/wp-content/uploads/NVMe-NVM-Express-2.0a-2021.07.26-Ratified.pdf"; + } + } + grouping storage-state { + description + "Storage component state. These counters are derived from the + linux kernel block layer statistics in /sys/block//stat. + Implementations which do not use the linux kernel to access + storage should provide equivalent counters."; + reference + "https://www.kernel.org/doc/Documentation/block/stat.txt"; + + container counters { + description + "A collection of storage specific statistics entitites."; + + uses storage-counters-state; + } + } + + // data definition statements + // augment statements + augment "/oc-platform:components/oc-platform:component/" + + "oc-platform:storage/oc-platform:state" { + description + "Adding storage data to component model"; + + uses storage-state; + } +} + diff --git a/release/models/platform/openconfig-platform.yang b/release/models/platform/openconfig-platform.yang index 3850f2e78..742c3e8af 100644 --- a/release/models/platform/openconfig-platform.yang +++ b/release/models/platform/openconfig-platform.yang @@ -65,7 +65,13 @@ module openconfig-platform { (presence or absence of a component) and state (physical attributes or status)."; - oc-ext:openconfig-version "0.29.0"; + oc-ext:openconfig-version "0.30.0"; + + revision "2024-10-13" { + description + "Add storage state io-errors."; + reference "0.30.0"; + } revision "2024-10-13" { description @@ -94,13 +100,11 @@ module openconfig-platform { revision "2024-01-30" { description - "Add rules for controller-card power-off - Also introduces last-poweroff-reason container - and last-poweroff-time leaf"; + "Updated description for component-power-type"; reference "0.25.0"; } - revision "2023-11-28" { + revision "2023-11-28" { description "Add model-name"; reference "0.24.0"; From 4513c1485047292dd04339ffc6f5bbf42b1c84b9 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Tue, 24 Sep 2024 12:27:54 -0700 Subject: [PATCH 197/201] Restore NONE as an enum value for typedef community-type (#1177) * restore NONE as an enum value for typedef community-type --- .../bgp/openconfig-bgp-common-multiprotocol.yang | 8 +++++++- .../bgp/openconfig-bgp-common-structure.yang | 8 +++++++- release/models/bgp/openconfig-bgp-common.yang | 15 +++++++++++---- release/models/bgp/openconfig-bgp-errors.yang | 8 +++++++- release/models/bgp/openconfig-bgp-global.yang | 8 +++++++- release/models/bgp/openconfig-bgp-neighbor.yang | 8 +++++++- release/models/bgp/openconfig-bgp-peer-group.yang | 8 +++++++- release/models/bgp/openconfig-bgp-types.yang | 14 +++++++++----- release/models/bgp/openconfig-bgp.yang | 8 +++++++- 9 files changed, 69 insertions(+), 16 deletions(-) diff --git a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang index 705019c01..884bbe8be 100644 --- a/release/models/bgp/openconfig-bgp-common-multiprotocol.yang +++ b/release/models/bgp/openconfig-bgp-common-multiprotocol.yang @@ -24,7 +24,13 @@ submodule openconfig-bgp-common-multiprotocol { for multiple protocols in BGP. The groupings are common across multiple contexts."; - oc-ext:openconfig-version "9.7.1"; + oc-ext:openconfig-version "9.8.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "9.8.0"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-common-structure.yang b/release/models/bgp/openconfig-bgp-common-structure.yang index e737d9d13..8aee8797b 100644 --- a/release/models/bgp/openconfig-bgp-common-structure.yang +++ b/release/models/bgp/openconfig-bgp-common-structure.yang @@ -21,7 +21,13 @@ submodule openconfig-bgp-common-structure { "This sub-module contains groupings that are common across multiple BGP contexts and provide structure around other primitive groupings."; - oc-ext:openconfig-version "9.7.1"; + oc-ext:openconfig-version "9.8.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "9.8.0"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-common.yang b/release/models/bgp/openconfig-bgp-common.yang index fe3f82477..ac1a3983f 100644 --- a/release/models/bgp/openconfig-bgp-common.yang +++ b/release/models/bgp/openconfig-bgp-common.yang @@ -24,7 +24,13 @@ submodule openconfig-bgp-common { may be application to a subset of global, peer-group or neighbor contexts."; - oc-ext:openconfig-version "9.7.1"; + oc-ext:openconfig-version "9.8.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "9.8.0"; + } revision "2023-12-28" { description @@ -326,9 +332,10 @@ submodule openconfig-bgp-common { leaf-list send-community-type { type oc-bgp-types:community-type; description - "Specify which types of community should be sent to the - neighbor or group. The default is to not send the - community attribute"; + "Specify which types of community should be sent to the neighbor or + group. The default is to not send the community attribute. Note, if + the NONE community-type is specified, no other types must be + specified."; } leaf description { diff --git a/release/models/bgp/openconfig-bgp-errors.yang b/release/models/bgp/openconfig-bgp-errors.yang index 662395606..53372afc7 100644 --- a/release/models/bgp/openconfig-bgp-errors.yang +++ b/release/models/bgp/openconfig-bgp-errors.yang @@ -18,7 +18,13 @@ submodule openconfig-bgp-errors { "This module defines BGP NOTIFICATION message error codes and subcodes"; - oc-ext:openconfig-version "6.0.0"; + oc-ext:openconfig-version "6.1.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "6.1.0"; + } revision "2024-01-31" { description diff --git a/release/models/bgp/openconfig-bgp-global.yang b/release/models/bgp/openconfig-bgp-global.yang index 28e73bac5..9a1480182 100644 --- a/release/models/bgp/openconfig-bgp-global.yang +++ b/release/models/bgp/openconfig-bgp-global.yang @@ -27,7 +27,13 @@ submodule openconfig-bgp-global { "This sub-module contains groupings that are specific to the global context of the OpenConfig BGP module"; - oc-ext:openconfig-version "9.7.1"; + oc-ext:openconfig-version "9.8.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "9.8.0"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-neighbor.yang b/release/models/bgp/openconfig-bgp-neighbor.yang index 3087ae03c..ddcef2e8b 100644 --- a/release/models/bgp/openconfig-bgp-neighbor.yang +++ b/release/models/bgp/openconfig-bgp-neighbor.yang @@ -30,7 +30,13 @@ submodule openconfig-bgp-neighbor { "This sub-module contains groupings that are specific to the neighbor context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.7.1"; + oc-ext:openconfig-version "9.8.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "9.8.0"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-peer-group.yang b/release/models/bgp/openconfig-bgp-peer-group.yang index 9091e68e1..aba5163ac 100644 --- a/release/models/bgp/openconfig-bgp-peer-group.yang +++ b/release/models/bgp/openconfig-bgp-peer-group.yang @@ -25,7 +25,13 @@ submodule openconfig-bgp-peer-group { "This sub-module contains groupings that are specific to the peer-group context of the OpenConfig BGP module."; - oc-ext:openconfig-version "9.7.1"; + oc-ext:openconfig-version "9.8.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "9.8.0"; + } revision "2023-12-28" { description diff --git a/release/models/bgp/openconfig-bgp-types.yang b/release/models/bgp/openconfig-bgp-types.yang index 2a9298a6a..57b8e9b65 100644 --- a/release/models/bgp/openconfig-bgp-types.yang +++ b/release/models/bgp/openconfig-bgp-types.yang @@ -24,7 +24,13 @@ module openconfig-bgp-types { policy. It can be imported by modules that make use of BGP attributes"; - oc-ext:openconfig-version "6.0.0"; + oc-ext:openconfig-version "6.1.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "6.1.0"; + } revision "2024-02-01" { description @@ -795,10 +801,8 @@ module openconfig-bgp-types { } enum NONE { description - "Do not send any community attribute. - This value has been deprecated because the node is now - a leaf-list."; - status deprecated; + "Do not send any community attribute. If this value is present + then the other community-types must not be present."; } } description diff --git a/release/models/bgp/openconfig-bgp.yang b/release/models/bgp/openconfig-bgp.yang index de65238c9..054f3cdd9 100644 --- a/release/models/bgp/openconfig-bgp.yang +++ b/release/models/bgp/openconfig-bgp.yang @@ -68,7 +68,13 @@ module openconfig-bgp { whereas leaf not present inherits its value from the leaf present at the next higher level in the hierarchy."; - oc-ext:openconfig-version "9.7.1"; + oc-ext:openconfig-version "9.8.0"; + + revision "2024-09-06" { + description + "Restore NONE enum value for community-type."; + reference "9.8.0"; + } revision "2023-12-28" { description From 3a3018590be5f7c11a3ed8c3530b128c53633d7b Mon Sep 17 00:00:00 2001 From: sallylsy <108024270+sallylsy@users.noreply.github.com> Date: Thu, 26 Sep 2024 10:21:16 -0700 Subject: [PATCH 198/201] Support PTP Yang model based on IEEE standard (#1103) (A) release/models/ptp/openconfig-ptp.yang (A) release/models/ptp/openconfig-ptp-types.yang * Support PTP Yang model based on IEEE standard --- release/models/ptp/.spec.yml | 8 + release/models/ptp/openconfig-ptp-types.yang | 299 +++++ release/models/ptp/openconfig-ptp.yang | 1198 ++++++++++++++++++ 3 files changed, 1505 insertions(+) create mode 100644 release/models/ptp/.spec.yml create mode 100644 release/models/ptp/openconfig-ptp-types.yang create mode 100644 release/models/ptp/openconfig-ptp.yang diff --git a/release/models/ptp/.spec.yml b/release/models/ptp/.spec.yml new file mode 100644 index 000000000..ff369d9e3 --- /dev/null +++ b/release/models/ptp/.spec.yml @@ -0,0 +1,8 @@ +- name: openconfig-ptp + docs: + - yang/ptp/openconfig-ptp-types.yang + - yang/ptp/openconfig-ptp.yang + build: + - yang/ptp/openconfig-ptp-types.yang + - yang/ptp/openconfig-ptp.yang + run-ci: true diff --git a/release/models/ptp/openconfig-ptp-types.yang b/release/models/ptp/openconfig-ptp-types.yang new file mode 100644 index 000000000..943569639 --- /dev/null +++ b/release/models/ptp/openconfig-ptp-types.yang @@ -0,0 +1,299 @@ +module openconfig-ptp-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/ptp-types"; + + prefix "oc-ptp-types"; + + import openconfig-extensions { + prefix oc-ext; + } + + // meta + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net "; + + description + "This module defines types and identities used in OpenConfig + models related to Precision Time Protocol (PTP). + + IEEE code is subject to the following copyright and license: + Copyright (c) 2020 by The Institute of Electrical and Electronics + Engineers, Inc. All rights reserved."; + + oc-ext:openconfig-version "1.0.0"; + + revision 2024-09-17 { + description + "Initial Public Version"; + reference "1.0.0"; + } + + // extension statements + + // feature statements + + // identity statements + + identity TIME_SOURCE { + description + "Enumeration for the source of time used by the Grandmaster + PTP Instance. + YANG identity is used so that a PTP Profile's YANG augment + can assign values, using numeric range F0 to FE hex."; + reference + "7.6.2.8 of IEEE Std 1588-2019"; + } + + identity CLOCK_CLASS { + description + "Enumeration that denotes the traceability, synchronization + state and expected performance of the time or frequency + distributed by the Grandmaster PTP Instance. + IEEE Std 1588 does not specify a name for each clock-class, + but the names below are intended to be as intuitive as possible. + YANG identity is used so that a PTP Profile's YANG augment + can assign values using a numeric range designated for use by + alternate PTP Profiles."; + reference + "7.6.2.5 of IEEE Std 1588-2019"; + } + + identity CLOCK_ACCURACY { + description + "Enumeration that indicates the expected accuracy of a + PTP Instance when it is the Grandmaster PTP Instance, + or in the event it becomes the Grandmaster PTP Instance. + The value shall be conservatively estimated by the PTP + Instance to a precision consistent with the value of the + selected clock-accuracy and of the next lower enumerated + value, for example, for clockAccuracy = 23 hex, between + 250 ns and 1000 ns. + IEEE Std 1588 does not specify a name for each clock-accuracy, + but the names below are intended to be as intuitive as possible. + YANG identity is used so that a PTP Profile's YANG augment + can assign values, using numeric range 80 to FD hex."; + reference + "7.6.2.6 of IEEE Std 1588-2019"; + } + + typedef clock-identity { + type string { + pattern "[0-9A-F]{2}(-[0-9A-F]{2}){7}"; + oc-ext:posix-pattern '^[0-9A-F]{2}(-[0-9A-F]{2}){7}$'; + } + description + "Identifies unique entities within a PTP Network, + e.g. a PTP Instance or an entity of a common service. + The identity is an 8-octet array, constructed according + to specifications in IEEE Std 1588, using an + organization identifier from the IEEE Registration + Authority. + Each octet is represented in YANG as a pair of + hexadecimal characters, using uppercase for a letter. + Each octet in the array is separated by the dash + character."; + reference + "5.3.4 of IEEE Std 1588-2019 + 7.5.2.2 of IEEE Std 1588-2019"; + } + + typedef time-interval { + type int64; + description + "Time interval, expressed in nanoseconds, multiplied by 2^16. + Positive or negative time intervals outside the maximum range + of this data type shall be encoded as the largest positive and + negative values of the data type, respectively."; + reference + "5.3.2 of IEEE Std 1588-2019"; + } + +typedef instance-type { + type enumeration { + enum OC { + value 0; + description + "Ordinary Clock"; + } + enum BC { + value 1; + description + "Boundary Clock"; + } + enum P2P_TC { + value 2; + description + "Peer-to-peer Transparent Clock"; + } + enum E2E_TC { + value 3; + description + "End-to-end Transparent Clock"; + } + } + description + "Enumeration for the type of PTP Instance. + Values for this enumeration are specified by the IEEE 1588 + standard exclusively."; + reference + "8.2.1.5.5 of IEEE Std 1588-2019"; + } + + + typedef unicast-multicast-enumeration { + type enumeration { + enum UNICAST { + value 1; + description + "unicast"; + } + enum MULTICAST { + value 2; + description + "multicast"; + } + } + description + "Type definition for options when setting the unicast-multicast + attribute in the default data set"; + } + + typedef delay-mechanism-enumeration { + type enumeration { + enum E2E { + value 1; + description + "The port uses the delay request-response mechanism."; + } + enum P2P { + value 2; + description + "The port uses the peer delay mechanism."; + } + enum DISABLED { + value 254; + description + "The port does not implement any delay mechanism."; + } + } + description + "The propagation-delay measuring option used by the + port. Values for this enumeration are specified + by the IEEE Std 1588 standard exclusively."; + reference + "IEEE Std 1588-2008: 8.2.5.4.4"; + } + + typedef port-state-enumeration { + type enumeration { + enum INITIALIZING { + value 1; + description + "The port is initializing its data sets, hardware, and + communication facilities."; + } + enum FAULTY { + value 2; + description + "The port is in the fault state."; + } + enum DISABLED { + value 3; + description + "The port is disabled and is not communicating PTP + messages (other than possibly PTP management + messages)."; + } + enum LISTENING { + value 4; + description + "The port is listening for an Announce message."; + } + enum PRE_MASTER { + value 5; + description + "The port is in the pre-master state."; + } + enum MASTER { + value 6; + description + "The port is behaving as a master port."; + } + enum PASSIVE { + value 7; + description + "The port is in the passive state."; + } + enum UNCALIBRATED { + value 8; + description + "A master port has been selected, but the port is still + in the uncalibrated state."; + } + enum SLAVE { + value 9; + description + "The port is synchronizing to the selected master port."; + } + } + description + "The current state of the protocol engine associated + with the port. Values for this enumeration are specified + by the IEEE Std 1588 standard exclusively."; + reference + "IEEE Std 1588-2008: 8.2.5.3.1, 9.2.5"; + } + + typedef network-transport-enumeration { + type enumeration { + enum L2 { + value 1; + description + "Layer 2 network"; + } + enum UDPV4 { + value 2; + description + "UDPv4 network"; + } + enum UDPV6 { + value 3; + description + "UDPv6 network"; + } + } + description + "Type definition for options when setting the network transport + attribute in the default data set"; + } + + typedef domain-profile-enumeration { + type enumeration { + enum IEEE1588 { + value 1; + description + "default profile"; + } + enum G8275.1 { + value 2; + description + "g8275.1 profile"; + } + enum G8275.2 { + value 3; + description + "g8275.2 profile"; + } + } + description + "Type definition for options when setting the domain-profile + attribute in the default data set"; + } +} diff --git a/release/models/ptp/openconfig-ptp.yang b/release/models/ptp/openconfig-ptp.yang new file mode 100644 index 000000000..8c2a4c714 --- /dev/null +++ b/release/models/ptp/openconfig-ptp.yang @@ -0,0 +1,1198 @@ +module openconfig-ptp { + + yang-version "1"; + + namespace "http://openconfig.net/yang/ptp"; + + prefix "oc-ptp"; + + import ietf-interfaces { prefix if; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-ptp-types { prefix oc-ptp-types; } + + organization + "OpenConfig working group"; + contact + "OpenConfig working group + www.openconfig.net "; + description + "This YANG module defines a data model for the configuration + and state of IEEE Std 1588 clocks. IEEE Std 1588 specifies the + Precision Time Protocol (PTP). + + The nodes in this YANG module are designed for compatibility + with ietf-ptp.yang, the YANG data model for IEEE Std 1588-2008, + as specified in IETF RFC 8575. + + NOTE regarding default value: + PTP's concept of 'initialization value' is analogous to YANG's + concept of a 'default value'. According to 8.1.3.4 of + IEEE Std 1588-2019, the initialization value for configuration + is specified in IEEE Std 1588, but that value can be overridden + by a PTP Profile specification, or by the product that + implements PTP. This makes it challenging to repeat the + specification of initialization value using a YANG 'default' + statement, because there is no straightforward mechanism for + a PTP Profile's (or product's) YANG module to import this + module and override its YANG default. Since a YANG management + client can read the default value from the operational + datastore, there is no need to re-specify the default in YANG. + The implementer of PTP refers to the relevant PTP + specifications for the default (not YANG modules). + Therefore, this YANG module avoids use of the YANG 'default' + statement. + + NOTE regarding IEEE Std 1588 classification: + 8.1.2 of IEEE Std 1588-2019 specifies a classification of + each data set member, which corresponds to a leaf in YANG. + The relationship between 1588 classification and + YANG 'config' (i.e., whether the leaf is read-write) is: + - 1588 static: The leaf is 'config false' (read-only). + - 1588 configurable: The leaf is 'config true', which is + the default value for a YANG leaf. + - 1588 dynamic: A judgement is made on a member-by-member + basis. If the member corresponds to the first item of + 8.1.2.1.2 of IEEE Std 1588-2019 (i.e., value from protocol + only, such as log of protocol behavior), the YANG leaf + is 'config false'. Otherwise, the member's value can be + provided by an entity outside PTP (e.g., NETCONF or + RESTCONF client), and therefore the YANG leaf is + 'config true'. + + NOTE regarding terminology (two YANG modules): + To accommodate the need by some organizations to use the + original terminology specified by IEEE Std 1588, and the + need by some other organizations to use the alternative + terminology specified in 4.4 of IEEE Std 1588g-2022, + two YANG modules are provided by IEEE Std 1588e (MIB and + YANG Data Models). For a detailed explanation, see 15.4.2.11 + of IEEE Std 1588e. + This module uses the original terminology specified by + IEEE Std 1588 (master/slave). + + IEEE code is subject to the following copyright and license: + Copyright (c) 2020 by The Institute of Electrical and Electronics + Engineers, Inc. All rights reserved."; + + oc-ext:openconfig-version "1.0.0"; + + revision 2024-09-17 { + description + "Initial revision. IEEE Std 1588e-XXXX, IEEE Standard for a Precision + Clock Synchronization Protocol for Networked Measurement and Control + Systems - MIB and YANG Data Models."; + reference + "1.0.0"; + } + + grouping instance-config { + description + "Config state data of an instance of the PTP"; + + leaf id { + type uint32; + description + "The instance list is indexed using a number that is unique per PTP + Instance within the PTP Node, applicable to the management context + only (i.e. not used in PTP messages). The domain-number of the PTP + Instance is not used as the key to instance-list, since it is possible + for a PTP Node to contain multiple PTP Instances using the same + domain-number."; + reference + "8.1.4.2 of IEEE Std 1588-2019"; + } + } + + grouping instance-state { + description + "Operational state data of an instance of the PTP"; + + uses instance-config; + } + + grouping current-ds-state { + description + "Provides current data from operation of the protocol."; + reference + "8.2.2 of IEEE Std 1588-2019"; + + leaf steps-removed { + type uint16; + config false; + description + "The number of PTP Communication Paths traversed + between this PTP Instance and the Grandmaster + PTP Instance."; + reference + "8.2.2.2 of IEEE Std 1588-2019"; + } + + leaf offset-from-master { + type oc-ptp-types:time-interval; + config false; + description + "The current value of the time difference between + a Master PTP Instance and a Slave PTP Instance as + computed by the Slave PTP Instance. + NOTE - When a PTP Profile requires a Boundary + Clock to transfer offset information internally + from Slave PTP Port to Master PTP Port(s), this value + effectively returns the offset from the Grandmaster + PTP Instance."; + reference + "8.2.2.3 of IEEE Std 1588-2019"; + } + + leaf mean-path-delay { + type oc-ptp-types:time-interval; + config false; + status deprecated; + description + "In IEEE Std 1588-2008, currentDS.meanDelay was called + currentDS.meanPathDelay. While the specification of + this member is retained in the current standard, the + member is renamed to currentDS.meanDelay. This change + is consistent with other changes that ensure clarity + and consistency of naming, where + - 'path' is associated with the + request-response mechanism + - 'link' is associated with the + peer-to-peer delay mechanism"; + reference + "8.2.2.4 of IEEE Std 1588-2008"; + } + } + + grouping time-properties-ds-state { + description + "Provides data learned from the current Grandmaster PTP Instance."; + reference + "8.2.4 of IEEE Std 1588-2019"; + leaf current-utc-offset { + when "../current-utc-offset-valid='true'"; + type int16; + description + "Specified as in IERS Bulletin C, this provides + the offset from UTC (TAI - UTC). The offset is in + units of seconds."; + reference + "7.2.4 of IEEE Std 1588-2019 + 8.2.4.2 of IEEE Std 1588-2019"; + } + + leaf current-utc-offset-valid { + type boolean; + description + "The value of current-utc-offset-valid shall be true + if the values of current-utc-offset, leap59, and leap61 + are known to be correct, otherwise it shall be false. + NOTE - The constraint for leap59 and leap61 did not + exist in IEEE Std 1588-2008, and for compatibility, + corresponding when statements were not included below."; + reference + "8.2.4.3 of IEEE Std 1588-2019"; + } + + leaf leap59 { + type boolean; + description + "If the timescale is PTP, a true value for leap59 + shall indicate that the last minute of the + current UTC day contains 59 seconds. + If the timescale is not PTP, the value shall be + false."; + reference + "8.2.4.4 of IEEE Std 1588-2019"; + } + + leaf leap61 { + type boolean; + description + "If the timescale is PTP, a true value for leap61 shall indicate + that the last minute of the current UTC day contains 61 seconds. + If the timescale is not PTP, the value shall be false."; + reference + "8.2.4.5 of IEEE Std 1588-2019"; + } + + leaf time-traceable { + type boolean; + description + "The value of time-traceable shall be true if the timescale is + traceable to a primary reference; otherwise, the value shall be + false. The uncertainty specifications appropriate to the + evaluation of whether traceability to a primary reference is + achieved should be defined in the applicable PTP Profile. In + the absence of such a definition the value of time-traceable is + implementation specific."; + reference + "8.2.4.6 of IEEE Std 1588-2019"; + } + + leaf frequency-traceable { + type boolean; + description + "The value of time-traceable shall be true if the frequency + determining the timescale is traceable to a primary reference; + otherwise, the value shall be false. + The uncertainty specifications appropriate to the evaluation + of whether traceability to a primary reference is achieved + should be defined in the applicable PTP Profile. In the absence + of such a definition the value of frequency-traceable is + implementation specific."; + reference + "8.2.4.7 of IEEE Std 1588-2019"; + } + + leaf ptp-timescale { + type boolean; + description + "If ptp-timescale is true, the timescale of the Grandmaster PTP + Instance is PTP, which is the elapsed time since the PTP epoch + measured using the second defined by International Atomic Time (TAI). + If ptp-timescale is false, the timescale of the Grandmaster PTP + Instance is ARB, which is the elapsed time since an arbitrary epoch."; + reference + "7.2.1 of IEEE Std 1588-2019 + 8.2.4.8 of IEEE Std 1588-2019"; + } + + leaf time-source { + type identityref { + base oc-ptp-types:TIME_SOURCE; + } + description + "The source of time used by the Grandmaster + PTP Instance."; + reference + "7.6.2.8 of IEEE Std 1588-2019 + 8.2.4.9 of IEEE Std 1588-2019"; + } + } + + grouping default-ds-config { + description + "Config state data of default data set of the clock"; + + leaf priority1 { + type uint8; + description + "The IEEE Std 1588 priority1 of the PTP Instance. + Since priority1 is one of the first comparisons + performed by the Best Master Clock Algorithm (BMCA), + this leaf's configuration can be used to explicitly + select a Grandmaster PTP Instance. + Lower values take precedence. + The value of priority1 shall be configurable to any + value in the range 0 to 255, unless restricted by + limits established by the applicable PTP Profile."; + reference + "7.6.2.3 of IEEE Std 1588-2019 + 8.2.1.4.1 of IEEE Std 1588-2019"; + } + leaf priority2 { + type uint8; + description + "The IEEE Std 1588 priority2 of the PTP Instance. + The priority2 member is compared by the Best Master + Clock Algorithm (BMCA) after priority1 and clockQuality. + Lower values take precedence. + The value of priority2 shall be configurable to any + value in the range 0 to 255, unless restricted by + limits established by the applicable PTP Profile."; + reference + "7.6.2.4 of IEEE Std 1588-2019 + 8.2.1.4.2 of IEEE Std 1588-2019"; + } + leaf domain-number { + type uint8; + description + "The IEEE Std 1588 domainNumber of the PTP Instance. + A domain consists of one or more PTP Instances + communicating with each other as defined by the + protocol. A domain shall define the scope of PTP message + communication, state, operations, data sets, and + timescale. Therefore, each domain represents a distinct + time. + Within a PTP Network, a domain is identified by two + data set members: domainNumber and sdoId. + The domainNumber is the primary mechanism for end users + and system integrators to isolate the operation of a + PTP Instance from PTP messages used in other domains. + The value of the domainNumber shall be configurable + to values permitted in IEEE Std 1588, unless the + allowed values are further restricted by the applicable + PTP Profile."; + reference + "7.1 of IEEE Std 1588-2019 + 8.2.1.4.3 of IEEE Std 1588-2019"; + } + leaf slave-only { + type boolean; + description + "The value of slave-only shall be true if the + PTP Instance is a slave-only PTP Instance + (false for non-slave-only). + The slave-only member can be true for Ordinary Clocks + only. + When slave-only is true, the PTP Instance implements + special behavior in the context of the state machines + that determine port-state."; + reference + "8.2.1.4.4 of IEEE Std 1588-2019 + 9.2.2.1 of IEEE Std 1588-2019"; + } + + leaf instance-type { + type oc-ptp-types:instance-type; + description + "The type of PTP Instance. + This leaf is read-only unless support for write is + explicitly specified by the applicable PTP Profile or + product specification."; + reference + "8.2.1.5.5 of IEEE Std 1588-2019"; + } + + leaf sdo-id { + type uint16 { + range "0..4095"; + } + description + "The IEEE Std 1588 sdoId of the PTP Instance. + A domain consists of one or more PTP Instances + communicating with each other as defined by the + protocol. A domain shall define the scope of PTP message + communication, state, operations, data sets, and + timescale. Therefore, each domain represents a distinct + time. + Within a PTP Network, a domain is identified by two + data set members: domainNumber and sdoId. + The sdoId of a domain is a 12-bit integer in the + closed range 0 to 4095. + The sdoId member is the primary mechanism for providing + isolation of PTP Instances operating a PTP Profile + specified by a Standards Development Organization (SDO), + from other PTP Instances operating a PTP Profile + specified by a different SDO."; + reference + "7.1 of IEEE Std 1588-2019 + 8.2.1.4.5 of IEEE Std 1588-2019 + 16.5 of IEEE Std 1588-2019"; + } + leaf network-transport { + type oc-ptp-types:network-transport-enumeration; + description + "The network transport used for communication"; + } + leaf unicast-multicast { + type oc-ptp-types:unicast-multicast-enumeration; + description + "Whether the network transport uses unicast or + multicast communication"; + } + leaf domain-profile { + type oc-ptp-types:domain-profile-enumeration; + description + "The method to be used when comparing data sets during + the Best Master Clock Algorithm."; + } + } + + grouping clock-quality-top { + description + "Quality of a PTP Instance, which contains IEEE Std 1588 + clockClass, clockAccuracy and offsetScaledLogVariance. + PTP Instances with better quality are more likely to + become the Grandmaster PTP Instance."; + reference + "5.3.7 of IEEE Std 1588-2019 + 8.2.1.3.1 of IEEE Std 1588-2019"; + + leaf clock-class { + type identityref { + base oc-ptp-types:CLOCK_CLASS; + } + description + "The clockClass denotes the traceability of the time + or frequency distributed by the clock."; + reference + "7.6.2.5 of IEEE Std 1588-2019 + 8.2.1.3.1.2 of IEEE Std 1588-2019"; + } + + leaf clock-accuracy { + type identityref { + base oc-ptp-types:CLOCK_ACCURACY; + } + description + "The clockAccuracy indicates the accuracy of the clock + (Local Clock of the PTP Instance)."; + reference + "7.6.2.6 of IEEE Std 1588-2019 + 8.2.1.3.1.3 of IEEE Std 1588-2019"; + } + + leaf offset-scaled-log-variance { + type uint16; + description + "The offsetScaledLogVariance indicates the stability of the + clock (Local Clock of the PTP Instance). It provides an + estimate of the variations of the clock from a linear timescale + when it is not synchronized to another clock using the + protocol."; + reference + "7.6.2.7 of IEEE Std 1588-2019"; + } + } + + grouping default-ds-state { + description + "Operational state data of default data set of the clock"; + uses default-ds-config; + + leaf two-step-flag { + type boolean; + description + "When set to true, the PTP Instance is two-step, + otherwise the PTP Instance is one-step. + This data set member is no longer used. However, + the twoStepFlag of the PTP common header is used. + One step or two step egress behavior is allowed to + be specified per PTP Port, or per PTP Instance. + Management of the one/two step egress behavior of + a PTP Port is not provided by this standard, but + can be specified as extensions to the data sets by a + PTP Profile or a product specification."; + reference + "8.2.1.2.1 of IEEE Std 1588-2019"; + } + + leaf clock-identity { + type oc-ptp-types:clock-identity; + description + "The IEEE Std 1588 clockIdentity of the PTP Instance."; + reference + "8.2.1.2.2 of IEEE Std 1588-2019"; + } + + leaf number-ports { + type uint16; + description + "The number of PTP Ports on the PTP Instance. + For an Ordinary Clock, the value shall be one."; + reference + "8.2.1.2.3 of IEEE Std 1588-2019"; + } + } + + grouping default-ds-top { + description + "Top-level grouping for default data sets of the clock, + including configuration and operational state data"; + + container default-ds { + description + "The default data set of the PTP Instance."; + reference + "8.2.1 of IEEE Std 1588-2019"; + + container clock-quality { + description + "The IEEE Std 1588 clockQuality of the PTP Instance. + PTP Instances with better quality are more likely to + become the Grandmaster PTP Instance."; + reference + "8.2.1.3.1 of IEEE Std 1588-2019"; + + container config { + description + "Config state data of clock-quality"; + uses clock-quality-top; + } + container state { + config false; + description + "Operational state data of clock-quality"; + uses clock-quality-top; + } + } + container config { + description + "Config state data of default data set of the clock"; + uses default-ds-config; + } + container state { + config false; + description + "Operational state data of default data set of the clock"; + uses default-ds-state; + } + } + } + + grouping port-identity { + description + "The IEEE Std 1588 PortIdentity type identifies a + PTP Port or Link Port."; + reference + "5.3.5 of IEEE Std 1588-2019"; + + leaf clock-identity { + type oc-ptp-types:clock-identity; + description + "IEEE Std 1588 clockIdentity."; + } + + leaf port-number { + type uint16; + description + "IEEE Std 1588 portNumber. + If portNumber is unavailable, the value 0 can + be used, or this leaf can be omitted from the + operational datastore."; + reference + "7.5.2.3 of IEEE Std 1588-2019"; + } + } + + grouping parent-ds-state { + description + "The parent data set of the clock (see IEEE Std 1588-2008 + subclause 8.2.3)."; + reference + "IEEE Std 1588-2008: 8.2.3"; + + container parent-port-identity { + description + "The IEEE Std 1588 portIdentity of the PTP Port on the + Master PTP Instance that issues the Sync messages + used in synchronizing this PTP Instance."; + reference + "8.2.3.2 of IEEE Std 1588-2019"; + uses port-identity; + } + + leaf parent-stats { + type boolean; + description + "When set to true, the values of + parent-ds/observed-parent-offset-scaled-log-variance + and + parent-ds/observed-parent-clock-phase-change-rate + have been measured and are valid."; + reference + "8.2.3.3 of IEEE Std 1588-2019"; + } + + leaf observed-parent-offset-scaled-log-variance { + type uint16; + description + "Estimate of the variance of the phase offset of the + Local PTP Clock of the Parent PTP Instance as measured + with respect to the Local PTP Clock in the Slave PTP + Instance. This measurement is optional, but if not made, + the value of parent-ds/parent-stats shall be false."; + reference + "7.6.3.3 of IEEE Std 1588-2019 + 7.6.3.5 of IEEE Std 1588-2019 + 8.2.3.4 of IEEE Std 1588-2019"; + } + + leaf observed-parent-clock-phase-change-rate { + type int32; + description + "Estimate of the phase change rate of the + Local PTP Clock of the Parent PTP Instance as measured + by the Slave PTP Instance using its Local PTP Clock. + If the estimate exceeds the capacity of its data type, + this value shall be set to 7FFF FFFF (base 16) or + 8000 0000 (base 16), as appropriate. A positive sign + indicates that the phase change rate in the + Parent PTP Instance is greater than that in the + Slave PTP Instance. The measurement of this value is + optional, but if not measured, the value of + parent-ds/parent-stats shall be false."; + reference + "7.6.4.4 of IEEE Std 1588-2019 + 8.2.3.5 of IEEE Std 1588-2019"; + } + + leaf grandmaster-identity { + type oc-ptp-types:clock-identity; + description + "The IEEE Std 1588 clockIdentity of the Grandmaster PTP + Instance."; + reference + "8.2.3.6 of IEEE Std 1588-2019"; + } + + container grandmaster-clock-quality { + description + "The IEEE Std 1588 clockQuality of the Grandmaster PTP + Instance."; + reference + "8.2.3.7 of IEEE Std 1588-2019"; + uses clock-quality-top; + } + + leaf grandmaster-priority1 { + type uint8; + description + "The IEEE Std 1588 priority1 of the Grandmaster PTP + Instance."; + reference + "8.2.3.8 of IEEE Std 1588-2019"; + } + + leaf grandmaster-priority2 { + type uint8; + description + "The IEEE Std 1588 priority2 of the Grandmaster PTP + Instance."; + reference + "8.2.3.9 of IEEE Std 1588-2019"; + } + } + + grouping parent-ds-top { + description + "Top-level grouping for parent data sets of the clock, including + configuration and operational state data"; + + container parent-ds { + description + "Provides data learned from the parent of this PTP Instance (i.e. + master port on the other side of the path/link)."; + reference + "8.2.3 of IEEE Std 1588-2019"; + + container state { + description + "Operational state data of parent data set"; + config false; + uses parent-ds-state; + } + } + } + + grouping ports-top { + description + "Top-level grouping for port data sets of the clock, + including configuration and operational state data"; + container ports { + description + "YANG container that is used to get all PTP Ports + in the PTP Instance. + YANG does not allow get of all elements in a YANG list, + so a YANG container wrapping the YANG list is provided for + that purpose. The naming convention uses plural for the + wrapping YANG container, and singular for the YANG list."; + list port { + key "port-index"; + description + "List of data for each PTP Port in the PTP Instance. + While the PTP Instance is disabled, it is possible to + have zero PTP Ports (i.e., ports not yet created). + While the PTP Instance is enabled, an Ordinary Clock + will have one PTP Port, and a Boundary Clock or + Transparent Clock will have more than one PTP Port."; + reference + "8.1.4.2 of IEEE Std 1588-2019"; + + leaf port-index { + type leafref { + path "../config/port-index"; + } + description + "The port list is indexed using a number that is + unique per PTP Port within the PTP Instance, + applicable to the management context only + (i.e., not used in PTP messages)."; + } + + container config { + description + "Config state data of port data set of the clock"; + uses port-config-top; + } + + container state { + description + "operational state data of port data set of the clock"; + config false; + uses port-config-top; + } + + uses port-ds-top; + } + } + } + + grouping port-config-top { + description + "Configuration data of port data set of the clock"; + leaf port-index { + type uint16; + description + "The port list is indexed using a number that is + unique per PTP Port within the PTP Instance, + applicable to the management context only + (i.e., not used in PTP messages)."; + } + + leaf underlying-interface { + type if:interface-ref; + description + "Reference to the configured underlying IETF YANG + interface that is used by this PTP Port for + transport of PTP messages. Among other data, + physical identifiers for the interface + (e.g., MAC address) can be obtained using this + reference."; + reference + "RFC 8343"; + } + } + + grouping port-ds-state-top { + description + "Operational state data of port data set of the clock"; + + leaf port-state { + type oc-ptp-types:port-state-enumeration; + description + "Current state of the protocol engine associated + with this PTP Port."; + reference + "8.2.15.3.1 of IEEE Std 1588-2019"; + } + + leaf peer-mean-path-delay { + type oc-ptp-types:time-interval; + description + "In IEEE Std 1588-2008, this data set member was + called portDS.peerMeanPathDelay. While the + specification of this member is retained in the + current standard, the member is renamed to + portDS.meanLinkDelay (i.e., ../mean-link-delay). + This change is consistent with other changes that + ensure clarity and consistency of naming, where + - 'path' is associated with the + request-response mechanism + - 'link' is associated with the + peer-to-peer delay mechanism"; + reference + "8.2.5.3.3 of IEEE Std 1588-2008"; + } + } + + grouping port-ds-top { + description + "Top-level container for port data set of PTP Port."; + container port-ds { + description + "Primary data set for the PTP Port."; + reference + "8.2.15 of IEEE Std 1588-2019"; + + container config { + description + "Configuration data of port data set of the clock"; + uses port-ds-config-top; + } + + container state { + description + "Operational state data of port data set of the clock"; + config false; + uses port-ds-config-top; + uses port-ds-state-top; + } + } + } + + grouping port-ds-config-top { + description + "Top-level container for configuration port data set of PTP Port."; + + leaf log-announce-interval { + type int8; + description + "Logarithm to the base 2 of the mean IEEE Std 1588 + announceInterval, the time interval between + successive Announce messages sent by a PTP Port."; + reference + "7.7.2.2 of IEEE Std 1588-2019 + 8.2.15.4.1 of IEEE Std 1588-2019"; + } + + leaf announce-receipt-timeout { + type uint8; + description + "The integral multiple of IEEE Std 1588 + announceInterval that must pass without receipt of + an Announce message before the occurrence of the + event ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES. The range + shall be 2 to 255 subject to further restrictions of + the applicable PTP Profile. While 2 is permissible, + normally the value should be at least 3."; + reference + "7.7.3.1 of IEEE Std 1588-2019 + 8.2.15.4.2 of IEEE Std 1588-2019"; + } + + leaf log-sync-interval { + type int8; + description + "Logarithm to the base 2 of the mean IEEE Std 1588 + syncInterval, the time interval between successive + Sync messages, when transmitted as multicast + messages. The rates for unicast transmissions are + negotiated separately on a per PTP Port basis and + are not constrained by this leaf."; + reference + "7.7.2.3 of IEEE Std 1588-2019 + 8.2.15.4.3 of IEEE Std 1588-2019"; + } + + leaf delay-mechanism { + type oc-ptp-types:delay-mechanism-enumeration; + description + "The path delay measuring mechanism used by the PTP + Port in computing (propagation delay)."; + reference + "8.2.15.4.4 of IEEE Std 1588-2019"; + } + + leaf log-min-pdelay-req-interval { + type int8; + description + "Logarithm to the base 2 of the IEEE Std 1588 + minPdelayReqInterval, the minimum permitted + mean time interval between successive Pdelay_Req + messages sent over a PTP Link."; + reference + "7.7.2.5 of IEEE Std 1588-2019 + 8.2.15.4.5 of IEEE Std 1588-2019"; + } + + leaf version-number { + type uint8; + description + "The PTP major version in use on the PTP Port. + NOTE - This indicates the version of the + IEEE 1588 standard, and not the version of an + applicable PTP Profile."; + reference + "8.2.15.4.6 of IEEE Std 1588-2019"; + } + + leaf log-min-delay-req-interval { + type int8; + description + "Logarithm to the base 2 of the IEEE Std 1588 + minDelayReqInterval, the minimum permitted + mean time interval between successive Delay_Req + messages sent by a Slave PTP Instance."; + reference + "7.7.2.4 of IEEE Std 1588-2019 + 8.2.15.3.2 of IEEE Std 1588-2019"; + } + + leaf unicast-multicast { + type oc-ptp-types:unicast-multicast-enumeration; + description + "Whether the network transport uses unicast or + multicast communication"; + } + } + + grouping transparent-clock-default-ds-config-top { + description + "Top-level container for configuration default data set of transparent clock."; + + leaf delay-mechanism { + type oc-ptp-types:delay-mechanism-enumeration; + description + "The propagation delay measuring mechanism (e2e or p2p)."; + reference + "8.3.2.3.1 of IEEE Std 1588-2019"; + } + + leaf primary-domain { + type uint8; + description + "The domainNumber of the primary syntonization domain."; + reference + "8.3.2.3.2 of IEEE Std 1588-2019"; + } + + leaf two-step-flag { + type boolean; + description + "When set to true, the clock is a two-step clock; + otherwise,the clock is a one-step clock."; + } + } + grouping transparent-clock-top { + description + "Top-level container for configuration and operational state data of transparent clock."; + + container transparent-clock-default-ds { + description + "This default data set was specified in + IEEE Std 1588-2008, and under some interpretations, + it applied to all domains, which in turn means that it + represents multiple Transparent Clocks. + In IEEE Std 1588-2019, this data set is specified as + applying to the PTP Node (all domains), but the data set is + deprecated. For new designs, the standard recommends that + Transparent Clocks use the PTP Instance data sets + (i.e., /ptp/instances/instance[]), such that each + Transparent Clock supports a single PTP Instance and + domain."; + reference + "8.3.1 of IEEE Std 1588-2019"; + + container config { + description + "Top-level container for configuration data of transparent clock."; + uses transparent-clock-default-ds-config-top; + } + container state { + description + "Top-level container for operational state data of transparent clock."; + + config false; + + uses transparent-clock-default-ds-config-top; + + leaf clock-identity { + type oc-ptp-types:clock-identity; + description + "The clockIdentity of the local clock."; + reference + "8.3.2.2.1 of IEEE Std 1588-2019"; + } + + leaf number-ports { + type uint16; + description + "The number of PTP Ports of the device."; + reference + "8.3.2.2.2 of IEEE Std 1588-2019"; + } + } + } + + container transparent-clock-ports { + description + "YANG container that is used to get all ports of the + IEEE Std 1588 transparentClockPortDS. + YANG does not allow get of all elements in a YANG list, + so a YANG container wrapping the YANG list is provided for + that purpose. The naming convention uses plural for the + wrapping YANG container, and singular for the YANG list."; + + list port { + description + "This list of Transparent Clock port data sets was specified + in IEEE Std 1588-2008, and under some interpretations, + it applied to all domains, which in turn means that it + represents multiple Transparent Clocks. + In IEEE Std 1588-2019, this list is specified as + applying to the PTP Node (all domains), but the list is + deprecated. For new designs, the standard recommends that + Transparent Clocks use the PTP Instance data sets + (i.e., /ptp/instances/instance[]), such that each + Transparent Clock supports a single PTP Instance + and domain."; + reference + "8.3.1 of IEEE Std 1588-2019"; + key "port-index"; + leaf port-index { + description + "The port list is indexed using a number that is + unique per PTP Port within the PTP Instance, + applicable to the management context only + (i.e., not used in PTP messages)."; + type leafref { + path "../config/port-index"; + } + } + + container config { + description + "Top-level container for configuration data of transparent clock port."; + uses port-config-top; + } + + container state { + description + "Top-level container for operational state data of transparent clock port."; + config false; + uses port-config-top; + } + + container port-ds { + description + "IEEE Std 1588 transparentClockPortDS."; + reference + "8.3.3 of IEEE Std 1588-2019"; + + container config { + description + "Configuration data of transparent clock port data set."; + uses transparent-port-ds-config-top; + } + container state { + description + "Operational state data of transparent clock port data set."; + config false; + uses transparent-port-ds-config-top; + container port-identity { + description + "The IEEE Std 1588 portIdentity of this port."; + reference + "8.3.3.2.1 of IEEE Std 1588-2019"; + uses port-identity; + } + leaf peer-mean-path-delay { + type oc-ptp-types:time-interval; + description + "An estimate of the current one-way propagation delay + on the link when the delayMechanism is P2P; otherwise, + it is zero."; + reference + "8.3.3.3.3 of IEEE Std 1588-2019"; + } + } + } + } + } + } + + grouping transparent-port-ds-config-top { + description + "Top-level container for configuration port data set of transparent clock port."; + leaf log-min-pdelay-req-interval { + type int8; + description + "The logarithm to the base 2 of the + minPdelayReqInterval (minimum permitted mean time + interval between successive Pdelay_Req messages)."; + reference + "8.3.3.3.1 of IEEE Std 1588-2019"; + } + + leaf faulty-flag { + type boolean; + description + "Shall be true if the port is faulty and false + if the port is operating normally."; + reference + "8.3.3.3.2 of IEEE Std 1588-2019"; + } + + leaf network-transport { + type oc-ptp-types:network-transport-enumeration; + description + "The network transport used for communication"; + } + } + + grouping ptp-top { + description + "Top-level grouping for PTP configuration and operational state data"; + + container ptp { + description + "Contains all YANG nodes for the PTP data sets. This hierarchy can be + augmented with YANG nodes for a specific vendor or PTP Profile."; + + container instances { + description + "YANG container that is used to get all PTP Instances. YANG does not + allow get of all elements in a YANG list, so a YANG container wrapping + the YANG list is provided for that purpose. The naming convention uses + plural for the wrapping YANG container, and singular for the YANG list."; + + list instance { + key "id"; + description + "List of one or more PTP Instances in the product (PTP Node). Each + PTP Instance represents a distinct instance of PTP implementation + (i.e. distinct Ordinary Clock, Boundary Clock, or Transparent Clock), + maintaining a distinct time. PTP Instances may be created or deleted + dynamically in implementations that support dynamic create/delete."; + reference + "8.1.4.2 of IEEE Std 1588-2019"; + + leaf id { + type leafref { + path "../config/id"; + } + description + "The instance list is indexed using a number that is unique per PTP + Instance within the PTP Node, applicable to the management context + only (i.e. not used in PTP messages). The domain-number of the PTP + Instance is not used as the key to instance-list, since it is possible + for a PTP Node to contain multiple PTP Instances using the same + domain-number."; + reference + "8.1.4.2 of IEEE Std 1588-2019"; + } + + container config { + description + "Configuration data for PTP instance."; + uses instance-config; + } + + container state { + description + "Operational state data for PTP instance."; + config false; + uses instance-state; + } + + container current-ds { + description + "Current data set state data of PTP instance."; + container state { + description + "Operational state current data set of PTP instance."; + config false; + uses current-ds-state; + } + } + container time-properties-ds { + description + "Time properties data set of PTP instance."; + container config { + description + "Configuration data of time properties data set."; + uses time-properties-ds-state; + } + + container state { + description + "Operational state data of time properties data set."; + config false; + uses time-properties-ds-state; + } + } + + uses default-ds-top; + uses parent-ds-top; + uses ports-top; + } + } + + uses transparent-clock-top; + } + } + + uses ptp-top; +} From f238a8df49e3b84cb7d3ea8b718f095a53c550b5 Mon Sep 17 00:00:00 2001 From: Darren Loher Date: Mon, 7 Oct 2024 16:08:25 -0700 Subject: [PATCH 199/201] Add aft encapsulation-headers (#1153) * Add aft encap-headers container for specifying arbitrary stacks of packet header encapsulations * Add aft encap header containers for existing encaps (ip-in-ip and gre) * Add aft encap header containers for new encaps (mpls, udpv4, udpv6) --- release/models/aft/openconfig-aft-common.yang | 334 +++++++++++++++++- .../models/aft/openconfig-aft-ethernet.yang | 8 +- release/models/aft/openconfig-aft-ipv4.yang | 8 +- release/models/aft/openconfig-aft-ipv6.yang | 8 +- release/models/aft/openconfig-aft-mpls.yang | 8 +- release/models/aft/openconfig-aft-pf.yang | 8 +- .../aft/openconfig-aft-state-synced.yang | 8 +- release/models/aft/openconfig-aft-types.yang | 12 +- release/models/aft/openconfig-aft.yang | 8 +- 9 files changed, 381 insertions(+), 21 deletions(-) diff --git a/release/models/aft/openconfig-aft-common.yang b/release/models/aft/openconfig-aft-common.yang index c69587e0f..50eac8d8f 100644 --- a/release/models/aft/openconfig-aft-common.yang +++ b/release/models/aft/openconfig-aft-common.yang @@ -23,7 +23,13 @@ submodule openconfig-aft-common { "Submodule containing definitions of groupings that are re-used across multiple contexts within the AFT model."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-09-05" { + description + "Add encap-headers to AFT model."; + reference "2.7.0"; + } revision "2024-04-25" { description @@ -217,38 +223,212 @@ submodule openconfig-aft-common { container ip-in-ip { description - "When specified, the packet has an IP-in-IP header applied to it before - forwarding to the specified next-hop."; + "When specified, the packet has an IP-in-IP header applied to it + before forwarding to the specified next-hop. + + This node must be supported in addition to the + encap-headers/encap-header tree. A future release of OpenConfig + will deprecate this node in favor of the + encap-headers/encap-header subtree."; container state { config false; description "State parameters relating to IP-in-IP encapsulation."; - uses aft-common-entry-nexthop-ipip-state; + + uses aft-common-entry-nexthop-ip-state; } } container gre { description "When specified, the packet has an GRE - (Generic Routing Encapsulation)header applied to + (Generic Routing Encapsulation) header applied to it before forwarding to the specified next-hop. encapsulate-header leaf should be set to GRE for this - to apply"; + to apply. + + This node must be supported in addition to the + encap-headers/encap-header tree. A future release of OpenConfig + will deprecate this node in favor of the + encap-headers/encap-header subtree."; container state { config false; description "State parameters relating to GRE encapsulation."; + uses aft-common-entry-nexthop-gre-state; } } + container encap-headers { + description + "Container for packet encapsulation headers. When leaves in this + container are populated, it indicates encapsulation of the packet + matching the next-hop is performed using a stack of one or more + headers defined in the list encap-header. + + Each entry in the list must indicate an encapsulation type and + populate a container with the parameters for that encapsulation + header."; + + list encap-header { + description + "A list of headers added on top of a packet ordered by the + index value. The inner-most header is the 0th value and is + adjacent to the original packet. Additional headers may be + added in index order. + + For example, in an encapsulation stack for MPLS in UDPv4, the + first index in the list is the MPLS header and the second + index is a UDPv4 header."; + + key "index"; + + leaf index { + type leafref { + path "../state/index"; + } + description + "A unique index identifying an encapsulation header in a stack + of encapsulation headers."; + } + + container state { + description + "State parameters relating to encapsulation headers."; + + uses aft-common-nexthop-encap-headers-state; + } + + container gre { + when "../state/type = 'oc-aftt:GRE'"; + description + "Container of nodes for GRE encapsulation."; + + container state { + description + "State parameters relating to GRE encapsulation headers."; + + uses aft-common-entry-nexthop-gre-state; + } + } + + container ipv4 { + when "../state/type = 'oc-aftt:IPV4'"; + description + "Container of nodes for UDP in IPv4 encapsulation. When this + container is used, an IPv4 packet with no transport header + is added to the encapsulation list."; + + container state { + description + "State parameters relating to IP encapsulation headers."; + + uses aft-common-entry-nexthop-ip-state; + } + } + + container ipv6 { + when "../state/type = 'oc-aftt:IPV6'"; + description + "Container of nodes for UDP in IPv6 encapsulation. When this + container is used, an IPv6 packet with no transport header + is added to the encapsulation list."; + + container state { + description + "State parameters relating to IP encapsulation headers."; + + uses aft-common-entry-nexthop-ip-state; + } + } + + container mpls { + when "../state/type = 'oc-aftt:MPLS'"; + description + "Container of nodes for MPLS encapsulation."; + + container state { + description + "State parameters relating to MPLS encapsulation headers."; + + uses aft-common-entry-nexthop-mpls-state; + } + } + + container udp-v4 { + when "../state/type = 'oc-aftt:UDPV4'"; + description + "Container of nodes for UDP in IPv4 encapsulation. When this + container is used, an IPv4 header with a UDP header is added + to the encapsulation list."; + + container state { + description + "State parameters relating to UDP in IPv4 encapsulation + headers."; + + uses aft-common-entry-nexthop-encap-udp-state; + } + } + + container udp-v6 { + when "../state/type = 'oc-aftt:UDPV6'"; + description + "Container of nodes for UDP in IPv6 encapsulation. When this + container is used, an IPv6 header with a UDP header is added + to the encapsulation list."; + + container state { + description + "State parameters relating to UDP in IPv6 encapsulation + headers."; + + uses aft-common-entry-nexthop-encap-udp-state; + } + } + + container vxlan { + when "../state/type = 'oc-aftt:VXLAN'"; + description + "Container of nodes for VXLAN encapsulation."; + + container state { + description + "State parameters relating to VXLAN encapsulation headers."; + + uses aft-common-entry-nexthop-vxlan-state; + } + } + + } + } + uses oc-if:interface-ref-state; } } } + grouping aft-common-nexthop-encap-headers-state { + description + "Operational state parameters relating to encapsulation headers."; + + leaf index { + type uint8; + description + "A pointer to an entry in an ordered list of encapsulation headers."; + } + + leaf type { + type oc-aftt:encapsulation-header-type; + description + "Defines which type of packet header should be used."; + } + + } + grouping aft-common-entry-state { description "Operational state parameters relating to a forwarding entry"; @@ -294,14 +474,24 @@ submodule openconfig-aft-common { "Where applicable, the next hop label representing the virtual network identifier (VNI) for the forwarding entry. This leaf is applicable only to next-hops which include VXLAN encapsulation - header information"; + header information. + + This node must be supported in addition to the + encap-headers/encap-header tree. A future release of OpenConfig + will deprecate this node in favor of the + encap-headers/encap-header subtree."; } leaf tunnel-src-ip-address { type oc-inet:ip-address; description "Where applicable this represents the vxlan tunnel source ip address. - For VXLAN this represents the source VTEP ip address"; + For VXLAN this represents the source VTEP IP address. + + This node must be supported in addition to the + encap-headers/encap-header tree. A future release of OpenConfig + will deprecate this node in favor of the + encap-headers/encap-header subtree."; } } @@ -348,7 +538,7 @@ submodule openconfig-aft-common { default false; description "Flag that controls pop action, i.e., the top-most MPLS label - should be popped from the packet when switched by the system. + should be popped from the packet when switched by the system. The top-most MPLS label associated with pop action is equal to the label key used in 'mpls' AFT 'label-entry' list."; @@ -372,8 +562,12 @@ submodule openconfig-aft-common { system re-ordering of leaves is permitted by the system. A swap operation is reflected by entries in the - popped-mpls-label-stack and pushed-mpls-label-stack nodes."; + popped-mpls-label-stack and pushed-mpls-label-stack nodes. + This node must be supported in addition to the + encap-headers/encap-header tree. A future release of OpenConfig + will deprecate this node in favor of the + encap-headers/encap-header subtree."; } leaf encapsulate-header { @@ -381,7 +575,12 @@ submodule openconfig-aft-common { description "When forwarding a packet to the specified next-hop the local system performs an encapsulation of the packet - adding the - specified header type."; + specified header type. + + This node must be supported in addition to the + encap-headers/encap-header tree. A future release of OpenConfig + will deprecate this node in favor of the + encap-headers/encap-header subtree."; } leaf decapsulate-header { @@ -399,9 +598,9 @@ submodule openconfig-aft-common { uses aft-common-install-protocol; } - grouping aft-common-entry-nexthop-ipip-state { + grouping aft-common-entry-nexthop-ip-state { description - "IP-in-IP encapsulation applied on a next-hop"; + "IP encapsulation applied on a next-hop"; leaf src-ip { type oc-inet:ip-address; @@ -444,6 +643,115 @@ submodule openconfig-aft-common { } } + grouping aft-common-entry-nexthop-mpls-state { + description + "MPLS encapsulation of a packet."; + + leaf traffic-class { + type oc-mplst:mpls-tc; + description + "The value of the MPLS traffic class (TC) bits, formerly known as the + EXP bits."; + } + + leaf-list mpls-label-stack { + type oc-mplst:mpls-label; + ordered-by user; + description + "A stack of MPLS label values. The first entry in the list is the + label at the bottom of the stack. The bottom of the stack is adjacent + to the MPLS payload. + + For example, a packet with a label stack of two labels, the bottom + label being 42 and the top label being 8072 will be represented with + a leaf-list of [42, 8072]. The resulting packet, starting with the + beginning of the packet will be '[8072][42][Payload]'. + + Note: a swap operation is reflected by entries in the + popped-mpls-label-stack and the pushed-mpls-label-stack"; + } + } + + + grouping aft-common-entry-nexthop-encap-udp-state { + description + "UDP encapsulation applied on top of a packet."; + + leaf src-ip { + type oc-inet:ip-address; + description + "The source IP address for IP/UDP encapsulation."; + } + + leaf dst-ip { + type oc-inet:ip-address; + description + "Destination IP address for IP/UDP encapsulation."; + } + + leaf dscp { + type oc-inet:dscp; + description + "DSCP value to use for the UDP header of the encapsulated + packet."; + } + + leaf src-udp-port { + type oc-inet:port-number; + description + "Source UDP port number to use for the UDP header of the encapsulated + packet. The source UDP port should be derived from the payload + packet entropy. The exact methodology is implementation dependent, + but for example, the port could be derived from an entropy hash of + the payload or the source port (if present) of the payload."; + } + + leaf dst-udp-port { + type oc-inet:port-number; + description + "Source UDP port number to use for the UDP header of the encapsulated + packet. + + When the payload packet is MPLS, then RFC 7510 - Encapsulating MPLS + in UDP should be followed."; + reference + "RFC 7510 - Encapsulating MPLS in UDP specifies that 6635 must be + used for MPLS-in-UDP and 6636 must be used for MPLS-in-UDP with DTLS. + Because of this condition, no default is defined in OpenConfig. The + system is expected to utilize the appropriate port."; + } + + leaf ip-ttl { + type uint8; + description + "This leaf reflects the configured/default IP TTL value that is used + in the outer header during packet encapsulation. When this leaf is + not set, the TTL value of the inner packet is copied over as the + outer packet's IP TTL value during encapsulation."; + } + } + + grouping aft-common-entry-nexthop-vxlan-state { + description + "VXLAN encapsulation applied on top of a packet."; + + leaf vni-label { + type oc-evpn-types:evi-id; + description + "Where applicable, the next hop label representing the virtual + network identifier (VNI) for the forwarding entry. This leaf is + applicable only to next-hops which include VXLAN encapsulation + header information"; + } + + leaf tunnel-src-ip-address { + type oc-inet:ip-address; + description + "Where applicable this represents the vxlan tunnel source ip address. + For VXLAN this represents the source VTEP ip address"; + } + } + grouping aft-common-install-protocol { description "Grouping for a common reference to the protocol which diff --git a/release/models/aft/openconfig-aft-ethernet.yang b/release/models/aft/openconfig-aft-ethernet.yang index b2c0758df..3fbe6edab 100644 --- a/release/models/aft/openconfig-aft-ethernet.yang +++ b/release/models/aft/openconfig-aft-ethernet.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ethernet { "Submodule containing definitions of groupings for the abstract forwarding tables for Ethernet."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-07-18" { + description + "Add container for mpls-in-udp under next-hops aft entry state."; + reference "2.7.0"; + } revision "2024-04-25" { description diff --git a/release/models/aft/openconfig-aft-ipv4.yang b/release/models/aft/openconfig-aft-ipv4.yang index d582b2ad7..87fb7e6fa 100644 --- a/release/models/aft/openconfig-aft-ipv4.yang +++ b/release/models/aft/openconfig-aft-ipv4.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ipv4 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv4."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-09-05" { + description + "Add encapsulate-stack under aft next-hops."; + reference "2.7.0"; + } revision "2024-04-25" { description diff --git a/release/models/aft/openconfig-aft-ipv6.yang b/release/models/aft/openconfig-aft-ipv6.yang index c8aede635..765830cd5 100644 --- a/release/models/aft/openconfig-aft-ipv6.yang +++ b/release/models/aft/openconfig-aft-ipv6.yang @@ -20,7 +20,13 @@ submodule openconfig-aft-ipv6 { "Submodule containing definitions of groupings for the abstract forwarding tables for IPv6."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-07-18" { + description + "Add container for mpls-in-udp under next-hops aft entry state."; + reference "2.7.0"; + } revision "2024-04-25" { description diff --git a/release/models/aft/openconfig-aft-mpls.yang b/release/models/aft/openconfig-aft-mpls.yang index 2418a5a9e..c99e1c58f 100644 --- a/release/models/aft/openconfig-aft-mpls.yang +++ b/release/models/aft/openconfig-aft-mpls.yang @@ -21,7 +21,13 @@ submodule openconfig-aft-mpls { "Submodule containing definitions of groupings for the abstract forwarding table for MPLS label forwarding."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-09-05" { + description + "Add encapsulate-stack under aft next-hops."; + reference "2.7.0"; + } revision "2024-04-25" { description diff --git a/release/models/aft/openconfig-aft-pf.yang b/release/models/aft/openconfig-aft-pf.yang index 8f0d5a243..9980ad5f0 100644 --- a/release/models/aft/openconfig-aft-pf.yang +++ b/release/models/aft/openconfig-aft-pf.yang @@ -28,7 +28,13 @@ submodule openconfig-aft-pf { fields other than the destination address that is used in other forwarding tables."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-07-18" { + description + "Add container for mpls-in-udp under next-hops aft entry state."; + reference "2.7.0"; + } revision "2024-04-25" { description diff --git a/release/models/aft/openconfig-aft-state-synced.yang b/release/models/aft/openconfig-aft-state-synced.yang index 3e0950826..fbe6eb5ca 100644 --- a/release/models/aft/openconfig-aft-state-synced.yang +++ b/release/models/aft/openconfig-aft-state-synced.yang @@ -16,7 +16,13 @@ submodule openconfig-aft-state-synced { "Submodule containing definitions of groupings for the state synced signals corresponding to various abstract forwarding tables."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-07-18" { + description + "Add container for mpls-in-udp under next-hops aft entry state."; + reference "2.7.0"; + } revision "2024-04-25" { description diff --git a/release/models/aft/openconfig-aft-types.yang b/release/models/aft/openconfig-aft-types.yang index 4b7fc8f64..56d920b5f 100644 --- a/release/models/aft/openconfig-aft-types.yang +++ b/release/models/aft/openconfig-aft-types.yang @@ -16,7 +16,13 @@ module openconfig-aft-types { "Types related to the OpenConfig Abstract Forwarding Table (AFT) model"; - oc-ext:openconfig-version "1.1.0"; + oc-ext:openconfig-version "1.2.0"; + + revision "2024-07-18" { + description + "Add MPLS in UDP enums for encapsulate-header."; + reference "1.2.0"; + } revision "2022-05-05" { description @@ -89,6 +95,10 @@ module openconfig-aft-types { description "The encapsulation header is a VXLAN packet header"; } + enum UDP { + description + "The encapsulation header is UDP packet header."; + } } description "Types of tunnel encapsulation that are supported by systems as either diff --git a/release/models/aft/openconfig-aft.yang b/release/models/aft/openconfig-aft.yang index d1af3e977..de3ce202e 100644 --- a/release/models/aft/openconfig-aft.yang +++ b/release/models/aft/openconfig-aft.yang @@ -42,7 +42,13 @@ module openconfig-aft { is referred to as an Abstract Forwarding Table (AFT), rather than the FIB."; - oc-ext:openconfig-version "2.6.0"; + oc-ext:openconfig-version "2.7.0"; + + revision "2024-09-05" { + description + "Add encapsulate-stack under aft next-hops."; + reference "2.7.0"; + } revision "2024-04-25" { description From 868ab347282a6772921ba06df50c3a2be667ceb4 Mon Sep 17 00:00:00 2001 From: Ravi Verman <80886094+raviv-arista@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:41:23 +0530 Subject: [PATCH 200/201] Added PIM bidirectional mode to the PIM_MODE type (#1118). (#1119) Co-authored-by: Darren Loher --- .../models/multicast/openconfig-pim-types.yang | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/release/models/multicast/openconfig-pim-types.yang b/release/models/multicast/openconfig-pim-types.yang index a1fc515cf..9e2aeac1c 100644 --- a/release/models/multicast/openconfig-pim-types.yang +++ b/release/models/multicast/openconfig-pim-types.yang @@ -21,7 +21,13 @@ module openconfig-pim-types { description "This module defines types related to the PIM protocol model."; - oc-ext:openconfig-version "0.1.1"; + oc-ext:openconfig-version "0.1.2"; + + revision "2024-05-31" { + description + "Add PIM bidirectional mode."; + reference "0.1.2"; + } revision "2018-11-21" { description @@ -62,6 +68,13 @@ module openconfig-pim-types { reference "RFC3973"; } + identity PIM_MODE_BIDIR { + base PIM_MODE; + description + "PIM bidirectional mode."; + reference "RFC5015"; + } + // typedef statements typedef dr-priority-type { From b0ef7797a2f04bd2b4fe89782c09a538c72c6e1b Mon Sep 17 00:00:00 2001 From: Eric Breverman Date: Tue, 15 Oct 2024 09:16:21 -0700 Subject: [PATCH 201/201] Define how physical channel power leaves are used. (#1189) Co-authored-by: Darren Loher --- .../openconfig-platform-transceiver.yang | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/release/models/platform/openconfig-platform-transceiver.yang b/release/models/platform/openconfig-platform-transceiver.yang index 81a6e7031..e60220563 100644 --- a/release/models/platform/openconfig-platform-transceiver.yang +++ b/release/models/platform/openconfig-platform-transceiver.yang @@ -66,7 +66,13 @@ module openconfig-platform-transceiver { specify a physical-channel within a TRANSCEIVER component (i.e. gray optic) that it is associated with."; - oc-ext:openconfig-version "0.14.0"; + oc-ext:openconfig-version "0.15.0"; + +revision "2024-09-21" { + description + "Clearly define how physical channel power leaves are used."; + reference "0.15.0"; + } revision "2023-08-30" { description @@ -204,7 +210,11 @@ revision "2023-08-30" { Values include the instantaneous, average, minimum, and maximum statistics. If avg/min/max statistics are not supported, the target is expected to just supply the - instant value"; + instant value. In some cases, such as when the physical + channel has a leafref to an optical channel component and the + module-functional-type is TYPE_DIGITAL_COHERENT_OPTIC this + grouping will NOT be used as the data will be within the + optical-channel"; uses oc-types:avg-min-max-instant-stats-precision2-dBm; } @@ -221,7 +231,12 @@ revision "2023-08-30" { Values include the instantaneous, average, minimum, and maximum statistics. If avg/min/max statistics are not supported, the target is expected to just supply the - instant value"; + instant value. When the physical channel has a leafref to + an optical channel component and the module-functional-type is + TYPE_DIGITAL_COHERENT_OPTIC this represents the aggregate + total optical power value (signal and noise) whereas + optical power value within the optical-channel represents + the signal power"; uses oc-types:avg-min-max-instant-stats-precision2-dBm; } @@ -233,7 +248,11 @@ revision "2023-08-30" { with up to two decimal precision. Values include the instantaneous, average, minimum, and maximum statistics. If avg/min/max statistics are not supported, the target is - expected to just supply the instant value"; + expected to just supply the instant value. In some cases, + such as when the physical channel has a leafref to an optical + channel component and the module-functional-type is + TYPE_DIGITAL_COHERENT_OPTIC this grouping will NOT be used + as the data will be within the optical-channel"; uses oc-types:avg-min-max-instant-stats-precision2-mA; } @@ -251,7 +270,11 @@ revision "2023-08-30" { "The frequency in MHz of the individual physical channel (e.g. ITU C50 - 195.0THz and would be reported as 195,000,000 MHz in this model). This attribute is not - configurable on most client ports."; + configurable on most client ports In some cases, such as when + the physical channel has a leafref to an optical channel + component and the module-functional-type is + TYPE_DIGITAL_COHERENT_OPTIC this grouping will NOT be used + as the data will be within the optical-channel."; } } @@ -384,24 +407,6 @@ revision "2023-08-30" { uses oc-opt-types:avg-min-max-instant-stats-precision2-pct; } - uses physical-channel-state-extended { - when "../../../state/module-functional-type = 'oc-opt-types:TYPE_STANDARD_OPTIC'" { - description - "When the physical channel is of TYPE_STANDARD_OPTIC, the - extended state will be used"; - } - } - } - - grouping physical-channel-state-extended { - description - "Extended operational state data for physical client channels - for applications where the full physical channel config and - state are used. In some cases, such as when the physical - channel has a leafref to an optical channel component and the - module-functional-type is TYPE_DIGITAL_COHERENT_OPTIC this - grouping will NOT be used."; - uses output-optical-frequency; uses optical-power-state; }