Proposal: how to make incompatible changes
Joseph Reynolds
jrey at linux.ibm.com
Wed Apr 15 09:00:03 AEST 2020
Proposal: how to make incompatible changes
This is a proposal to add guidelines for making incompatible changes to
OpenBMC interfaces. Is it okay to make incompatible changes? Yes, IMHO:
the project will continuously break compatibility in various ways, and
its users will adapt. The main idea is to minimize churn and make it
easier for users to adapt.
As the OpenBMC project moves forward with new releases, it will make
changes that necessarily break existing use cases. My recommendations are:
- Try hard to maintain forward compatibility. For example, maintain all
of the BMC's intended user interfaces.
- Identify changes that break compatibility. Briefly describe the use
case, what breaks, how a user can adapt, and cross-link technical
discussions (Gerrit reviews, issues, emails).
- Work with maintainers to determine which incompatible changes get
merged and what documentation is needed.
- Give users time to adapt to incompatible changes. For example,
deprecate interfaces in a previous release.
- List incompatible changes in the [release notes][] so community
members will know they have to adapt, and link to how to adapt.
[release notes]:
https://github.com/openbmc/docs/blob/master/release/release-notes
Perhaps we could add a section to one of these here documents:
https://github.com/openbmc/docs/blob/master/maintainer-workflow.md
https://github.com/openbmc/docs/blob/master/CONTRIBUTING.md
What do you think?
- Joseph
TLDR:
Applicability.
These guidelines are for the BMC's "intended external user interfaces".
For example, its management interfaces including its web server and all
REST APIs. I haven't given much thought to the BMC/host interfaces or
interfaces internal to the BMC. IMHO, it is less important to maintain
compatibility in these areas. For example, if you need an incompatible
change in an internal interface, you have a smaller set of users who
ought to be active in the project, and can give you feedback and adapt
within a release cycle.
What is forward compatibility?
The OpenBMC project has a sequence of releases. When someone is using
one of these releases, then updates to a later release, ideally all the
BMC interfaces they use will continue to work as before. That's what I
call "forward compatibility" which is close to the Wikipedia's [upward
compatibility][].
Backward compatibility means that after you perform a firmware update to
an older release in the sequence, using that release's older interfaces
will continue to operate the BMC as before. That is, you can downgrade
to that release. For example, backward compatibility is needed to be
able to revert a previous update back to a known-good firmware image
version. Once again, this is different from Wikipedia's [backward
compatibility][] entry which is more like interoperability.
I think it is useful to separate these concepts. To be clear: I am in
favor of the OpenBMC interfaces being upward compatible, backward
compatible, and interoperable, but I think we need to take baby steps to
get there. So I am limiting the scope of this email to a narrow
definition of forward compatibility.
I expect maintainers will consider backward compatibility at the same
time they consider forward compatibility. Note that it may be
acceptable to break backward compatibility more frequently that breaking
forward compatibility. For example, you can tell users that once they
upgrade to a new release, they cannot downgrade.
[upward compatibility]: https://en.wikipedia.org/wiki/Forward_compatibility
[backward compatibility]:
https://en.wikipedia.org/wiki/Backward_compatibility
Examples of changes that may break compatibility:
https://gerrit.openbmc-project.xyz/c/openbmc/pam-ipmi/+/31054
https://github.com/openbmc/openbmc/issues/3615
https://gerrit.openbmc-project.xyz/c/openbmc/bmcweb/+/29344
More information about the openbmc
mailing list