On 25/07/2018 12:03, Juergen Schoenwaelder wrote:
On Tue, Jul 24, 2018 at 04:32:05PM +0100, Robert Wilton wrote:
But if fixing a definition requires a whole new module name then I think
that causes lots of problems (e.g. consider needing to change ief-interfaces
to ietf-interfaces-v2 because of changing one random leaf).
I assume this depends a lot on how clients are written but chances are
that a significant portion of clients are written such in such a way
that dealing with multiple namespaces is difficult. (But yeah, dealing
with multiple versions in the same namespace likely is also difficult
for them.)
Yes, I think that this comes down to client implementation.

If clients are looking for a universally unique identifier for a given datanode then I think that they already have to consider the triple (module, path, X), where X potentially covers:
(i) per device/vendor/release deviations,
(ii) possibly which revision a data node was first introduced in, or obsoleted in,
(iii) different YANG features enabled on different devices,
(iv) semantic versioning - at least in the case of the OpenConfig YANG modules, (v) non backwards compatible changes (both bug fixes, and more significant refactoring).

Hence, I'm still not really convinced that adding a semantic version number is introducing something that robust clients don't have to already have handle today (even if they didn't have to cope with (iv) or (v), they still may have to cope with (i) and (ii) and (iii) regardless.

One alternative way to build a robust client would be to have an internally defined schema by the client (perhaps based on open models, or perhaps a particular version of vendor models, possibly with some deviations, or their own model) which they can then map onto one or more per device schema.  So within a particular schema (internal or device specific) then (module name, path) uniquely resolves to a data node with particular properties; but between different schema (e.g. for each different device) then the same (module name, path) pair is allowed to resolve to a different uniquely defined property.

A layer of mapping is performed between the internal schema and the device schema for whichever devices/sw-versions it needs to interoperate with.  The more closely the two schema align, the easier the mapping is to achieve.  This is also why, ultimately, that determining whether changes are backwards compatible or not needs to be done at the schema level (which takes into account deviations and features), and also the per data node level.

It is also worth pointing out that the version selection scheme that I described is really just a way to potentially move the mapping layer from the client code to the server.  Fundamentally it is doing the same job and serving the same purpose.



What really chances here is the adaptation process: Today, a client
will not bother to use a new namespace (a new version) unless it was
programmed to do so (opt-in). The proposed new versioning scheme
effectively means that client will automatically use new versions
until the client got told to be careful where necessary (and I assume
that in most cases this means until the client failed and then got
fixed, an opt-out process).
My main concern with using module name for major version changes is that it forces a name change for each data node in that module, regardless of whether that node has actually changed.  This inherently feels like the wrong this to do.  If a data node hasn't changed then ideally you want it to remain unchanged on the same path.  So the alternative way that RFC 7950 supports today is to keep the module name the same but introduce new names for all identifiers that have been changed in a non backwards compatible way, making use of status deprecated/obsolete.

However, it isn't clear to me that handling the old and new values within the same schema is always a good thing to do.  I generally prefer the idea of doing version selection (if anyone chooses to support this) so that a given value is only reported once.

I can understand why some people believe a conservative opt-in
approach is desirable for them and I can understand why some other
people believe an optimistic approach opt-out approach is desirable
for them. There are likely good arguments for both and this makes it
difficult to pick one.
My feeling (and I don't have hard evidence to back this up) is that clients are generally less impacted by keeping the name the same rather than changing the module name for every major version change.


At the end, code that needs to support multiple versions is always
going to be to some extend ugly. Whether the uglyness is in namespace
bindings or version checks is likely more a question of taste. I
believe code uglyness is not really driving this but the desire to be
more agile and "lets release and then fix clients when they break" may
be more dynamic than "lets release and then wait for clients to get
updated".
With version selection, servers would still have the opportunity of not breaking clients, although it doesn't seem that likely to me that vendors will spend the effort to implement this.  But I still see that allowing the option to do this is a good idea (perhaps as a separate experimental draft).


The YANG 1.1 way is to define a new definition and then deprecate
the broken one. But this has negative consequences as well,
e.g. does writing to the old leaf automatically also write to the
new leaf at the same time? Are both returned in a get request? What
if a different client only writes to the new leaf?
Sure, duplicate or overlapping config objects is something we usually
try to avoid. In general, I assume a server would try to keep such
overlapping leafs in sync. But then, this is an issue that appears in
any scheme that allows access to multiple versions of a leaf (or
overlapping leafs in general, i.e. a standard object and a vendor
version of it).
I still think that clients may struggle to process configuration in a get request that they had not configured, and hence were not expecting.


The point I was trying to make was a different one, namely that today
we have a way to expose multiple versions of a leaf by using a new
(module, path) name while with a (module, path, version) naming
system, our protocols need extensions to expose multiple versions of a
leaf (or we declare that servers will never expose multiple versions
and that clients must always adapt to the version currently offered by
a server).
So, I think that constraint should be that for a given schema (i.e. set of implemented modules) there can be only a single definition for a (module, path) pairing.  I see the version information, much like deviations, as just a mechanism to help clients (and readers) to spot where the definition may deviate from what they were previously anticipating.

In all cases, I think that minimizing backwards incompatible changes is the right thing to do, and I suspect that as YANG gains more traction, more of the latent bugs will get fixed, models will harden, and churn will decrease.  But I think that vendors will always want an easy way to fix bugs, and to change the model in the case that the implementation has radically changed, or when the schema is being cleaned up.

Thanks,
Rob



/js


_______________________________________________
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to