< draft-ietf-netmod-yang-module-versioning-02.txt   draft-ietf-netmod-yang-module-versioning-03.txt >
Network Working Group R. Wilton, Ed. Network Working Group R. Wilton, Ed.
Internet-Draft Cisco Systems, Inc. Internet-Draft Cisco Systems, Inc.
Updates: 7950,8407,8525 (if approved) R. Rahman, Ed. Updates: 7950,8407,8525 (if approved) R. Rahman, Ed.
Intended status: Standards Track Intended status: Standards Track
Expires: August 26, 2021 B. Lengyel, Ed. Expires: January 13, 2022 B. Lengyel, Ed.
Ericsson Ericsson
J. Clarke J. Clarke
Cisco Systems, Inc. Cisco Systems, Inc.
J. Sterne J. Sterne
Nokia Nokia
B. Claise July 12, 2021
Huawei
K. D'Souza
AT&T
February 22, 2021
Updated YANG Module Revision Handling Updated YANG Module Revision Handling
draft-ietf-netmod-yang-module-versioning-02 draft-ietf-netmod-yang-module-versioning-03
Abstract Abstract
This document specifies a new YANG module update procedure that can This document specifies a new YANG module update procedure that can
document when non-backwards-compatible changes have occurred during document when non-backwards-compatible changes have occurred during
the evolution of a YANG module. It extends the YANG import statement the evolution of a YANG module. It extends the YANG import statement
with an earliest revision filter to better represent inter-module with an earliest revision filter to better represent inter-module
dependencies. It provides help and guidelines for managing the dependencies. It provides help and guidelines for managing the
lifecycle of YANG modules and individual schema nodes. It provides a lifecycle of YANG modules and individual schema nodes. It provides a
mechanism, via the revision-label YANG extension, to specify a mechanism, via the revision-label YANG extension, to specify a
revision identifier for YANG modules. This document updates RFC revision identifier for YANG modules and submodules. This document
7950, RFC 8407 and RFC 8525. updates RFC 7950, RFC 8407 and RFC 8525.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79. provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on August 26, 2021. This Internet-Draft will expire on January 13, 2022.
Copyright Notice Copyright Notice
Copyright (c) 2021 IETF Trust and the persons identified as the Copyright (c) 2021 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 27 skipping to change at page 2, line 27
the Trust Legal Provisions and are provided without warranty as the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License. described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Updates to YANG RFCs . . . . . . . . . . . . . . . . . . 4 1.1. Updates to YANG RFCs . . . . . . . . . . . . . . . . . . 4
2. Terminology and Conventions . . . . . . . . . . . . . . . . . 4 2. Terminology and Conventions . . . . . . . . . . . . . . . . . 4
3. Refinements to YANG revision handling . . . . . . . . . . . . 5 3. Refinements to YANG revision handling . . . . . . . . . . . . 5
3.1. Updating a YANG module with a new revision . . . . . . . 6 3.1. Updating a YANG module with a new revision . . . . . . . 6
3.1.1. Backwards-compatible rules for config data . . . . . 6 3.1.1. Backwards-compatible rules . . . . . . . . . . . . . 6
3.1.2. Backwards-compatibility rules for config false and 3.1.2. Non-backwards-compatible changes . . . . . . . . . . 7
output data . . . . . . . . . . . . . . . . . . . . . 7 3.2. non-backwards-compatible revision extension statement . . 7
3.1.3. Non-backwards-compatible changes . . . . . . . . . . 8 3.3. Removing revisions from the revision history . . . . . . 7
3.2. nbc-changes revision extension statement . . . . . . . . 8 3.4. Revision label . . . . . . . . . . . . . . . . . . . . . 8
3.3. Revision label . . . . . . . . . . . . . . . . . . . . . 8 3.4.1. File names . . . . . . . . . . . . . . . . . . . . . 8
3.3.1. Revision label scheme extension statement . . . . . . 10 3.4.2. Revision label scheme extension statement . . . . . . 9
3.3.2. Removing revisions from the revision history . . . . 10 3.5. Examples for updating the YANG module revision history . 9
3.4. Examples for updating the YANG module revision history . 10 4. Import by derived revision . . . . . . . . . . . . . . . . . 12
4. Import by derived revision . . . . . . . . . . . . . . . . . 13 4.1. Module import examples . . . . . . . . . . . . . . . . . 14
4.1. Module import examples . . . . . . . . . . . . . . . . . 15 5. Updates to ietf-yang-library . . . . . . . . . . . . . . . . 15
5. Updates to ietf-yang-library . . . . . . . . . . . . . . . . 16 5.1. Resolving ambiguous module imports . . . . . . . . . . . 15
5.1. Resolving ambiguous module imports . . . . . . . . . . . 16 5.2. YANG library versioning augmentations . . . . . . . . . . 16
5.2. YANG library versioning augmentations . . . . . . . . . . 17 5.2.1. Advertising revision-label . . . . . . . . . . . . . 16
5.2.1. Advertising revision-label . . . . . . . . . . . . . 17
5.2.2. Reporting how deprecated and obsolete nodes are 5.2.2. Reporting how deprecated and obsolete nodes are
handled . . . . . . . . . . . . . . . . . . . . . . . 17 handled . . . . . . . . . . . . . . . . . . . . . . . 16
6. Versioning of YANG instance data . . . . . . . . . . . . . . 18 6. Versioning of YANG instance data . . . . . . . . . . . . . . 17
7. Guidelines for using the YANG module update rules . . . . . . 18 7. Guidelines for using the YANG module update rules . . . . . . 17
7.1. Guidelines for YANG module authors . . . . . . . . . . . 18 7.1. Guidelines for YANG module authors . . . . . . . . . . . 17
7.1.1. Making non-backwards-compatible changes to a YANG 7.1.1. Making non-backwards-compatible changes to a YANG
module . . . . . . . . . . . . . . . . . . . . . . . 19 module . . . . . . . . . . . . . . . . . . . . . . . 18
7.2. Versioning Considerations for Clients . . . . . . . . . . 20 7.2. Versioning Considerations for Clients . . . . . . . . . . 20
8. Module Versioning Extension YANG Modules . . . . . . . . . . 21 8. Module Versioning Extension YANG Modules . . . . . . . . . . 20
9. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 29 9. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 29
10. Security Considerations . . . . . . . . . . . . . . . . . . . 29 10. Security Considerations . . . . . . . . . . . . . . . . . . . 30
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30
11.1. YANG Module Registrations . . . . . . . . . . . . . . . 30 11.1. YANG Module Registrations . . . . . . . . . . . . . . . 30
11.2. Guidance for versioning in IANA maintained YANG modules 30 11.2. Guidance for versioning in IANA maintained YANG modules 31
12. References . . . . . . . . . . . . . . . . . . . . . . . . . 31 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 32
12.1. Normative References . . . . . . . . . . . . . . . . . . 31 12.1. Normative References . . . . . . . . . . . . . . . . . . 32
12.2. Informative References . . . . . . . . . . . . . . . . . 32 12.2. Informative References . . . . . . . . . . . . . . . . . 33
Appendix A. Examples of changes that are NBC . . . . . . . . . . 34 Appendix A. Examples of changes that are NBC . . . . . . . . . . 34
Appendix B. Examples of applying the NBC change guidelines . . . 34 Appendix B. Examples of applying the NBC change guidelines . . . 35
B.1. Removing a data node . . . . . . . . . . . . . . . . . . 34 B.1. Removing a data node . . . . . . . . . . . . . . . . . . 35
B.2. Changing the type of a leaf node . . . . . . . . . . . . 35 B.2. Changing the type of a leaf node . . . . . . . . . . . . 36
B.3. Reducing the range of a leaf node . . . . . . . . . . . . 36 B.3. Reducing the range of a leaf node . . . . . . . . . . . . 37
B.4. Changing the key of a list . . . . . . . . . . . . . . . 36 B.4. Changing the key of a list . . . . . . . . . . . . . . . 37
B.5. Renaming a node . . . . . . . . . . . . . . . . . . . . . 37 B.5. Renaming a node . . . . . . . . . . . . . . . . . . . . . 38
B.6. Changing a default value . . . . . . . . . . . . . . . . 38 B.6. Changing a default value . . . . . . . . . . . . . . . . 39
Appendix C. Changes between revisions . . . . . . . . . . . . . 38 Appendix C. Changes between revisions . . . . . . . . . . . . . 39
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 39 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 39
1. Introduction 1. Introduction
This document defines a solution to the YANG module lifecycle This document defines a solution to the YANG module lifecycle
problems described in [I-D.ietf-netmod-yang-versioning-reqs]. problems described in [I-D.ietf-netmod-yang-versioning-reqs].
Complementary documents provide a complete solution to the YANG Complementary documents provide a complete solution to the YANG
versioning requirements, with the overall relationship of the versioning requirements, with the overall relationship of the
solution drafts described in [I-D.ietf-netmod-yang-solutions]. solution drafts described in [I-D.ietf-netmod-yang-solutions].
skipping to change at page 3, line 49 skipping to change at page 3, line 48
Refinements to the YANG 1.1 module revision update procedure, Refinements to the YANG 1.1 module revision update procedure,
supported by new extension statements to indicate when a revision supported by new extension statements to indicate when a revision
contains non-backwards-compatible changes, and an optional contains non-backwards-compatible changes, and an optional
revision label. revision label.
A YANG extension statement allowing YANG module imports to specify A YANG extension statement allowing YANG module imports to specify
an earliest module revision that may satisfy the import an earliest module revision that may satisfy the import
dependency. dependency.
Updates and augmentations to ietf-yang-library to include the Updates and augmentations to ietf-yang-library to include the
revision label in the module descriptions, to report how revision label in the module and submodule descriptions, to report
"deprecated" and "obsolete" nodes are handled by a server, and to how "deprecated" and "obsolete" nodes are handled by a server, and
clarify how module imports are resolved when multiple revisions to clarify how module imports are resolved when multiple revisions
could otherwise be chosen. could otherwise be chosen.
Considerations of how versioning applies to YANG instance data. Considerations of how versioning applies to YANG instance data.
Guidelines for how the YANG module update rules defined in this Guidelines for how the YANG module update rules defined in this
document should be used, along with examples. document should be used, along with examples.
Note to RFC Editor (To be removed by RFC Editor) Note to RFC Editor (To be removed by RFC Editor)
Open issues are tracked at <https://github.com/netmod-wg/yang-ver-dt/ Open issues are tracked at <https://github.com/netmod-wg/yang-ver-dt/
issues>. issues>.
1.1. Updates to YANG RFCs 1.1. Updates to YANG RFCs
This document updates [RFC7950] section 11. Section 3 describes This document updates [RFC7950] section 11. Section 3 describes
modifications to YANG revision handling and update rules, and modifications to YANG revision handling and update rules, and
Section 4 describes a YANG extension statement to do import by Section 4 describes a YANG extension statement to do import by
derived revision. derived revision.
This document updates [RFC7950] section 5.2. Section 3.4.1 describes
the use of a revision label in the name of a file containing a YANG
module or submodule.
This document updates [RFC7950] section 5.6.5. Section 5.1 defines This document updates [RFC7950] section 5.6.5. Section 5.1 defines
how a client of a YANG library datastore schema resolves ambiguous how a client of a YANG library datastore schema resolves ambiguous
imports for modules which are not "import-only". imports for modules which are not "import-only".
This document updates [RFC8407] section 4.7. Section 7 provides This document updates [RFC8407] section 4.7. Section 7 provides
guidelines on managing the lifecycle of YANG modules that may contain guidelines on managing the lifecycle of YANG modules that may contain
non-backwards-compatible changes and a branched revision history. non-backwards-compatible changes and a branched revision history.
This document updates [RFC7950] section 5.2. Section 3.3 describes This document updates [RFC8525] with augmentations to include
the use of a revision label in the name of a file containing a YANG revision labels in the YANG library data and two boolean leaves to
module or submodule. indicate whether status deprecated and status obsolete schema nodes
are implemented by the server.
2. Terminology and Conventions 2. Terminology and Conventions
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP "OPTIONAL" in this document are to be interpreted as described in BCP
14 [RFC2119] [RFC8174] when, and only when, they appear in all 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here. capitals, as shown here.
In addition, this document uses the terminology: In addition, this document uses the terminology:
skipping to change at page 5, line 10 skipping to change at page 5, line 10
o YANG module revision: An instance of a YANG module, uniquely o YANG module revision: An instance of a YANG module, uniquely
identified with a revision date, with no implied ordering or identified with a revision date, with no implied ordering or
backwards compatibility between different revisions of the same backwards compatibility between different revisions of the same
module. module.
o Backwards-compatible (BC) change: A backwards-compatible change o Backwards-compatible (BC) change: A backwards-compatible change
between two YANG module revisions, as defined in Section 3.1.1 between two YANG module revisions, as defined in Section 3.1.1
o Non-backwards-compatible (NBC) change: A non-backwards-compatible o Non-backwards-compatible (NBC) change: A non-backwards-compatible
change between two YANG module revisions, as defined in change between two YANG module revisions, as defined in
Section 3.1.3 Section 3.1.2
o Valuespace: The valuespace of a leaf or leaf-list is the set of
values that the schema node may have according to the type and
constraint statements of the YANG model.
3. Refinements to YANG revision handling 3. Refinements to YANG revision handling
[RFC7950] assumes, but does not explicitly state, that the revision [RFC7950] assumes, but does not explicitly state, that the revision
history for a YANG module is strictly linear, i.e., it is prohibited history for a YANG module or submodule is strictly linear, i.e., it
to have two independent revisions of a YANG module that are both is prohibited to have two independent revisions of a YANG module or
directly derived from the same parent revision. submodule that are both directly derived from the same parent
revision.
This document clarifies [RFC7950] to explicitly allow non linear This document clarifies [RFC7950] to explicitly allow non-linear
development of YANG module revisions, so modules MAY have multiple development of YANG module and submodule revisions, so that they MAY
revisions that directly derive from the same parent revision. As per have multiple revisions that directly derive from the same parent
[RFC7950], YANG module revisions continue to be uniquely identified revision. As per [RFC7950], YANG module and submodule revisions
by the module's revision date, and hence all revisions of a module continue to be uniquely identified by their revision date, and hence
MUST have unique revision dates. all revisions of a given module or submodule MUST have unique
revision dates.
A corollary to the above is that the relationship between two module A corollary to the above is that the relationship between two module
revisions cannot be determined by comparing the module revision date or submodule revisions cannot be determined by comparing the module
alone, and the revision history, or revision label, must also be or submodule revision date alone, and the revision history, or
taken into consideration. revision label, must also be taken into consideration.
A module's name and revision date identifies a specific immutable A module's name and revision date identifies a specific immutable
definition of that module within its revision history. Hence, if a definition of that module within its revision history. Hence, if a
module includes submodules then to ensure that the module's content module includes submodules then to ensure that the module's content
is uniquely defined, the module's "include" statements SHOULD use is uniquely defined, the module's "include" statements SHOULD use
"revision-date" substatements to specify the exact revision date of "revision-date" substatements to specify the exact revision date of
each included submodule. When a module does not include its each included submodule. When a module does not include its
submodules by revision-date, the revision of submodules used cannot submodules by revision-date, the revision of submodules used cannot
be derived from the including module. Mechanisms such as YANG be derived from the including module. Mechanisms such as YANG
packages [I-D.ietf-netmod-yang-packages], and YANG library [[RFC7895] packages [I-D.ietf-netmod-yang-packages], and YANG library [RFC7895]
[RFC8525], MAY be used to specify the exact submodule revisions used [RFC8525], MAY be used to specify the exact submodule revisions used
when the submodule revision date is not constrained by the "include" when the submodule revision date is not constrained by the "include"
statement. statement.
[RFC7950] section 11 requires that all updates to a YANG module are [RFC7950] section 11 requires that all updates to a YANG module are
BC to the previous revision of the module. This document allows for BC to the previous revision of the module. This document introduces
more flexible evolution of YANG modules: NBC changes between module a method to indicate that an NBC change has occurred between module
revisions are allowed and are documented using a new "nbc-changes" revisions: this is done by using a new "non-backwards-compatible"
YANG extension statement in the module revision history. YANG extension statement in the module revision history.
Two revisions of a module MAY have identical content except for the Two revisions of a module or submodule MAY have identical content
revision history. This could occur, for example, if a module has a except for the revision history. This could occur, for example, if a
branched history and identical changes are applied in multiple module or submodule has a branched history and identical changes are
branches. applied in multiple branches.
3.1. Updating a YANG module with a new revision 3.1. Updating a YANG module with a new revision
This section updates [RFC7950] section 11 to refine the rules for This section updates [RFC7950] section 11 to refine the rules for
permissible changes when a new YANG module revision is created. permissible changes when a new YANG module revision is created.
Where pragmatic, updates to YANG modules SHOULD be backwards- Where pragmatic, updates to YANG modules SHOULD be backwards-
compatible, following the definition in Section 3.1.1. compatible, following the definition in Section 3.1.1.
A new module revision MAY contain NBC changes, i.e., the semantics of A new module revision MAY contain NBC changes, e.g., the semantics of
an existing definition MAY be changed in an NBC way without requiring an existing data-node definition MAY be changed in an NBC manner
a new definition with a new identifier. A new module revision with without requiring a new data-node definition with a new identifier.
NBC changes MUST include the "rev:nbc-changes" extension substatement A YANG extension, defined in Section 3.2, is used to signal the
to signal the potential for incompatibility to existing module users potential for incompatibility to existing module users and readers.
and readers.
3.1.1. Backwards-compatible rules for config data As per [RFC7950], all published revisions of a module are given a new
unique revision date. This applies even for module revisions
containing (in the module or included submodules) only changes to any
whitespace, formatting, comments or line endings (e.g., DOS vs UNIX).
3.1.1. Backwards-compatible rules
A change between two module revisions is defined as being "backwards- A change between two module revisions is defined as being "backwards-
compatible" if the change conforms to the module update rules compatible" if the change conforms to the module update rules
specified in [RFC7950] section 11, updated by the following rules: specified in [RFC7950] section 11, updated by the following rules:
o A "status" "deprecated" statement MAY be added, or changed from o A "status" "deprecated" statement MAY be added, or changed from
"current" to "deprecated", but adding or changing "status" to "current" to "deprecated", but adding or changing "status" to
"obsolete" is not a backwards-compatible change. "obsolete" is not a backwards-compatible change.
o Obsolete definitions MAY be removed from published modules, and o YANG schema nodes with a "status" "obsolete" substatement MAY be
are classified as backwards-compatible changes. In some removed from published modules, and are classified as backwards-
circumstances it may be helpful to retain the obsolete definitions compatible changes. In some circumstances it may be helpful to
to ensure that their identifiers are not reused with a different retain the obsolete definitions to ensure that their identifiers
meaning. are not reused with a different meaning.
o In statements that have any data definition statements as o In statements that have any data definition statements as
substatements, those data definition substatements MAY be substatements, those data definition substatements MAY be
reordered, as long as they do not change the ordering of any reordered, as long as they do not change the ordering of any
"input" or "output" data definition substatements of "rpc" or "input" or "output" data definition substatements of "rpc" or
"action" statements. If new data definition statements are added, "action" statements. If new data definition statements are added,
they can be added anywhere in the sequence of existing they can be added anywhere in the sequence of existing
substatements. substatements.
o Any changes (including whitespace or formatting changes) that do o Any changes (including whitespace or formatting changes) that do
not change the semantic meaning of the module are backwards not change the semantic meaning of the module are backwards
compatible. compatible.
3.1.2. Backwards-compatibility rules for config false and output data o A statement that is defined using the YANG "extension" statement
MAY be added, removed, or changed, if it does not change the
Compatibility behavior of configuration and state data is different. semantics of the module. Extension statement definitions SHOULD
While adding a mandatory configuration leaf makes earlier specify whether adding, removing, or changing statements defined
configurations invalid, an additional state leaf can easily be by that extension are backwards-compatible or non-backwards-
discarded. Decreasing the valuespace of a configuration leaf makes compatible.
any configuration invalid that uses the newly excluded values;
decreasing the valuespace of a state schema node should not disturb a
client application. Data in the output section of notifications,
actions or rpcs is governed by the same backwards compatibility
behavior as config=false data.
While incoming configuration data is checked according to YANG
constraints, constraints on state data sent by the server MAY or MAY
NOT be enforced. The following guidelines are provided for client
application designers to allow a smooth interworking with servers.
o A client MUST tolerate any data received (or not received) without
crashing.
o A client MUST be able to discard any data that is not part of the
model but is sent by the server additionally (e.g. XML elements
or attributes, JSON properties).
o A client SHOULD be able to handle valid parts of a received data
set even if it discards other parts as invalid.
o A client SHOULD be able to handle data that is outside the
valuespace defined, as long as it is of the same basic type.
o A client SHOULD be prepared to handle more items for a list or
leaf-list than what is defined by the model.
Based on the above client guidelines and the intent to allow the
correct and flexible handling of state and output data even after
module revision changes the following rules define which config false
and output schema changes are considered BC or NBC. The rules
reflect common client behavior, however a client that expects a
specific server behavior or data set may have problems with any
change. The rules are defined as a compromise between protecting
client applications and allowing the most common changes.
o Adding mandatory or optional schema nodes is BC
o Changing an optional schema node to mandatory is BC
o Removal of a mandatory or optional schema node is NBC
o Changing a mandatory schema node to optional is NBC
o Expanding the valuespace of a leaf or leaf-list is BC. Change of
the valuespace may be the result of a change to a range, length,
pattern, base, enum, bit, require-instance or must statements.
o Decreasing the valuespace of a leaf or leaf-list is BC
o Changing max-elements is BC
o Increasing min-element is BC
o Changing min-elements to a lower value is NBC (it is like removing
mandatory)
o Modifying the type of a leaf or leaf-list is NBC
3.1.3. Non-backwards-compatible changes 3.1.2. Non-backwards-compatible changes
Any changes to YANG modules that are not defined by Section 3.1.1 or Any changes to YANG modules that are not defined by Section 3.1.1 as
Section 3.1.2 as being backwards-compatible are classified as "non- being backwards-compatible are classified as "non-backwards-
backwards-compatible" changes. compatible" changes.
3.2. nbc-changes revision extension statement 3.2. non-backwards-compatible revision extension statement
The "rev:nbc-changes" extension statement is used to indicate YANG The "rev:non-backwards-compatible" extension statement is used to
module revisions that contain NBC changes. indicate YANG module revisions that contain NBC changes.
If a revision of a YANG module contains changes, relative to the If a revision of a YANG module contains changes, relative to the
preceding revision in the revision history, that do not conform to preceding revision in the revision history, that do not conform to
the module update rules defined in Section 3.1.1 or Section 3.1.2, the module update rules defined in Section 3.1.1, then a "rev:non-
then a "rev:nbc-changes" extension statement MUST be added as a backwards-compatible" extension statement MUST be added as a
substatement to the "revision" statement. substatement to the "revision" statement.
Conversely, if a revision does not contain an "rev:nbc-changes" 3.3. Removing revisions from the revision history
extension substatement then all changes, relative to the preceding
revision in the revision history, MUST be backwards-compatible.
3.3. Revision label Authors may wish to remove revision statements from a module or
submodule. Removal of revision information may be desired for a
number of reasons including reducing the size of a large revision
history, or removing a revision that should no longer be used or
imported. Removing revision statements is allowed, but can cause
issues and SHOULD NOT be done without careful analysis of the
potential impact to users of the module or submodule. Doing so can
lead to import breakages when import by revision-or-derived is used.
Moreover, truncating history may cause loss of visibility of when
non-backwards-compatible changes were introduced.
This section updates [RFC7950] section 5.2, it explains how a If a revision containing a rev:non-backwards-compatible substatement
revision label can be used in the name of a file containing a YANG is removed from the revision history then a rev:non-backwards-
module or submodule. compatible substatement MUST be added to the nearest newer revision
entry in the revision history that is not being removed.
3.4. Revision label
Each revision entry in a module or submodule MAY have a revision Each revision entry in a module or submodule MAY have a revision
label associated with it, providing an alternative alias to identify label associated with it, providing an alternative alias to identify
a particular revision of a module or submodule. The revision label a particular revision of a module or submodule. The revision label
could be used to provide an additional versioning identifier could be used to provide an additional versioning identifier
associated with the revision. associated with the revision.
YANG Semver [I-D.ietf-netmod-yang-semver] defines a versioning scheme YANG Semver [I-D.ietf-netmod-yang-semver] defines a versioning scheme
based on Semver 2.0.0 [semver] that can be used as a revision label. based on Semver 2.0.0 [semver] that can be used as a revision label.
skipping to change at page 9, line 24 skipping to change at page 8, line 30
The revision label space of submodules is separate from the revision The revision label space of submodules is separate from the revision
label space of the including module. A change in one submodule MUST label space of the including module. A change in one submodule MUST
result in a new revision label of that submodule and the including result in a new revision label of that submodule and the including
module, but the actual values of the revision labels in the module module, but the actual values of the revision labels in the module
and submodule could be completely different. A change in one and submodule could be completely different. A change in one
submodule does not result in a new revision label in another submodule does not result in a new revision label in another
submodule. A change in a module revision label does not necessarily submodule. A change in a module revision label does not necessarily
mean a change to the revision label in all included submodules. mean a change to the revision label in all included submodules.
If a revision has an associated revision label, then it may be used If a revision has an associated revision label, then it may be used
instead of the revision date in an "rev:revision-or-derived" instead of the revision date in a "rev:revision-or-derived" extension
extension statement argument. statement argument.
A specific revision-label identifies a specific revision (variant) of A specific revision-label identifies a specific revision (variant) of
the module. If two YANG modules contain the same module name and the the module. If two YANG modules contain the same module name and the
same revision-label (and hence also the same revision-date) in their same revision-label (and hence also the same revision-date) in their
latest revision statement, then the contents of the two modules, latest revision statement, then the file contents of the two modules,
including the revision history, MUST be identical. including the revision history, MUST be identical.
3.4.1. File names
This section updates [RFC7950] section 5.2.
If a revision has an associated revision label, then the revision- If a revision has an associated revision label, then the revision-
label may be used instead of the revision date in the filename of a label may be used instead of the revision date in the filename of a
YANG file, where it takes the form: YANG file, where it takes the form:
module-or-submodule-name [['@' revision-date]|['#' revision-label]] module-or-submodule-name [['@' revision-date]|['#' revision-label]]
( '.yang' / '.yin' ) ( '.yang' / '.yin' )
E.g., acme-router-module@2018-01-25.yang E.g., acme-router-module@2018-01-25.yang
E.g., acme-router-module#2.0.3.yang E.g., acme-router-module#2.0.3.yang
YANG module (or submodule) files MAY be identified using either YANG module (or submodule) files MAY be identified using either
revision-date or revision-label. Typically, only one file name revision-date or revision-label. Typically, only one file name
SHOULD exist for the same module (or submodule) revision. Two file SHOULD exist for the same module (or submodule) revision. Two file
names, one with the revision date and another with the revision names, one with the revision date and another with the revision
label, MAY exist for the same module (or submodule) revision, e.g label, MAY exist for the same module (or submodule) revision, e.g.,
when migrating from one scheme to the other. when migrating from one scheme to the other.
3.3.1. Revision label scheme extension statement 3.4.2. Revision label scheme extension statement
The "rev:revision-label-scheme" extension statement is used to The optional "rev:revision-label-scheme" extension statement is used
indicate which revision-label scheme a module or submodule uses. The to indicate which revision-label scheme a module or submodule uses.
mandatory argument to this extension statement: There MUST NOT be more than one revision label scheme in a module or
submodule. The mandatory argument to this extension statement:
o Specifies the revision-label scheme used by the module or o specifies the revision-label scheme used by the module or
submodule submodule
o Is defined in the document which specifies the revision-label o is defined in the document which specifies the revision-label
scheme scheme
o MUST be an identity derived from "revision-label-scheme-base" o MUST be an identity derived from "revision-label-scheme-base".
The revision-label scheme used by a module or submodule SHOULD NOT The revision-label scheme used by a module or submodule SHOULD NOT
change during the lifetime of the module or submodule. If the change during the lifetime of the module or submodule. If the
revision-label scheme used by a module or submodule is changed to a revision-label scheme used by a module or submodule is changed to a
new scheme, then all revision-label statements that do not conform to new scheme, then all revision-label statements that do not conform to
the new scheme MUST be replaced or removed. the new scheme MUST be replaced or removed.
3.3.2. Removing revisions from the revision history 3.5. Examples for updating the YANG module revision history
Module authors may wish to remove revision statements from a module
or submodule. Removal of revision information may be desired for a
number of reasons including reducing the size of a large revision
history, or removing a revision that should no longer be used or
imported. Removing revision statements is allowed, but can cause
issues and SHOULD NOT be done without careful analysis of the impacts
to users of the module or submodule. Doing so can lead to import
breakages when import by revision-or-derived is used. Moreover,
truncating history may cause loss of visibility of when non-
backwards-compatible changes were introduced.
3.4. Examples for updating the YANG module revision history
The following diagram, explanation, and module history illustrates The following diagram, explanation, and module history illustrates
how the branched revision history, "nbc-changes" extension statement, how the branched revision history, "non-backwards-compatible"
and "revision-label" extension statement could be used: extension statement, and "revision-label" extension statement could
be used:
Example YANG module with branched revision history. Example YANG module with branched revision history.
Module revision date Revision label Module revision date Revision label
2019-01-01 <- 1.0.0 2019-01-01 <- 1.0.0
| |
2019-02-01 <- 2.0.0 2019-02-01 <- 2.0.0
| \ | \
2019-03-01 \ <- 3.0.0 2019-03-01 \ <- 3.0.0
| \ | \
| 2019-04-01 <- 2.1.0 | 2019-04-01 <- 2.1.0
| | | |
| 2019-05-01 <- 2.2.0 | 2019-05-01 <- 2.2.0
| |
2019-06-01 <- 3.1.0 2019-06-01 <- 3.1.0
The tree diagram above illustrates how an example module's revision The tree diagram above illustrates how an example module's revision
history might evolve, over time. For example, the tree might history might evolve, over time. For example, the tree might
represent the following changes, listed in chronological order from represent the following changes, listed in chronological order from
oldest revision to newest: the oldest revision to the newest revision:
Example module, revision 2019-06-01: Example module, revision 2019-06-01:
module example-module { module example-module {
namespace "urn:example:module"; namespace "urn:example:module";
prefix "prefix-name"; prefix "prefix-name";
rev:revision-label-scheme "yangver:yang-semver";
import ietf-yang-revisions { prefix "rev"; } import ietf-yang-revisions { prefix "rev"; }
import ietf-yang-semver { prefix "yangver"; }
description description
"to be completed"; "to be completed";
revision 2019-06-01 { revision 2019-06-01 {
rev:revision-label 3.1.0; rev:revision-label 3.1.0;
description "Add new functionality."; description "Add new functionality.";
} }
revision 2019-03-01 { revision 2019-03-01 {
rev:revision-label 3.0.0; rev:revision-label 3.0.0;
rev:nbc-changes; rev:non-backwards-compatible;
description description
"Add new functionality. Remove some deprecated nodes."; "Add new functionality. Remove some deprecated nodes.";
} }
revision 2019-02-01 { revision 2019-02-01 {
rev:revision-label 2.0.0; rev:revision-label 2.0.0;
rev:nbc-changes; rev:non-backwards-compatible;
description "Apply bugfix to pattern statement"; description "Apply bugfix to pattern statement";
} }
revision 2019-01-01 { revision 2019-01-01 {
rev:revision-label 1.0.0; rev:revision-label 1.0.0;
description "Initial revision"; description "Initial revision";
} }
//YANG module definition starts here //YANG module definition starts here
} }
Example module, revision 2019-05-01: Example module, revision 2019-05-01:
module example-module { module example-module {
namespace "urn:example:module"; namespace "urn:example:module";
prefix "prefix-name"; prefix "prefix-name";
rev:revision-label-scheme "yangver:yang-semver";
import ietf-yang-revisions { prefix "rev"; } import ietf-yang-revisions { prefix "rev"; }
import ietf-yang-semver { prefix "yangver"; }
description description
"to be completed"; "to be completed";
revision 2019-05-01 { revision 2019-05-01 {
rev:revision-label 2.2.0; rev:revision-label 2.2.0;
description "Backwards-compatible bugfix to enhancement."; description "Backwards-compatible bugfix to enhancement.";
} }
revision 2019-04-01 { revision 2019-04-01 {
rev:revision-label 2.1.0; rev:revision-label 2.1.0;
description "Apply enhancement to older release train."; description "Apply enhancement to older release train.";
} }
revision 2019-02-01 { revision 2019-02-01 {
rev:revision-label 2.0.0; rev:revision-label 2.0.0;
rev:nbc-changes; rev:non-backwards-compatible;
description "Apply bugfix to pattern statement"; description "Apply bugfix to pattern statement";
} }
revision 2019-01-01 { revision 2019-01-01 {
rev:revision-label 1.0.0; rev:revision-label 1.0.0;
description "Initial revision"; description "Initial revision";
} }
//YANG module definition starts here //YANG module definition starts here
} }
skipping to change at page 14, line 5 skipping to change at page 13, line 5
RFC 7950 allows YANG module "import" statements to optionally require RFC 7950 allows YANG module "import" statements to optionally require
the imported module to have a particular revision date. In practice, the imported module to have a particular revision date. In practice,
importing a module with an exact revision date is often too importing a module with an exact revision date is often too
restrictive because it requires the importing module to be updated restrictive because it requires the importing module to be updated
whenever any change to the imported module occurs. The alternative whenever any change to the imported module occurs. The alternative
choice of using an import statement without any revision date choice of using an import statement without any revision date
statement is also not ideal because the importing module may not work statement is also not ideal because the importing module may not work
with all possible revisions of the imported module. with all possible revisions of the imported module.
Instead, it is desirable for a importing module to specify a "minimum Instead, it is desirable for an importing module to specify a
required revision" of a module that it is compatible with, based on "minimum required revision" of a module that it is compatible with,
the assumption that later revisions derived from that "minimum based on the assumption that later revisions derived from that
required revision" are also likely to be compatible. Many possible "minimum required revision" are also likely to be compatible. Many
changes to a YANG module do not break importing modules, even if the possible changes to a YANG module do not break importing modules,
changes themselves are not strictly backwards-compatible. E.g., even if the changes themselves are not strictly backwards-compatible.
fixing an incorrect pattern statement or description for a leaf would E.g., fixing an incorrect pattern statement or description for a leaf
not break an import, changing the name of a leaf could break an would not break an import, changing the name of a leaf could break an
import but frequently would not, but removing a container would break import but frequently would not, but removing a container would break
imports if that container is augmented by another module. imports if that container is augmented by another module.
The ietf-revisions module defines the "revision-or-derived" extension The ietf-revisions module defines the "revision-or-derived" extension
statement, a substatement to the YANG "import" statement, to allow statement, a substatement to the YANG "import" statement, to allow
for a "minimum required revision" to be specified during import: for a "minimum required revision" to be specified during import:
The argument to the "revision-or-derived" extension statement is a The argument to the "revision-or-derived" extension statement is a
revision date or a revision label. revision date or a revision label.
skipping to change at page 15, line 7 skipping to change at page 14, line 7
depend on the updated imported module revision. depend on the updated imported module revision.
Adding, modifying or removing a "revision-or-derived" extension Adding, modifying or removing a "revision-or-derived" extension
statement is considered to be a BC change. statement is considered to be a BC change.
Adding, modifying or removing a "revision-date" extension Adding, modifying or removing a "revision-date" extension
statement is considered to be a BC change. statement is considered to be a BC change.
4.1. Module import examples 4.1. Module import examples
Consider the example module "example-module" from Section 3.4 that is Consider the example module "example-module" from Section 3.5 that is
hypothetically available in the following revision/label pairings: hypothetically available in the following revision/label pairings:
2019-01-01/1.0.0, 2019-02-01/2.0.0, 2019-03-01/3.0.0, 2019-01-01/1.0.0, 2019-02-01/2.0.0, 2019-03-01/3.0.0,
2019-04-01/2.1.0, 2019-05-01/2.2.0 and 2019-06-01/3.1.0. The 2019-04-01/2.1.0, 2019-05-01/2.2.0 and 2019-06-01/3.1.0. The
relationship between the revisions is as before: relationship between the revisions is as before:
Module revision date Revision label Module revision date Revision label
2019-01-01 <- 1.0.0 2019-01-01 <- 1.0.0
| |
2019-02-01 <- 2.0.0 2019-02-01 <- 2.0.0
| \ | \
skipping to change at page 15, line 31 skipping to change at page 14, line 31
| | | |
| 2019-05-01 <- 2.2.0 | 2019-05-01 <- 2.2.0
| |
2019-06-01 <- 3.1.0 2019-06-01 <- 3.1.0
4.1.1. Example 1 4.1.1. Example 1
This example selects module revisions that match, or are derived from This example selects module revisions that match, or are derived from
the revision 2019-02-01. E.g., this dependency might be used if the revision 2019-02-01. E.g., this dependency might be used if
there was a new container added in revision 2019-02-01 that is there was a new container added in revision 2019-02-01 that is
augmented by the importing module.It includes revisions/labels: augmented by the importing module. It includes revisions/labels:
2019-02-01/2.0.0, 2019-03-01/3.0.0, 2019-04-01/2.1.0, 2019-02-01/2.0.0, 2019-03-01/3.0.0, 2019-04-01/2.1.0,
2019-05-01/2.2.0 and 2019-06-01/3.1.0. 2019-05-01/2.2.0 and 2019-06-01/3.1.0.
import example-module { import example-module {
rev:revision-or-derived 2019-02-01; rev:revision-or-derived 2019-02-01;
} }
Alternatively, the first example could have used the revision label Alternatively, the first example could have used the revision label
"2.0.0" instead, which selects the same set of revisions/labels. "2.0.0" instead, which selects the same set of revisions/labels.
skipping to change at page 17, line 18 skipping to change at page 16, line 18
with the latest revision date. with the latest revision date.
5.2. YANG library versioning augmentations 5.2. YANG library versioning augmentations
The "ietf-yang-library-revisions" YANG module has the following The "ietf-yang-library-revisions" YANG module has the following
structure (using the notation defined in [RFC8340]): structure (using the notation defined in [RFC8340]):
module: ietf-yang-library-revisions module: ietf-yang-library-revisions
augment /yanglib:yang-library/yanglib:module-set/yanglib:module: augment /yanglib:yang-library/yanglib:module-set/yanglib:module:
+--ro revision-label? rev:revision-label +--ro revision-label? rev:revision-label
augment /yanglib:yang-library/yanglib:module-set/yanglib:module
/yanglib:submodule:
+--ro revision-label? rev:revision-label
augment /yanglib:yang-library/yanglib:module-set
/yanglib:import-only-module/yanglib:submodule:
+--ro revision-label? rev:revision-label
augment /yanglib:yang-library/yanglib:schema: augment /yanglib:yang-library/yanglib:schema:
+--ro deprecated-nodes-implemented? boolean +--ro deprecated-nodes-implemented? boolean
+--ro obsolete-nodes-absent? boolean +--ro obsolete-nodes-absent? boolean
5.2.1. Advertising revision-label 5.2.1. Advertising revision-label
The ietf-yang-library-revisions YANG module augments the "module" The ietf-yang-library-revisions YANG module augments the "module"
list in ietf-yang-library with a "revision-label" leaf to optionally list in ietf-yang-library with a "revision-label" leaf to optionally
declare the revision label associated wth the particular revision of declare the revision label associated wth the particular revision of
each module. each module.
skipping to change at page 18, line 6 skipping to change at page 17, line 11
obsolete-nodes-absent: If set to "true", this leaf indicates that obsolete-nodes-absent: If set to "true", this leaf indicates that
the server does not implement any status "obsolete" nodes. If the server does not implement any status "obsolete" nodes. If
this leaf is set to "false" or absent, then the behaviour is this leaf is set to "false" or absent, then the behaviour is
unspecified. unspecified.
Servers SHOULD set both the "deprecated-nodes-implemented" and Servers SHOULD set both the "deprecated-nodes-implemented" and
"obsolete-nodes-absent" leaves to "true". "obsolete-nodes-absent" leaves to "true".
If a server does not set the "deprecated-nodes-implemented" leaf to If a server does not set the "deprecated-nodes-implemented" leaf to
"true", then clients MUST NOT rely solely on the "rev:nbc-changes" "true", then clients MUST NOT rely solely on the "rev:non-backwards-
statements to determine whether two module revisions are backwards- compatible" statements to determine whether two module revisions are
compatible, and MUST also consider whether the status of any nodes backwards-compatible, and MUST also consider whether the status of
has changed to "deprecated" and whether those nodes are implemented any nodes has changed to "deprecated" and whether those nodes are
by the server. implemented by the server.
6. Versioning of YANG instance data 6. Versioning of YANG instance data
Instance data sets [I-D.ietf-netmod-yang-instance-file-format] do not Instance data sets [I-D.ietf-netmod-yang-instance-file-format] do not
directly make use of the updated revision handling rules described in directly make use of the updated revision handling rules described in
this document, as compatibility for instance data is undefined. this document, as compatibility for instance data is undefined.
However, instance data specifies the content-schema of the data-set. However, instance data specifies the content-schema of the data-set.
This schema SHOULD make use of versioning using revision dates and/or This schema SHOULD make use of versioning using revision dates and/or
revision labels for the individual YANG modules that comprise the revision labels for the individual YANG modules that comprise the
schema or potentially for the entire schema itself (e.g., schema or potentially for the entire schema itself (e.g.,
[I-D.ietf-netmod-yang-packages] ). [I-D.ietf-netmod-yang-packages]).
In this way, the versioning of a content-schema associated with an In this way, the versioning of a content-schema associated with an
instance data set may help a client to determine whether the instance instance data set may help a client to determine whether the instance
data could also be used in conjunction with other revisions of the data could also be used in conjunction with other revisions of the
YANG schema, or other revisions of the modules that define the YANG schema, or other revisions of the modules that define the
schema. schema.
7. Guidelines for using the YANG module update rules 7. Guidelines for using the YANG module update rules
The following text updates section 4.7 of [RFC8407] to revise the The following text updates section 4.7 of [RFC8407] to revise the
skipping to change at page 18, line 51 skipping to change at page 18, line 9
NBC changes to YANG modules may cause problems to clients, who are NBC changes to YANG modules may cause problems to clients, who are
consumers of YANG models, and hence YANG module authors are consumers of YANG models, and hence YANG module authors are
RECOMMENDED to minimize NBC changes and keep changes BC whenever RECOMMENDED to minimize NBC changes and keep changes BC whenever
possible. possible.
When NBC changes are introduced, consideration should be given to the When NBC changes are introduced, consideration should be given to the
impact on clients and YANG module authors SHOULD try to mitigate that impact on clients and YANG module authors SHOULD try to mitigate that
impact. impact.
A "rev:nbc-changes" statement MUST be added if there are NBC changes A "rev:non-backwards-compatible" statement MUST be added if there are
relative to the previous revision. NBC changes relative to the previous revision.
Removing old revision statements from a module's revision history Removing old revision statements from a module's revision history
could break import by revision, and hence it is RECOMMENDED to retain could break import by revision, and hence it is RECOMMENDED to retain
them. If all depencencies have been updated to not import specific them. If all depencencies have been updated to not import specific
revisions of a module, then the corresponding revision statements can revisions of a module, then the corresponding revision statements can
be removed from that module. An alternative solution, if the be removed from that module. An alternative solution, if the
revision section is too long, would be remove, or curtail, the older revision section is too long, would be to remove, or curtail, the
description statements associated with the previous revisions. older description statements associated with the previous revisions.
The "rev:revision-or-derived" extension should be used in YANG module The "rev:revision-or-derived" extension should be used in YANG module
imports to indicate revision dependencies between modules in imports to indicate revision dependencies between modules in
preference to the "revision-date" statement, which causes overly preference to the "revision-date" statement, which causes overly
strict import dependencies and SHOULD NOT be used. strict import dependencies and SHOULD NOT be used.
A module that includes submodules SHOULD use the "revision-date" A module that includes submodules SHOULD use the "revision-date"
statement to include specific submodule revisions. The revision of statement to include specific submodule revisions. The revision of
the including module MUST be updated when any included submodule has the including module MUST be updated when any included submodule has
changed. The revision-label substatement used in the new module changed. The revision-label substatement used in the new module
revision MUST indicate the nature of the change, i.e. NBC or BC, to revision MUST indicate the nature of the change, i.e. NBC or BC, to
the module's schema tree. the module's schema tree.
In some cases a module or submodule revision that is not strictly NBC
by the definition in Section 3.1.2 of this specification may include
the "non-backwards-compatible" statement. Here is an example when
adding the statement may be desirable:
o A "config false" leaf had its value space expanded (for example, a
range was increased, or additional enum values were added) and the
author or server implementor feels there is a significant
compatibility impact for clients and users of the module or
submodule
7.1.1. Making non-backwards-compatible changes to a YANG module 7.1.1. Making non-backwards-compatible changes to a YANG module
There are various valid situations where a YANG module has to be There are various valid situations where a YANG module has to be
modified in an NBC way. Here are the different ways in which this modified in an NBC way. Here are the different ways in which this
can be done: can be done:
o NBC changes can be sometimes be done incrementally using the o NBC changes can be sometimes be done incrementally using the
"deprecated" status to provide clients time to adapt to NBC "deprecated" status to provide clients time to adapt to NBC
changes. changes.
o NBC changes are done at once, i.e. without using "status" o NBC changes are done at once, i.e. without using "status"
statements. Depending on the change, this may have a big impact statements. Depending on the change, this may have a big impact
on clients. on clients.
o If the server can support multiple revisions of the YANG module or o If the server can support multiple revisions of the YANG module or
of YANG packages(as specified in [I-D.ietf-netmod-yang-packages]), of YANG packages(as specified in [I-D.ietf-netmod-yang-packages]),
and allows the client to select the revision (as per and allows the client to select the revision (as per
[I-D.ietf-netmod-yang-ver-selection]), then NBC changes MAY be [I-D.ietf-netmod-yang-ver-selection]), then NBC changes MAY be
done without using "status" statements. Clients would be required done without using "status" statements. Clients would be required
to select the revision which they support and the NBC change would to select the revision which they support and the NBC change would
have no impact on them have no impact on them.
Here are some guidelines on how non-backwards-compatible changes can Here are some guidelines on how non-backwards-compatible changes can
be made incrementally, with the assumption that deprecated nodes are be made incrementally, with the assumption that deprecated nodes are
implemented by the server, and obsolete nodes are not: implemented by the server, and obsolete nodes are not:
1. The changes should be made gradually, e.g. a data node's status 1. The changes should be made gradually, e.g., a data node's status
SHOULD NOT be changed directly from "current" to "obsolete" (see SHOULD NOT be changed directly from "current" to "obsolete" (see
Section 4.7 of [RFC8407]), instead the status SHOULD first be Section 4.7 of [RFC8407]), instead the status SHOULD first be
marked "deprecated" and then when support is removed its status marked "deprecated" and then when support is removed its status
MUST be changed to "obsolete". Instead of using the "obsolete" MUST be changed to "obsolete". Instead of using the "obsolete"
status, the data node MAY be removed from the model but this has status, the data node MAY be removed from the model but this has
the risk of breaking modules which import the modified module. the risk of breaking modules which import the modified module.
2. For deprecated data nodes the "description" statement SHOULD also 2. For deprecated data nodes the "description" statement SHOULD also
indicate until when support for the node is guaranteed (if indicate until when support for the node is guaranteed (if
known). If there is a replacement data node, rpc, action or known). If there is a replacement data node, rpc, action or
skipping to change at page 20, line 31 skipping to change at page 19, line 50
4. When obsoleting or deprecating data nodes, the "deprecated" or 4. When obsoleting or deprecating data nodes, the "deprecated" or
"obsolete" status SHOULD be applied at the highest possible level "obsolete" status SHOULD be applied at the highest possible level
in the data tree. For clarity, the "status" statement SHOULD in the data tree. For clarity, the "status" statement SHOULD
also be applied to all descendent data nodes, but the additional also be applied to all descendent data nodes, but the additional
status related information does not need to be repeated if it status related information does not need to be repeated if it
does not introduce any additional information. does not introduce any additional information.
5. NBC changes which can break imports SHOULD be avoided because of 5. NBC changes which can break imports SHOULD be avoided because of
the impact on the importing module. The importing modules could the impact on the importing module. The importing modules could
get broken, e.g. if an augmented node in the importing module has get broken, e.g., if an augmented node in the importing module
been removed from the imported module. Alternatively, the schema has been removed from the imported module. Alternatively, the
of the importing modules could undergo an NBC change due to the schema of the importing modules could undergo an NBC change due
NBC change in the imported module, e.g. if a node in a grouping to the NBC change in the imported module, e.g., if a node in a
has been removed. As described in Appendix B.1, instead of grouping has been removed. As described in Appendix B.1, instead
removing a node, that node SHOULD first be deprecated and then of removing a node, that node SHOULD first be deprecated and then
obsoleted. obsoleted.
See Appendix B for examples on how NBC changes can be made. See Appendix B for examples on how NBC changes can be made.
7.2. Versioning Considerations for Clients 7.2. Versioning Considerations for Clients
Guidelines for clients of modules using the new module revision Guidelines for clients of modules using the new module revision
update procedure: update procedure:
o Clients SHOULD be liberal when processing data received from a o Clients SHOULD be liberal when processing data received from a
skipping to change at page 21, line 22 skipping to change at page 20, line 38
changes. When a node's status changes from "current" to changes. When a node's status changes from "current" to
"deprecated", clients SHOULD plan to stop using that node in a "deprecated", clients SHOULD plan to stop using that node in a
timely fashion. When a node's status changes to "obsolete", timely fashion. When a node's status changes to "obsolete",
clients MUST stop using that node. clients MUST stop using that node.
8. Module Versioning Extension YANG Modules 8. Module Versioning Extension YANG Modules
YANG module with extension statements for annotating NBC changes, YANG module with extension statements for annotating NBC changes,
revision label, revision label scheme, and importing by revision. revision label, revision label scheme, and importing by revision.
<CODE BEGINS> file "ietf-yang-revisions@2021-02-17.yang" <CODE BEGINS> file "ietf-yang-revisions@2021-06-30.yang"
module ietf-yang-revisions { module ietf-yang-revisions {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-yang-revisions"; namespace "urn:ietf:params:xml:ns:yang:ietf-yang-revisions";
prefix rev; prefix rev;
// RFC Ed.: We need the bis version to get the new type revision-identifier // RFC Ed.: We need the bis version to get the new type revision-identifier
// If 6991-bis is not yet an RFC we need to copy the definition here // If 6991-bis is not yet an RFC we need to copy the definition here
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
reference reference
"XXXX [ietf-netmod-rfc6991-bis]: Common YANG Data Types"; "XXXX [ietf-netmod-rfc6991-bis]: Common YANG Data Types";
} }
organization
"IETF NETMOD (Network Modeling) Working Group";
contact
"WG Web: <https://datatracker.ietf.org/wg/netmod/>
WG List: <mailto:netmod@ietf.org>
organization Author: Joe Clarke
"IETF NETMOD (Network Modeling) Working Group"; <mailto:jclarke@cisco.com>
contact
"WG Web: <https://datatracker.ietf.org/wg/netmod/>
WG List: <mailto:netmod@ietf.org>
Author: Benoit Claise Author: Reshad Rahman
<mailto:benoit.claise@huawei.com> <mailto:reshad@yahoo.com>
Author: Joe Clarke Author: Robert Wilton
<mailto:jclarke@cisco.com> <mailto:rwilton@cisco.com>
Author: Reshad Rahman Author: Balazs Lengyel
<mailto:reshad@yahoo.com> <mailto:balazs.lengyel@ericsson.com>
Author: Robert Wilton Author: Jason Sterne
<mailto:rwilton@cisco.com> <mailto:jason.sterne@nokia.com>";
description
"This YANG 1.1 module contains definitions and extensions to
support updated YANG revision handling.
Author: Kevin D'Souza Copyright (c) 2021 IETF Trust and the persons identified as
<mailto:kd6913@att.com> authors of the code. All rights reserved.
Author: Balazs Lengyel Redistribution and use in source and binary forms, with or
<mailto:balazs.lengyel@ericsson.com> without modification, is permitted pursuant to, and subject
to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents
(http://trustee.ietf.org/license-info).
Author: Jason Sterne This version of this YANG module is part of RFC XXXX; see
<mailto:jason.sterne@nokia.com>"; the RFC itself for full legal notices.
description
"This YANG 1.1 module contains definitions and extensions to
support updated YANG revision handling.
Copyright (c) 2019 IETF Trust and the persons identified as The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
authors of the code. All rights reserved. NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
'MAY', and 'OPTIONAL' in this document are to be interpreted as
described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
they appear in all capitals, as shown here.";
Redistribution and use in source and binary forms, with or // RFC Ed.: update the date below with the date of RFC publication
without modification, is permitted pursuant to, and subject // and remove this note.
to the license terms contained in, the Simplified BSD License // RFC Ed.: replace XXXX (inc above) with actual RFC number and
set forth in Section 4.c of the IETF Trust's Legal Provisions // remove this note.
Relating to IETF Documents
(http://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see revision 2021-06-30 {
the RFC itself for full legal notices. description
"Initial version.";
reference
"XXXX: Updated YANG Module Revision Handling";
}
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL typedef revision-label {
NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', type string {
'MAY', and 'OPTIONAL' in this document are to be interpreted as length "1..255";
described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, pattern '[a-zA-Z0-9,\-_.+]+';
they appear in all capitals, as shown here."; pattern '\d{4}-\d{2}-\d{2}' {
modifier invert-match;
}
}
description
"A label associated with a YANG revision.
// RFC Ed.: update the date below with the date of RFC publication Alphanumeric characters, comma, hyphen, underscore, period
// and remove this note. and plus are the only accepted characters. MUST NOT match
// RFC Ed.: replace XXXX (inc above) with actual RFC number and revision-date.";
// remove this note. reference
"XXXX: Updated YANG Module Revision Handling;
Section 3.3, Revision label";
}
revision 2021-02-17 { typedef revision-date-or-label {
description type union {
"Initial version."; type yang:revision-identifier;
reference type revision-label;
"XXXX: Updated YANG Module Revision Handling"; }
} description
"Represents either a YANG revision date or a revision label";
}
typedef revision-label { extension nbc-changes {
type string { description
length "1..255"; "This statement is used to indicate YANG module revisions that
pattern '[a-zA-Z0-9,\-_.+]+'; contain non-backwards-compatible changes.
pattern '\d{4}-\d{2}-\d{2}' {
modifier invert-match;
}
}
description
"A label associated with a YANG revision.
Alphanumeric characters, comma, hyphen, underscore, period The statement MUST only be a substatement of the 'revision'
and plus are the only accepted characters. MUST NOT match statement. Zero or one 'non-backwards-compatible' statements
revision-date."; per parent statement is allowed. No substatements for this
reference extension have been standardized.
"XXXX: Updated YANG Module Revision Handling;
Section 3.3, Revision label";
}
typedef revision-date-or-label { If a revision of a YANG module contains changes, relative to
type union { the preceding revision in the revision history, that do not
type yang:revision-identifier; conform to the module update rules defined in RFC-XXX, then
type revision-label; the 'non-backwards-compatible' statement MUST be added as a
} substatement to the revision statement.
description
"Represents either a YANG revision date or a revision label";
}
extension nbc-changes { Conversely, if a revision does not contain a
description 'non-backwards-compatible' statement then all changes,
"This statement is used to indicate YANG module revisions that relative to the preceding revision in the revision history,
contain non-backwards-compatible changes. MUST be backwards-compatible.
The statement MUST only be a substatement of the 'revision' A new module revision that only contains changes that are
statement. backwards compatible SHOULD NOT include the
Zero or one 'nbc-changes' statement per parent statement is 'non-backwards-compatible' statement. An example of when
allowed. an author might add the 'non-backwards-compatible' statement
The statement MUST NOT have any substatements. is if they believe a change could negatively impact clients
even though the backwards compatibility rules defined in
RFC-XXXX classify it as a backwards-compatible change.
If a revision of a YANG module contains changes, relative to Add, removing, or changing a 'non-backwards-compatible'
the preceding revision in the revision history, that do not statement is a backwards-compatible version change.";
conform to the module update rules defined in RFC-XXX, then
the 'nbc-changes' statement MUST be added as a substatement to
the revision statement.
Conversely, if a revision of a YANG module only contains reference
changes, relative to the preceding revision in the revision "XXXX: Updated YANG Module Revision Handling;
history, that are classified as 'backwards-compatible' then Section 3.2, nbc-changes revision extension statement";
the revision statement MUST NOT contain any 'nbc-changes' }
substatement.";
reference extension revision-label {
"XXXX: Updated YANG Module Revision Handling; argument revision-label;
Section 3.2, nbc-changes revision extension statement"; description
} "The revision label can be used to provide an additional
versioning identifier associated with a module or submodule
revision. E.g., one option for a versioning scheme that
could be used is [XXXX: ietf-netmod-yang-semver].
extension revision-label { The format of the revision-label argument MUST conform to the
argument revision-label; pattern defined for the revision-label typedef.
description
"The revision label can be used to provide an additional
versioning identifier associated with the revision. E.g., one
option for a versioning scheme that could be used is [TODO -
Reference semver draft].
The format of the revision-label argument MUST conform to the The statement MUST only be a substatement of the revision
pattern defined for the revision-label typedef. statement. Zero or one revision-label statements per parent
statement are allowed. No substatements for this extension
have been standardized.
The statement MUST only be a substatement of the revision Revision labels MUST be unique amongst all revisions of a
statement. module or submodule.
Zero or one revision-label statement per parent statement
is allowed.
The statement MUST NOT have any substatements.
Revision labels MUST be unique amongst all revisions of a Adding a revision label is a backwards-compatible version
module."; change. Changing or removing an existing revision label in
the revision history is a non-backwards-compatible version
change, because it could impact any references to that
revision label.";
reference reference
"XXXX: Updated YANG Module Revision Handling; "XXXX: Updated YANG Module Revision Handling;
Section 3.3, Revision label"; Section 3.3, Revision label";
} }
extension revision-label-scheme { extension revision-label-scheme {
argument revision-label-scheme-identity; argument revision-label-scheme-identity;
description description
"The revision label scheme specifies which revision-label scheme "The revision label scheme specifies which revision-label scheme
the module or submodule uses. the module or submodule uses.
The mandatory revision-label-scheme-identity argument MUST be an The mandatory revision-label-scheme-identity argument MUST be an
identity derived from revision-label-scheme-base. identity derived from revision-label-scheme-base.
This extension is only valid as a top-level statement, i.e., This extension is only valid as a top-level statement, i.e.,
given as as a substatement to 'module' or 'submodule'. given as as a substatement to 'module' or 'submodule'. No
substatements for this extension have been standardized.
This extension MUST be used if there is a revision-label This extension MUST be used if there is a revision-label
statement in the module or submodule. statement in the module or submodule.
The statement MUST NOT have any substatements."; Adding a revision label scheme is a backwards-compatible version
change. Changing a revision label scheme is a
non-backwards-compatible version change, unless the new revision
label scheme is backwards-compatible with the replaced revision
label scheme. Removing a revision label scheme is a
non-backwards-compatible version change.";
reference reference
"XXXX: Updated YANG Module Revision Handling; "XXXX: Updated YANG Module Revision Handling;
Section 3.3.1, Revision label scheme extension statement"; Section 3.3.1, Revision label scheme extension statement";
}
} extension revision-or-derived {
argument revision-date-or-label;
description
"Restricts the revision of the module that may be imported to
one that matches or is derived from the specified
revision-date or revision-label.
extension revision-or-derived { The argument value MUST conform to the
argument revision-date-or-label; 'revision-date-or-label' defined type.
description
"Restricts the revision of the module that may be imported to
one that matches or is derived from the specified
revision-date or revision-label.
The argument value MUST conform to the The statement MUST only be a substatement of the import
'revision-date-or-label' defined type. statement. Zero, one or more 'revision-or-derived' statements
per parent statement are allowed. No substatements for this
extension have been standardized.
The statement MUST only be a substatement of the import If specified multiple times, then any module revision that
statement. satisfies at least one of the 'revision-or-derived' statements
Zero, one or more 'revision-or-derived' statement per parent is an acceptable revision for import.
statement is allowed.
The statement MUST NOT have any substatements.
If specified multiple An 'import' statement MUST NOT contain both a
times, then any module revision that satisfies at least one of 'revision-or-derived' extension statement and a
the 'revision-or-derived' statements is an acceptable revision 'revision-date' statement.
for import.
An 'import' statement MUST NOT contain both a A particular revision of an imported module satisfies an
'revision-or-derived' extension statement and a import's 'revision-or-derived' extension statement if the
'revision-date' statement. imported module's revision history contains a revision
statement with a matching revision date or revision label.
A particular revision of an imported module satisfies an The 'revision-or-derived' extension statement does not
import's 'revision-or-derived' extension statement if the guarantee that all module revisions that satisfy an import
imported module's revision history contains a revision statement are necessarily compatible, it only gives an
statement with a matching revision date or revision label. indication that the revisions are more likely to be
compatible.
The 'revision-or-derived' extension statement does not Adding, removing or updating a 'revision-or-derived'
guarantee that all module revisions that satisfy an import statement to an import is a backwards-compatible change.
statement are necessarily compatible, it only gives an ";
indication that the revisions are more likely to be
compatible.";
reference reference
"XXXX: Updated YANG Module Revision Handling; "XXXX: Updated YANG Module Revision Handling;
Section 4, Import by derived revision"; Section 4, Import by derived revision";
} }
identity revision-label-scheme-base { identity revision-label-scheme-base {
description description
"Base identity from which all revision label schemes are "Base identity from which all revision label schemes are
derived."; derived.";
reference reference
"XXXX: Updated YANG Module Revision Handling; "XXXX: Updated YANG Module Revision Handling;
Section 3.3.1, Revision label scheme extension statement"; Section 3.3.1, Revision label scheme extension statement";
} }
} }
<CODE ENDS> <CODE ENDS>
YANG module with augmentations to YANG Library to revision labels YANG module with augmentations to YANG Library to revision labels
<CODE BEGINS> file "ietf-yang-library-revisions@2020-07-06.yang" <CODE BEGINS> file "ietf-yang-library-revisions@2021-06-30.yang"
module ietf-yang-library-revisions { module ietf-yang-library-revisions {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-yang-library-revisions"; namespace
"urn:ietf:params:xml:ns:yang:ietf-yang-library-revisions";
prefix yl-rev; prefix yl-rev;
import ietf-yang-revisions { import ietf-yang-revisions {
prefix rev; prefix rev;
reference reference
"XXXX: Updated YANG Module Revision Handling"; "XXXX: Updated YANG Module Revision Handling";
} }
import ietf-yang-library { import ietf-yang-library {
prefix yanglib; prefix yanglib;
reference "RFC 8525: YANG Library"; reference "RFC 8525: YANG Libary";
} }
organization organization
"IETF NETMOD (Network Modeling) Working Group"; "IETF NETMOD (Network Modeling) Working Group";
contact contact
"WG Web: <https://datatracker.ietf.org/wg/netmod/> "WG Web: <https://datatracker.ietf.org/wg/netmod/>
WG List: <mailto:netmod@ietf.org> WG List: <mailto:netmod@ietf.org>
Author: Benoit Claise
<mailto:benoit.claise@huawei.com>
Author: Joe Clarke Author: Joe Clarke
<mailto:jclarke@cisco.com> <mailto:jclarke@cisco.com>
Author: Reshad Rahman Author: Reshad Rahman
<mailto:reshad@yahoo.com> <mailto:reshad@yahoo.com>
Author: Robert Wilton Author: Robert Wilton
<mailto:rwilton@cisco.com> <mailto:rwilton@cisco.com>
Author: Kevin D'Souza
<mailto:kd6913@att.com>
Author: Balazs Lengyel Author: Balazs Lengyel
<mailto:balazs.lengyel@ericsson.com> <mailto:balazs.lengyel@ericsson.com>
Author: Jason Sterne Author: Jason Sterne
<mailto:jason.sterne@nokia.com>"; <mailto:jason.sterne@nokia.com>";
description description
"This module contains augmentations to YANG Library to add module "This module contains augmentations to YANG Library to add module
level revision label and to provide an indication of how level revision label and to provide an indication of how
deprecated and obsolete nodes are handled by the server. deprecated and obsolete nodes are handled by the server.
Copyright (c) 2019 IETF Trust and the persons identified as Copyright (c) 2021 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject without modification, is permitted pursuant to, and subject
to the license terms contained in, the Simplified BSD License to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(http://trustee.ietf.org/license-info). (http://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC XXXX; see This version of this YANG module is part of RFC XXXX; see
the RFC itself for full legal notices. the RFC itself for full legal notices.
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
'MAY', and 'OPTIONAL' in this document are to be interpreted as 'MAY', and 'OPTIONAL' in this document are to be interpreted as
described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
they appear in all capitals, as shown here."; they appear in all capitals, as shown here.";
// RFC Ed.: update the date below with the date of RFC publication // RFC Ed.: update the date below with the date of RFC publication
// and remove this note. // and remove this note.
// RFC Ed.: replace XXXX (including in the imports above) with // RFC Ed.: replace XXXX (including in the imports above) with
// actual RFC number and remove this note. // actual RFC number and remove this note.
// RFC Ed.: please replace revision-label version with 1.0.0 and // RFC Ed.: please replace revision-label version with 1.0.0 and
// remove this note. // remove this note.
revision 2020-07-06 { revision 2021-06-30 {
rev:revision-label 0.1.0; rev:revision-label 0.2.0;
description description
"Initial revision"; "Initial revision";
reference reference
"XXXX: Updated YANG Module Revision Handling"; "XXXX: Updated YANG Module Revision Handling";
} }
augment "/yanglib:yang-library/yanglib:module-set/yanglib:module" { augment "/yanglib:yang-library/yanglib:module-set/yanglib:module" {
description description
"Augmentation modules with a revision label"; "Augmentation modules with a revision label";
leaf revision-label { leaf revision-label {
skipping to change at page 28, line 15 skipping to change at page 27, line 43
"The revision label associated with this module revision. "The revision label associated with this module revision.
The label MUST match the rev:label value in the specific The label MUST match the rev:label value in the specific
revision of the module loaded in this module-set."; revision of the module loaded in this module-set.";
reference reference
"XXXX: Updated YANG Module Revision Handling; "XXXX: Updated YANG Module Revision Handling;
Section 5.2.1, Advertising revision-label"; Section 5.2.1, Advertising revision-label";
} }
} }
augment "/yanglib:yang-library/yanglib:module-set/yanglib:module/"
+ "yanglib:submodule" {
description
"Augment submodule information with a revision label";
leaf revision-label {
type rev:revision-label;
description
"The revision label associated with this submodule revision.
The label MUST match the rev:label value in the specific
revision of the submodule included by the module loaded in
this module-set.";
reference
"XXXX: Updated YANG Module Revision Handling;
Section 5.2.1, Advertising revision-label";
}
}
augment "/yanglib:yang-library/yanglib:module-set/"
+ "yanglib:import-only-module/yanglib:submodule" {
description
"Augment submodule information with a revision label";
leaf revision-label {
type rev:revision-label;
description
"The revision label associated with this submodule revision.
The label MUST match the rev:label value in the specific
revision of the submodule included by the
import-only-module loaded in this module-set.";
reference
"XXXX: Updated YANG Module Revision Handling;
Section 5.2.1, Advertising revision-label";
}
}
augment "/yanglib:yang-library/yanglib:schema" { augment "/yanglib:yang-library/yanglib:schema" {
description description
"Augmentations to the ietf-yang-library module to indicate how "Augmentations to the ietf-yang-library module to indicate how
deprecated and obsoleted nodes are handled for each datastore deprecated and obsoleted nodes are handled for each datastore
schema supported by the server."; schema supported by the server.";
leaf deprecated-nodes-implemented { leaf deprecated-nodes-implemented {
type boolean; type boolean;
description description
"If set to true, this leaf indicates that all schema nodes with "If set to true, this leaf indicates that all schema nodes with
a status 'deprecated' child statement are implemented a status 'deprecated' child statement are implemented
equivalently as if they had status 'current', or otherwise equivalently as if they had status 'current', or otherwise
deviations MUST be used to explicitly remove 'deprecated' deviations MUST be used to explicitly remove 'deprecated'
nodes from the schema. If this leaf is set to false or absent, nodes from the schema. If this leaf is absent or set to false,
then the behavior is unspecified."; then the behavior is unspecified.";
reference reference
"XXXX: Updated YANG Module Revision Handling; "XXXX: Updated YANG Module Revision Handling;
Section 5.2.2, Reporting how deprecated and obsolete nodes Section 5.2.2, Reporting how deprecated and obsolete nodes
are handled"; are handled";
} }
leaf obsolete-nodes-absent { leaf obsolete-nodes-absent {
type boolean; type boolean;
description description
"If set to true, this leaf indicates that the server does not "If set to true, this leaf indicates that the server does not
implement any status 'obsolete' nodes. If this leaf is implement any status 'obsolete' nodes. If this leaf is
set to false or absent, then the behaviour is unspecified."; absent or set to false, then the behaviour is unspecified.";
reference reference
"XXXX: Updated YANG Module Revision Handling; "XXXX: Updated YANG Module Revision Handling;
Section 5.2.2, Reporting how deprecated and obsolete nodes Section 5.2.2, Reporting how deprecated and obsolete nodes
are handled"; are handled";
} }
} }
} }
<CODE ENDS> <CODE ENDS>
9. Contributors 9. Contributors
This document grew out of the YANG module versioning design team that This document grew out of the YANG module versioning design team that
started after IETF 101. The following individuals are (or have been) started after IETF 101. The following individuals are (or have been)
members of the design team and have worked on the YANG versioning members of the design team and have worked on the YANG versioning
project: project:
o Balazs Lengyel o Balazs Lengyel
o Benoit Claise o Benoit Claise
o Ebben Aries o Ebben Aries
o Jan Lindblad
o Jason Sterne o Jason Sterne
o Joe Clarke o Joe Clarke
o Juergen Schoenwaelder o Juergen Schoenwaelder
o Mahesh Jethanandani o Mahesh Jethanandani
o Michael (Wangzitao) o Michael (Wangzitao)
skipping to change at page 29, line 34 skipping to change at page 30, line 4
o Michael (Wangzitao) o Michael (Wangzitao)
o Qin Wu o Qin Wu
o Reshad Rahman o Reshad Rahman
o Rob Wilton o Rob Wilton
o Bo Wu o Bo Wu
The initial revision of this document was refactored and built upon The initial revision of this document was refactored and built upon
[I-D.clacla-netmod-yang-model-update]. [I-D.clacla-netmod-yang-model-update].
Discussons on the use of Semver for YANG versioning has been held Discussons on the use of Semver for YANG versioning has been held
with authors of the OpenConfig YANG models. We would like thank both with authors of the OpenConfig YANG models. We would like to thank
Anees Shaikh and Rob Shakir for their input into this problem space. both Anees Shaikh and Rob Shakir for their input into this problem
space.
We would also like to thank Martin Bjorklund, Jan Lindblad and Italo We would also like to thank Lou Berger, Andy Bierman, Martin
Busi for their contributions. Bjorklund, Italo Busi, Tom Hill, Scott Mansfield, Kent Watsen for
their contributions and review comments.
10. Security Considerations 10. Security Considerations
The document does not define any new protocol or data model. There The document does not define any new protocol or data model. There
are no security considerations beyond those specified in [RFC7950]. are no security considerations beyond those specified in [RFC7950].
11. IANA Considerations 11. IANA Considerations
11.1. YANG Module Registrations 11.1. YANG Module Registrations
This document requests IANA to registers a URI in the "IETF XML
Registry" [RFC3688]. Following the format in RFC 3688, the following
registrations are requested.
URI: urn:ietf:params:xml:ns:yang:ietf-yang-revisions
Registrant Contact: The IESG.
XML: N/A, the requested URI is an XML namespace.
URI: urn:ietf:params:xml:ns:yang:ietf-yang-library-revisions
Registrant Contact: The IESG.
XML: N/A, the requested URI is an XML namespace.
The following YANG module is requested to be registred in the "IANA The following YANG module is requested to be registred in the "IANA
Module Names" registry: Module Names" [RFC6020]. Following the format in RFC 6020, the
following registrations are requested:
The ietf-yang-revisions module: The ietf-yang-revisions module:
Name: ietf-yang-revisions Name: ietf-yang-revisions
XML Namespace: urn:ietf:params:xml:ns:yang:ietf-yang-revisions XML Namespace: urn:ietf:params:xml:ns:yang:ietf-yang-revisions
Prefix: rev Prefix: rev
Reference: [RFCXXXX] Reference: [RFCXXXX]
skipping to change at page 31, line 4 skipping to change at page 31, line 33
IANA registry" [IfTypesReg], and "iana-routing-types.yang" IANA registry" [IfTypesReg], and "iana-routing-types.yang"
[RoutingTypesYang] is derived from the "Address Family Numbers" [RoutingTypesYang] is derived from the "Address Family Numbers"
[AddrFamilyReg] and "Subsequent Address Family Identifiers (SAFI) [AddrFamilyReg] and "Subsequent Address Family Identifiers (SAFI)
Parameters" [SAFIReg] IANA registries. Parameters" [SAFIReg] IANA registries.
Normally, updates to the registries cause any derived YANG modules to Normally, updates to the registries cause any derived YANG modules to
be updated in a backwards-compatible way, but there are some cases be updated in a backwards-compatible way, but there are some cases
where the registry updates can cause non-backward-compatible updates where the registry updates can cause non-backward-compatible updates
to the derived YANG module. An example of such an update is the to the derived YANG module. An example of such an update is the
2020-12-31 revision of iana-routing-types.yang 2020-12-31 revision of iana-routing-types.yang
[RoutingTypesDecRevision], where the enum name for two SAFI values [RoutingTypesDecRevision], where the enum name for two SAFI values
was changed. was changed.
In all cases, IANA MUST follow the versioning guidance specified in In all cases, IANA MUST follow the versioning guidance specified in
Section 3.1, and MUST include a "rev:nbc-changes" substatement to the Section 3.1, and MUST include a "rev:non-backwards-compatible"
latest revision statement whenever an IANA maintained module is substatement to the latest revision statement whenever an IANA
updated in a non-backwards-compatible way, as described in maintained module is updated in a non-backwards-compatible way, as
Section 3.2. described in Section 3.2.
Note: For published IANA maintained YANG modules that contain non- Note: For published IANA maintained YANG modules that contain non-
backwards-compatible changes between revisions, a new revision should backwards-compatible changes between revisions, a new revision should
be published with the "rev:nbc-changes" substatement retrospectively be published with the "rev:non-backwards-compatible" substatement
added to any revisions containing non-backwards-compatible changes. retrospectively added to any revisions containing non-backwards-
compatible changes.
Non normative examples of updates to enumeration types in IANA Non-normative examples of updates to enumeration types in IANA
maintained modules that would be classified as non-backwards- maintained modules that would be classified as non-backwards-
compatible changes are: Changing the status of an enumeration typedef compatible changes are: Changing the status of an enumeration typedef
to obsolete, changing the status of an enum entry to obsolete, to obsolete, changing the status of an enum entry to obsolete,
removing an enum entry, changing the identifier of an enum entry, or removing an enum entry, changing the identifier of an enum entry, or
changing the described meaning of an enum entry. changing the described meaning of an enum entry.
Non normative examples of updates to enumeration types in IANA Non-normative examples of updates to enumeration types in IANA
maintained modules that would be classified as backwards-compatible maintained modules that would be classified as backwards-compatible
changes are: Adding a new enum entry to the end of the enumeration, changes are: Adding a new enum entry to the end of the enumeration,
changing the status or an enum entry to deprecated, or improving the changing the status or an enum entry to deprecated, or improving the
description of an enumeration that does not change its defined description of an enumeration that does not change its defined
meaning. meaning.
Non normative examples of updates to identity types in IANA Non-normative examples of updates to identity types in IANA
maintained modules that would be classified as non-backwards- maintained modules that would be classified as non-backwards-
compatible changes are: Changing the status of an identity to compatible changes are: Changing the status of an identity to
obsolete, removing an identity, renaming an identity, or changing the obsolete, removing an identity, renaming an identity, or changing the
described meaning of an identity. described meaning of an identity.
Non normative examples of updates to identity types in IANA Non-normative examples of updates to identity types in IANA
maintained modules that would be classified as backwards-compatible maintained modules that would be classified as backwards-compatible
changes are: Adding a new identity, changing the status or an changes are: Adding a new identity, changing the status or an
identity to deprecated, or improving the description of an identity identity to deprecated, or improving the description of an identity
that does not change its defined meaning. that does not change its defined meaning.
12. References 12. References
12.1. Normative References 12.1. Normative References
[I-D.ietf-netmod-rfc6991-bis] [I-D.ietf-netmod-rfc6991-bis]
Schoenwaelder, J., "Common YANG Data Types", draft-ietf- Schoenwaelder, J., "Common YANG Data Types", draft-ietf-
netmod-rfc6991-bis-04 (work in progress), July 2020. netmod-rfc6991-bis-06 (work in progress), April 2021.
[I-D.ietf-netmod-yang-semver] [I-D.ietf-netmod-yang-semver]
Claise, B., Clarke, J., Rahman, R., Wilton, R., Lengyel, Claise, B., Clarke, J., Rahman, R., Wilton, R., Lengyel,
B., Sterne, J., and K. D'Souza, "YANG Semantic B., Sterne, J., and K. D'Souza, "YANG Semantic
Versioning", draft-ietf-netmod-yang-semver-01 (work in Versioning", draft-ietf-netmod-yang-semver-02 (work in
progress), July 2020. progress), February 2021.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
DOI 10.17487/RFC3688, January 2004,
<https://www.rfc-editor.org/info/rfc3688>.
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for
the Network Configuration Protocol (NETCONF)", RFC 6020,
DOI 10.17487/RFC6020, October 2010,
<https://www.rfc-editor.org/info/rfc6020>.
[RFC7895] Bierman, A., Bjorklund, M., and K. Watsen, "YANG Module [RFC7895] Bierman, A., Bjorklund, M., and K. Watsen, "YANG Module
Library", RFC 7895, DOI 10.17487/RFC7895, June 2016, Library", RFC 7895, DOI 10.17487/RFC7895, June 2016,
<https://www.rfc-editor.org/info/rfc7895>. <https://www.rfc-editor.org/info/rfc7895>.
[RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
RFC 7950, DOI 10.17487/RFC7950, August 2016, RFC 7950, DOI 10.17487/RFC7950, August 2016,
<https://www.rfc-editor.org/info/rfc7950>. <https://www.rfc-editor.org/info/rfc7950>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
skipping to change at page 33, line 7 skipping to change at page 33, line 46
<https://www.iana.org/assignments/address-family-numbers/ <https://www.iana.org/assignments/address-family-numbers/
address-family-numbers.xhtml>. address-family-numbers.xhtml>.
[I-D.clacla-netmod-yang-model-update] [I-D.clacla-netmod-yang-model-update]
Claise, B., Clarke, J., Lengyel, B., and K. D'Souza, "New Claise, B., Clarke, J., Lengyel, B., and K. D'Souza, "New
YANG Module Update Procedure", draft-clacla-netmod-yang- YANG Module Update Procedure", draft-clacla-netmod-yang-
model-update-06 (work in progress), July 2018. model-update-06 (work in progress), July 2018.
[I-D.ietf-netmod-yang-instance-file-format] [I-D.ietf-netmod-yang-instance-file-format]
Lengyel, B. and B. Claise, "YANG Instance Data File Lengyel, B. and B. Claise, "YANG Instance Data File
Format", draft-ietf-netmod-yang-instance-file-format-12 Format", draft-ietf-netmod-yang-instance-file-format-13
(work in progress), April 2020. (work in progress), March 2021.
[I-D.ietf-netmod-yang-packages] [I-D.ietf-netmod-yang-packages]
Wilton, R., Rahman, R., Clarke, J., Sterne, J., and W. Bo, Wilton, R., Rahman, R., Clarke, J., Sterne, J., and B. Wu,
"YANG Packages", draft-ietf-netmod-yang-packages-01 (work "YANG Packages", draft-ietf-netmod-yang-packages-01 (work
in progress), November 2020. in progress), November 2020.
[I-D.ietf-netmod-yang-solutions] [I-D.ietf-netmod-yang-solutions]
Wilton, R., "YANG Versioning Solution Overview", draft- Wilton, R., "YANG Versioning Solution Overview", draft-
ietf-netmod-yang-solutions-01 (work in progress), November ietf-netmod-yang-solutions-01 (work in progress), November
2020. 2020.
[I-D.ietf-netmod-yang-ver-selection] [I-D.ietf-netmod-yang-ver-selection]
Wilton, R., Rahman, R., Clarke, J., Sterne, J., and W. Bo, Wilton, R., Rahman, R., Clarke, J., Sterne, J., and B. Wu,
"YANG Schema Selection", draft-ietf-netmod-yang-ver- "YANG Schema Selection", draft-ietf-netmod-yang-ver-
selection-00 (work in progress), March 2020. selection-00 (work in progress), March 2020.
[I-D.ietf-netmod-yang-versioning-reqs] [I-D.ietf-netmod-yang-versioning-reqs]
Clarke, J., "YANG Module Versioning Requirements", draft- Clarke, J., "YANG Module Versioning Requirements", draft-
ietf-netmod-yang-versioning-reqs-04 (work in progress), ietf-netmod-yang-versioning-reqs-04 (work in progress),
January 2021. January 2021.
[IfTypesReg] [IfTypesReg]
"Interface Types (ifType) IANA Registry", "Interface Types (ifType) IANA Registry",
skipping to change at page 34, line 40 skipping to change at page 35, line 30
o Making the statement conditional on if-feature. o Making the statement conditional on if-feature.
Appendix B. Examples of applying the NBC change guidelines Appendix B. Examples of applying the NBC change guidelines
The following sections give guidance for how some of these NBC The following sections give guidance for how some of these NBC
changes could be made to a YANG module. The examples are all for changes could be made to a YANG module. The examples are all for
"config true" nodes. "config true" nodes.
B.1. Removing a data node B.1. Removing a data node
Removing a leaf or container from the data tree, e.g. because support Removing a leaf or container from the data tree, e.g., because
for the corresponding feature is being removed: support for the corresponding feature is being removed:
1. The node's status is changed to "deprecated" and it is supported 1. The node's status is changed to "deprecated" and it is supported
for at least one year. This is a BC change. for at least one year. This is a BC change.
2. When the node is not available anymore, its status is changed to 2. When the node is not available anymore, its status is changed to
"obsolete" and the "description" updated, this is an NBC change. "obsolete" and the "description" updated, this is an NBC change.
If the server can support NBC revisions of the YANG module If the server can support NBC revisions of the YANG module
simultaneously using version selection simultaneously using version selection
[I-D.ietf-netmod-yang-ver-selection], then the changes can be done [I-D.ietf-netmod-yang-ver-selection], then the changes can be done
immediately: immediately:
1. The new revision of the YANG module has the node's status changed 1. The new revision of the YANG module has the node's status changed
to "obsolete" and the "description" updated, this is an NBC to "obsolete" and the "description" updated, this is an NBC
change. change.
2. Clients which require the data node select the YANG package 2. Clients which require the data node select the YANG package
containing the schema version they use containing the schema version they use.
B.2. Changing the type of a leaf node B.2. Changing the type of a leaf node
Changing the type of a leaf-node. e.g. consider a "vpn-id" node of Changing the type of a leaf-node. e.g., consider a "vpn-id" node of
type integer being changed to a string: type integer being changed to a string:
1. The status of node "vpn-id" is changed to "deprecated" and the 1. The status of node "vpn-id" is changed to "deprecated" and the
node should be available for at least one year. This is a BC node should be available for at least one year. This is a BC
change. change.
2. A new node, e.g. "vpn-name", of type string is added to the same 2. A new node, e.g., "vpn-name", of type string is added to the same
location as the existing node "vpn-id". This new node has status location as the existing node "vpn-id". This new node has status
"current" and its description explains that it is replacing node "current" and its description explains that it is replacing node
"vpn-id". "vpn-id".
3. During the period of time where both nodes are available, how the 3. During the period of time when both nodes are available, how the
server behaves when either node is set is outside the scope of server behaves when either node is set is outside the scope of
this document and will vary on a case by case basis. Here are this document and will vary on a case by case basis. Here are
some options: some options:
1. A server may prevent the new node from being set if the old 1. A server may prevent the new node from being set if the old
node is already set (and vice-versa). The new node may have node is already set (and vice-versa). The new node may have
a when statement to achieve this. The old node must not have a when statement to achieve this. The old node must not have
a when statement since this would be an NBC change, but the a when statement since this would be an NBC change, but the
server could reject the old node from being set if the new server could reject the old node from being set if the new
node is already set. node is already set.
skipping to change at page 36, line 4 skipping to change at page 36, line 45
"vpn-id". However, if the value can not be mapped then the "vpn-id". However, if the value can not be mapped then the
configuration would be incomplete, this is outside the scope configuration would be incomplete, this is outside the scope
of this document. of this document.
4. When node "vpn-id" is not available anymore, its status is 4. When node "vpn-id" is not available anymore, its status is
changed to "obsolete" and the "description" is updated. This is changed to "obsolete" and the "description" is updated. This is
an NBC change. an NBC change.
If the server can support NBC revisions of the YANG module If the server can support NBC revisions of the YANG module
simultaneously using version selection simultaneously using version selection
[I-D.ietf-netmod-yang-ver-selection], then the changes can be done [I-D.ietf-netmod-yang-ver-selection], then the changes can be done
immediately: immediately:
1. In the new revision of the YANG module, the status of node "vpn- 1. In the new revision of the YANG module, the status of node "vpn-
id" is changed to "obsolete". This is an NBC change. id" is changed to "obsolete". This is an NBC change.
2. New node "vpn-name" is added to the same location as described 2. New node "vpn-name" is added to the same location as described
above. above.
3. Clients which require the data node select the YANG package 3. Clients which require the data node select the YANG package
containing the schema version they use containing the schema version they use
4. A server should not map between the nodes "vpn-id" and "vpn- 4. A server should not map between the nodes "vpn-id" and "vpn-
name", i.e. if a client creates a data instance with "vpn-name" name", i.e. if a client creates a data instance with "vpn-name"
then that data instance should not be visible to a client using a then that data instance should not be visible to a client using a
module revision which has "vpn-id" (and vice-versa). module revision which has "vpn-id" (and vice-versa).
B.3. Reducing the range of a leaf node B.3. Reducing the range of a leaf node
Reducing the range of values of a leaf-node. e.g. consider a "vpn-id" Reducing the range of values of a leaf-node, e.g., consider a "vpn-
node of type integer being changed from type uint32 to type uint16: id" node of type integer being changed from type uint32 to type
uint16:
1. If all values which are being removed were never supported, e.g. 1. If all values which are being removed were never supported, e.g.,
if a vpn-id of 65536 or higher was never accepted, this is a BC if a vpn-id of 65536 or higher was never accepted, this is a BC
change for the functionality (no functionality change). Even if change for the functionality (no functionality change). Even if
it is an NBC change for the YANG model, there should be no impact it is an NBC change for the YANG model, there should be no impact
for clients using that YANG model. for clients using that YANG model.
2. If one or more values being removed was previously supported, 2. If one or more values being removed was previously supported,
e.g. if a vpn-id of 65536 was accepted previously, this is an NBC e.g., if a vpn-id of 65536 was accepted previously, this is an
change for the YANG model. Clients using the old YANG model will NBC change for the YANG model. Clients using the old YANG model
be impacted, so a change of this nature should be done carefully, will be impacted, so a change of this nature should be done
e.g. by using the steps described in Appendix B.2 carefully, e.g., by using the steps described in Appendix B.2
B.4. Changing the key of a list B.4. Changing the key of a list
Changing the key of a list has a big impact to the client. For Changing the key of a list has a big impact to the client. For
example, consider a "sessions" list which has a key "interface" and example, consider a "sessions" list which has a key "interface" and
there is a need to change the key to "dest-address", such a change there is a need to change the key to "dest-address", such a change
can be done in steps: can be done in steps:
1. The status of list "sessions" is changed to "deprecated" and the 1. The status of list "sessions" is changed to "deprecated" and the
list should be available for at least one year. This is a BC list should be available for at least one year. This is a BC
change. change.
2. A new list is created in the same location with the same data but 2. A new list is created in the same location with the same data but
with "dest-address" as key. Finding an appropriate name for the with "dest-address" as key. Finding an appropriate name for the
new list can be tricky especially if the name of the existing new list can be tricky especially if the name of the existing
list was perfect. In this case the new list is called "sessions- list was perfect. In this case the new list is called "sessions-
address", has status "current" and its description should explain address", has status "current" and its description should explain
that it is replacing list "session". that it is replacing list "session".
3. During the period of time where both lists are available, how the 3. During the period of time when both lists are available, how the
server behaves when either list is set is outside the scope of server behaves when either list is set is outside the scope of
this document and will vary on a case by case basis. Here are this document and will vary on a case by case basis. Here are
some options: some options:
1. A server could prevent the new list from being set if the old 1. A server could prevent the new list from being set if the old
list already has entries (and vice-versa). list already has entries (and vice-versa).
2. If the new list is set and a client does a get or get-config 2. If the new list is set and a client does a get or get-config
operation on the old list, the server could map the entries. operation on the old list, the server could map the entries.
However if the new list has entries which would lead to However, if the new list has entries which would lead to
duplicate keys in the old list, the mapping can not be done. duplicate keys in the old list, the mapping can not be done.
4. When list "sessions" is not available anymore, its status is 4. When list "sessions" is not available anymore, its status is
changed to "obsolete" and the "description" is updated. This is changed to "obsolete" and the "description" is updated. This is
an NBC change. an NBC change.
If the server can support NBC revisions of the YANG module If the server can support NBC revisions of the YANG module
simultaneously using version selection simultaneously using version selection
[I-D.ietf-netmod-yang-ver-selection], then the changes can be done [I-D.ietf-netmod-yang-ver-selection], then the changes can be done
immediately: immediately:
skipping to change at page 38, line 5 skipping to change at page 38, line 43
1. The status of the existing node "ip-adress" is changed to 1. The status of the existing node "ip-adress" is changed to
"deprecated" and the node should be available for at least one "deprecated" and the node should be available for at least one
year. This is a BC change. year. This is a BC change.
2. The new node "ip-address" is added to the same location as the 2. The new node "ip-address" is added to the same location as the
existing node "ip-adress". This new node has status "current" existing node "ip-adress". This new node has status "current"
and its description should explain that it is replacing node "ip- and its description should explain that it is replacing node "ip-
adress". adress".
3. During the period of time where both nodes are available, how the 3. During the period of time when both nodes are available, how the
server behaves when either node is set is outside the scope of server behaves when either node is set is outside the scope of
this document and will vary on a case by case basis. Here are this document and will vary on a case by case basis. Here are
some options: some options:
1. A server could prevent the new node from being set if the old 1. A server could prevent the new node from being set if the old
node is already set (and vice-versa). The new node could node is already set (and vice-versa). The new node could
have a when statement to achieve this. The old node must not have a when statement to achieve this. The old node must not
have a when statement since this would be an NBC change, but have a when statement since this would be an NBC change, but
the server could reject the old node from being set if the the server could reject the old node from being set if the
new node is already set. new node is already set.
skipping to change at page 39, line 37 skipping to change at line 1834
Joe Clarke Joe Clarke
Cisco Systems, Inc. Cisco Systems, Inc.
Email: jclarke@cisco.com Email: jclarke@cisco.com
Jason Sterne Jason Sterne
Nokia Nokia
Email: jason.sterne@nokia.com Email: jason.sterne@nokia.com
Benoit Claise
Huawei
Email: benoit.claise@huawei.com
Kevin D'Souza
AT&T
Email: kd6913@att.com
 End of changes. 157 change blocks. 
467 lines changed or deleted 506 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/