Semantic Versioning for OpenConfig models
contributors: Anees Shaikh, Josh George, Rob Shakir, Kristian Larsson
September 27, 2015
Background and motivation
This document proposes to adopt Semantic Versioning (semver) for published OpenConfig YANG models in the same way that software projects use similar versioning schemes to indicate the maturity and compatibility of software as it evolves. Semver bases its versioning on an API contract with developers and users. The basic format of a semver number is XX.YY.ZZ-release where XX is the major version number, YY is the minor version number, and ZZ is a patch level. Additional information can be optionally provided with a suffix. Detailed specification on the semver versioning rules are available at the link above. Any non backward-compatible change to the API requires incrementing the major version number, while feature changes that do not break clients are indicated by incrementing the minor version number. Non-feature patches that are backward compatible are indicated with an increment to the patch number.
Semantic versioning is proposed as an addition to YANG revision statements for a number of reasons:
- YANG language rules state that the API never changes in a backward-incompatible way. From RFC 6020: “… changes are not allowed if they have any potential to cause interoperability problems between a client using an original specification and a server using an updated specification.”
This is simply not practical (and is largely motivated by SNMP MIB notions). YANG models are not mature (less than 5 models have been made IETF RFCs and these are not implemented by any major device platform). Server and client implementations are only now being developed and deployed and significantly more operational experience is needed before APIs can be frozen.
- YANG revision statements consist of a date and some informational text. As such, they offer little information about what has changed from one revision to the next. This is perhaps not surprising when considering the rigid rules in YANG about guaranteed API compatibility.
- YANG revision statements are meant for human consumption – they are not very useful for any sort of programmatic dependency checking.
Semantic versioning has its own issues and it may be that in OpenConfig we will have to adapt the specification somewhat based on considerations for versioning YANG models. Also semver does not address the problem of how to version groups of interdependent modules (e.g., a device model composed of many constituent models).
Note that we would continue to use revision statements, e.g., with a date set to the day a new semantic version is published. This allows consumers to continue to use current YANG constructs such as import by revision.
General guidelines for versioning OpenConfig YANG modules
An immediate question that arises when considering how to version YANG modules is what criteria should be used to judge that a module is mature enough that an API contract should be established with a version number.
According to the semver specification, software that is pre-release with major version 0 may break clients as long as the major version number remains < 1. That is, with major version 0, there should be no expectation of compatibility from one release to another, even if only the minor version number is changing.
Based on these considerations, the following basic guidelines are proposed for versioning OpenConfig modules:
- All modules should start out with a 0 major number. The major number should remain 0 as long as the model is being reviewed and revised based on feedback from the OpenConfig operators and from vendors implementing the model.
- Semver guidelines should be followed while the model is at major number 0, i.e., API or feature changes should increment the minor number, while minor fixes should increment the patch number.
- Once a vendor implementation for a model is in progress, the major number should be changed to 1 to acknowledge that the API is being used by implementors with correspondingly more disruption likely when the model changes in incompatible ways. Deciding that vendor implementations are sufficiently in-progress to justify moving to major version 1 may be somewhat subjective and should be based on detailed discussions with implementors to understand what stage they are in their implementations.
API changes in YANG modules
For the purposes of semver, the API presented by a YANG model consists of it’s data nodes and corresponding paths. Other elements of the model may not, strictly speaking, be considered part of the API, but still could have significant impact on the use of the model by developers or clients. Such elements include default values, configurability of a node, and behavior of a given data node (as described by the description statement).
Since the API of the YANG module is a combination of these explicit and implicit elements, the criteria for determining when a revision requires a major number increment is not always straightforward. Below we list some general rules for determining the API has changed, and consequently would increment the major version number.
- Any leaf, leaf-list, list, or container modifications that result in changing an existing data node name, or the path to a data node (location in the model)
- Changing the target of a leafref
- Removal of a data node (leaf, leaf-list, list, container)
- Changing the type of a leaf or leaf-list
- Changing a type definition such that data based on the existing typedef would be invalid (e.g., removing a value from an enumeration, changing the base type in a typedef, etc.)
- Changing the key of a list (i.e., using a different data node as the list key)
- Changing a conditional statement, such as when or must, to be more restrictive, or to be based on a different condition altogether
Proposed version number of current OpenConfig models
The table below lists the currently published OpenConfig models, and a proposed semver number based on releases so far (see the notes column).
|As of September 27, 2015|
|Model (YANG modules)||Proposed version number||Notes|
openconfig-bgp openconfig-bgp-multiprotocol openconfig-bgp-operational openconfig-bgp-policy
|1.0 or 1.1||5 earlier revisions - 0.1 to 0.5move to 1.0 since now being implemented by vendors (1.1 with name change to openconfig-bgp*)|
|1.0 or 1.1||3 earlier revisions 0.1 to 0.3move to 1.0 since now being implemented by vendors (1.1 with name change to openconfig-*)|
|0.1.3||1 initial version followed by 3 minor text fixes implementations pending|
|openconfig-types||0.1||1 initial version|
mpls mpls-types mpls-igp mpls-ldp mpls-sr mpls-rsvp mpls-te mpls-static
|0.2||2 published revisions|
|0.1||1 initial version|
|interfaces + vlan
openconfig-interfaces openconfig-if-ethernet openconfig-if-aggregate openconfig-if-ip openconfig-vlan
|0.1||1 initial version|
|0.1||not yet published|
|0.1||not yet published|
|0.1||not yet published|
Versioning bundle releases
While each individual OpenConfig model can be tagged with a semantic version, models are often interdependent, or need to be used together, for example to manage a full device. It is therefore useful to define OpenConfig ‘releases’ that contain a number of models that are designed (and confirmed) to work together. Release tagging also makes it convenient for public users to view and download a collection of self-consistent models (see also the description of GitHub releases).
Proposed guidelines for versioning and managing bundle releases include:
- Define a ‘release’ to be the collection of published OpenConfig models that work together. That is, interdependencies (e.g., imports, augments) and cross-references (e.g., leafrefs) are all resolved.
- Since github releases are based on git tags, releases are tied to a specific commit in the OpenConfig repository. This means that a release is the cumulative set of models committed in the master branch at a certain point in time.
- Releases should use semantic versioning to remain consistent with the
versioning scheme on individual models. One possible policy for versioning
releases is as follows:
- if any individual model increments its major version, the release’s major version is incremented
- if all changes to individual models result only in minor or patch version number increments, the release’s minor version number is incremented
- if all changes to individual models result only in patch number increments, then only the release’s patch number is incremented
Notwithstanding the policies for incrementing the release version, release version numbers need not be a function of individual model release numbers (e.g., the max version number of all of the models in the release).
These policies may not apply when the release major version is 0 (see below).
- Release documentation should include the list of models and their version numbers contained in the corresponding release
Initializing the release version number
Since individual OpenConfig models are at different stages of maturity, and will remain so for some time, there seems to be several options for bootstrapping the release version.
One option is to use a major version 0 until all of the individual models reach major version number >= 1. This would likely keep the release version at 0 for a long time, however, since new models are published often. A variant of this option could be to designate a subset of models as ‘primary models’ and transition the release to version >=1 when all of the primary models have reached version >= 1.
Another possibility is to bootstrap the release version as 1.0, given that two individual models have reached version >= 1 (BGP and routing policy).