Re: [yang-doctors] guideline for enum and value?

"Einar Nilsen-Nygaard (einarnn)" <einarnn@cisco.com> Wed, 14 February 2018 16:20 UTC

Return-Path: <einarnn@cisco.com>
X-Original-To: yang-doctors@ietfa.amsl.com
Delivered-To: yang-doctors@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 55A731289B0 for <yang-doctors@ietfa.amsl.com>; Wed, 14 Feb 2018 08:20:03 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -14.53
X-Spam-Level:
X-Spam-Status: No, score=-14.53 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01, USER_IN_DEF_DKIM_WL=-7.5] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=cisco.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id W-h7bCNRHELJ for <yang-doctors@ietfa.amsl.com>; Wed, 14 Feb 2018 08:20:00 -0800 (PST)
Received: from rcdn-iport-1.cisco.com (rcdn-iport-1.cisco.com [173.37.86.72]) (using TLSv1.2 with cipher DHE-RSA-SEED-SHA (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id B449E127873 for <yang-doctors@ietf.org>; Wed, 14 Feb 2018 08:20:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=9017; q=dns/txt; s=iport; t=1518625200; x=1519834800; h=from:to:cc:subject:date:message-id:references: in-reply-to:mime-version; bh=zCcjdpbJ3araC487RidLUNFSdjWBhyDMKpk9MCHCSvk=; b=E4220j9lxgfpecO913iF9L9DIJUDWjeeFebk0DTxlQSXJ/3SCZmAMZeo y2gjB2EnFU7//+8de3Xql3iy6Faxm+ZJ9bVTBkln1f/z748/dx0Wk/dIv DmHOGhfy6h2sGdz+u7aepOqvfMGagvhFVd86+iVCIeMBcVnZgTrk38CTS 4=;
X-IronPort-Anti-Spam-Filtered: true
X-IronPort-Anti-Spam-Result: A0CqAwCtYIRa/40NJK1aAxkBAQEBAQEBAQEBAQEHAQEBAQGDUmZwKAqcAoICgReQZ4VbghgKH4UcAoJ9VRcBAgEBAQEBAQJrKIUkBnkOAgIBCA4CLwcbFxQRAgQOBYlRZLFriH6CEwEBAQEBAQEBAQEBAQEBAQEBAQEBARgFBYR9ghWDaIJPNoVDJoMBghQgBaQvCQKMJoldgh+KQ4djixSJOIMgAhEZAYE7ASECNYFQcBU9KgGCGz+EOHiMTYEZAQEB
X-IronPort-AV: E=Sophos;i="5.46,513,1511827200"; d="scan'208,217";a="357164379"
Received: from alln-core-8.cisco.com ([173.36.13.141]) by rcdn-iport-1.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Feb 2018 16:19:59 +0000
Received: from XCH-RTP-007.cisco.com (xch-rtp-007.cisco.com [64.101.220.147]) by alln-core-8.cisco.com (8.14.5/8.14.5) with ESMTP id w1EGJxH1016443 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=FAIL); Wed, 14 Feb 2018 16:19:59 GMT
Received: from xch-rtp-009.cisco.com (64.101.220.149) by XCH-RTP-007.cisco.com (64.101.220.147) with Microsoft SMTP Server (TLS) id 15.0.1320.4; Wed, 14 Feb 2018 11:19:58 -0500
Received: from xch-rtp-009.cisco.com ([64.101.220.149]) by XCH-RTP-009.cisco.com ([64.101.220.149]) with mapi id 15.00.1320.000; Wed, 14 Feb 2018 11:19:58 -0500
From: "Einar Nilsen-Nygaard (einarnn)" <einarnn@cisco.com>
To: Juergen Schoenwaelder <j.schoenwaelder@jacobs-university.de>
CC: "Benoit Claise (bclaise)" <bclaise@cisco.com>, Martin Bjorklund <mbj@tail-f.com>, "yang-doctors@ietf.org" <yang-doctors@ietf.org>
Thread-Topic: [yang-doctors] guideline for enum and value?
Thread-Index: AQHTlcbpF55YB2P00UGkbIeEUIJY9qOEwc4AgB+2owCAAAYcAIAAA2eAgAAFmwA=
Date: Wed, 14 Feb 2018 16:19:58 +0000
Message-ID: <748E69BA-6AF6-405D-BAEC-CBB3DF58F70D@cisco.com>
References: <20180125.095921.224499312159563778.mbj@tail-f.com> <20180125091118.tjn5eiv2hzmc7k23@elstar.local> <dfb94426-c408-e215-e23b-539e127050a2@cisco.com> <20180125.120804.68412726225731762.mbj@tail-f.com> <0db2c4d1-ac4d-dcc6-b2b9-c580427a6a84@cisco.com> <20180214154740.l375k2kmodgvzvdx@elstar.local> <20180214155951.eqaskkjs67bt6zjc@elstar.local>
In-Reply-To: <20180214155951.eqaskkjs67bt6zjc@elstar.local>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
x-mailer: Apple Mail (2.3445.5.20)
x-ms-exchange-messagesentrepresentingtype: 1
x-ms-exchange-transport-fromentityheader: Hosted
x-originating-ip: [10.61.193.2]
Content-Type: multipart/alternative; boundary="_000_748E69BA6AF6405DBAECCBB3DF58F70Dciscocom_"
MIME-Version: 1.0
Archived-At: <https://mailarchive.ietf.org/arch/msg/yang-doctors/1vZ3uaoBnIakS0JJj2YjMLovYRo>
Subject: Re: [yang-doctors] guideline for enum and value?
X-BeenThere: yang-doctors@ietf.org
X-Mailman-Version: 2.1.22
Precedence: list
List-Id: Email list of the yang-doctors directorate <yang-doctors.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/yang-doctors>, <mailto:yang-doctors-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/yang-doctors/>
List-Post: <mailto:yang-doctors@ietf.org>
List-Help: <mailto:yang-doctors-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/yang-doctors>, <mailto:yang-doctors-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 14 Feb 2018 16:20:03 -0000

For me it's about who the values of the enums are for, and the impact on model evolution in different places. The enum values are explicitly intended as for model implementers to use, and have no real meaning to model consumers as the canonical representation is the string identifier. However, once a value is assigned via a "value", that value may never change. I have seen developers naively assign explicit values from other sources (e.g. system header files on the OS) and then inadvertently see problems when they implement the model on top of a new OS, where the value matching the symbol is not the same, and so the developers just (illegally) changed the value in the value clause. This still has zero impact on the end consumer of the model, as they deal with the string, but is a backwards compatibility violation that need not have happened.

In general, I think embedding values that are primarily targeted to implementers of a model in what is also the external format is just not all that helpful.

Not a huge deal, but reduces coupling, reduces opportunity for inadvertent backwards-compatibility breakage, and encourages better implementation code/model hygiene as all parties will be encouraged to utilize symbols rather than flawed values. I would like to see both consumers and implementers of models get to the point where:

type enumeration { enum foo; enum bar; }

and

type enumeration { enum bar; enum foo; }

...are ultimately treated the same and such that reordering of symbols doesn't break things. I've seen enough broken code based on order-dependent integer value assignments combined with people using the values instead of symbols to last several lifetimes, and anything we can do to remove opportunities for mistakes seems like a good thing.

Cheers,

Einar

On Feb 14, 2018, at 3:59 PM, Juergen Schoenwaelder <j.schoenwaelder@jacobs-university.de<mailto:j.schoenwaelder@jacobs-university.de>> wrote:

On Wed, Feb 14, 2018 at 04:47:40PM +0100, Juergen Schoenwaelder wrote:

And:

 Do not use explicit 'value' statements, except if:
    o the enum corresponds to some standard integer value, or
    o you update the set of enums by inserting new enums in the middle of
the list

I am not sure why we would recommend this.


More specifically, I do not see why

 type enumeration { enum foo { value 0; }; enum bar { value 1; }; }

is to be avoided in favor of

 type enumeration { enum foo; enum bar; }

given that they mean the same and the first one is explicit and robust
to changes while the second one must be handled with care (only append
enums, never reorder enums). Yes, clueful YANG authors can handle the
later fine as they will understand that if order changes are needed,
you have to move to explicit value assignments. My fear is that not
all YANG authors will be aware of this (but then many of those authors
likely also do not read guidelines).

/js

--
Juergen Schoenwaelder           Jacobs University Bremen gGmbH
Phone: +49 421 200 3587         Campus Ring 1 | 28759 Bremen | Germany
Fax:   +49 421 200 3103         <https://www.jacobs-university.de/>