Re: [netmod] Questions about how to assign default values with YANG

Italo Busi <Italo.Busi@huawei.com> Tue, 09 March 2021 18:45 UTC

Return-Path: <Italo.Busi@huawei.com>
X-Original-To: netmod@ietfa.amsl.com
Delivered-To: netmod@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 099643A168C for <netmod@ietfa.amsl.com>; Tue, 9 Mar 2021 10:45:56 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.899
X-Spam-Level:
X-Spam-Status: No, score=-1.899 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HTML_MESSAGE=0.001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
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 0hYrrrKDeFa1 for <netmod@ietfa.amsl.com>; Tue, 9 Mar 2021 10:45:53 -0800 (PST)
Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 486343A1666 for <netmod@ietf.org>; Tue, 9 Mar 2021 10:45:53 -0800 (PST)
Received: from fraeml711-chm.china.huawei.com (unknown [172.18.147.201]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4Dw3vW6nWLz67xJR; Wed, 10 Mar 2021 02:41:27 +0800 (CST)
Received: from fraeml715-chm.china.huawei.com (10.206.15.34) by fraeml711-chm.china.huawei.com (10.206.15.60) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2106.2; Tue, 9 Mar 2021 19:45:50 +0100
Received: from fraeml715-chm.china.huawei.com ([10.206.15.34]) by fraeml715-chm.china.huawei.com ([10.206.15.34]) with mapi id 15.01.2106.013; Tue, 9 Mar 2021 19:45:50 +0100
From: Italo Busi <Italo.Busi@huawei.com>
To: 'Andy Bierman' <andy@yumaworks.com>, Juergen Schoenwaelder <j.schoenwaelder@jacobs-university.de>, "netmod@ietf.org" <netmod@ietf.org>
Thread-Topic: [netmod] Questions about how to assign default values with YANG
Thread-Index: AdbvCmZgzen+a6G4QWicT/glaRAynP///QGA///e3yCAAEHcAP//waGggACHKYD/tcyd8BK128+AAABnaoD//9fDkA==
Date: Tue, 09 Mar 2021 18:45:50 +0000
Message-ID: <cfec6d0a6e1248a1a35f54b701d2976c@huawei.com>
References: <a0c43ab5c3c1463a97a1aa594a80ceee@huawei.com> <20210120094737.g5l5pvfzligahrj6@anna.jacobs.jacobs-university.de> <2384a8f549c94ea0ac46d6c772fbca43@huawei.com> <20210120114446.ovih63db7vmv7c7s@anna.jacobs.jacobs-university.de> <0ed5638881af42148720dd7f4843c3e6@huawei.com> <20210120160517.hsg5dnpidvrprtso@anna.jacobs.jacobs-university.de> <521a9ccd02e14d178a6e62971b4809ea@huawei.com> <87sg54cm18.fsf@nic.cz> <CABCOCHQoxpxf4id8rSCxmY42KMzwyj69_GMG=8Eyi4RN5gir2A@mail.gmail.com>
In-Reply-To: <CABCOCHQoxpxf4id8rSCxmY42KMzwyj69_GMG=8Eyi4RN5gir2A@mail.gmail.com>
Accept-Language: it-IT, en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
x-originating-ip: [10.47.24.181]
Content-Type: multipart/alternative; boundary="_000_cfec6d0a6e1248a1a35f54b701d2976chuaweicom_"
MIME-Version: 1.0
X-CFilter-Loop: Reflected
Archived-At: <https://mailarchive.ietf.org/arch/msg/netmod/3400vpSFMpCaz5ePVAbHw4wNk1g>
Subject: Re: [netmod] Questions about how to assign default values with YANG
X-BeenThere: netmod@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: NETMOD WG list <netmod.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/netmod>, <mailto:netmod-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/netmod/>
List-Post: <mailto:netmod@ietf.org>
List-Help: <mailto:netmod-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/netmod>, <mailto:netmod-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 09 Mar 2021 18:45:56 -0000

Lada, Andy,

Thanks for your feedbacks.

If I understand correctly, if the base model and the augmentation model are defined at the same time, we can avoid defining any YANG default statement in the base model and providing a proper description of the desired behavior.

Based on previous discussion with Juergen, I have understood that, in this case, the origin in the operational datastore can be either set to default or to system (Juergen prefers the latter but the former is allowed by section 5.3.4 of RFC8342).

I think this would be the ideal solution, but in practice there are cases where the base model has been written before the augmentation model and/or the author of the base model is not aware of the needs from the author of the augmentation model.

In these cases, the YANG default statement already exists in the base model.

Is it really required to change the base model or could a work-around be found?

In principle, the system has enough information to understand that, if no value for the leaf foo is provided in the intended DS, the value in the applied configuration for the leaf foo should be 10 rather than the value defined in the YANG default statement (i.e., 0).

Based your comments, I think that in this case, the origin in the operational datastore must not be set to default, but I am wondering whether it could be set to system instead. In other words, the applied configuration for foo is provided by the system on the basis of the rules associated with the configuration of bar.

If this is possible, then the issue could be solved without the need to request a change to the base model.

The description in the augmented model needs to be cleaned-up since in my initial mail it was misleading.

Maybe a better alternative could be something like “When bar is present and foo is not configured, the system applies the value 10 to foo rather than its default value.” (it could be further improved).

What do you think?

Italo

From: Andy Bierman [mailto:andy@yumaworks.com]
Sent: martedì 9 marzo 2021 17:58
To: Italo Busi <Italo.Busi@huawei.com>; Juergen Schoenwaelder <j.schoenwaelder@jacobs-university.de>; netmod@ietf.org
Subject: Re: [netmod] Questions about how to assign default values with YANG



On Tue, Mar 9, 2021 at 8:46 AM Ladislav Lhotka <ladislav.lhotka@nic.cz<mailto:ladislav.lhotka@nic.cz>> wrote:
Italo Busi <Italo.Busi@huawei.com<mailto:Italo.Busi@huawei.com>> writes:

> Hi Juergen,
>
> Thanks again for your clear explanation on this topic
>
> I have found a similar but slightly different issue. In this case, a YANG default statement exists in the base module but the intention with the augmentation is to "overwrite" the default value on the basis of another attribute, defined in the module which augments the base module.
>
> For example, I am wondering whether such a code is valid:

Yes, this is valid, I'd just suggest:

I do not agree.
I do not see how the description-stmt for /foo can change the default leaf processing for /bar



- remove the default statement for "foo", as it may be confusing to both humans and tools

sec 7.3.4:


   If the base type has a default value and the new derived type does

   not specify a new default value, the base type's default value is

   also the default value of the new derived type.





sec 7.6.1



   The default value of a leaf is the value that the server uses if the

   leaf does not exist in the data tree.  The usage of the default value

   depends on the leaf's closest ancestor node in the schema tree that

   is not a non-presence container (see Section 7.5.1<https://tools.ietf.org/html/rfc7950#section-7.5.1>):



   o  If no such ancestor exists in the schema tree, the default value

      MUST be used.



   o  Otherwise, if this ancestor is a case node, the default value MUST

      be used if any node from the case exists in the data tree or the

      case node is the choice's default case, and if no nodes from any

      other case exist in the data tree.



   o  Otherwise, the default value MUST be used if the ancestor node

      exists in the data tree.





- specify the default (both cases) in the description of "foo"

A similar example is in the module ietf-ipv6-router-advertisements, e.g. leaf "min-rtr-adv-interval":

https://www.rfc-editor.org/rfc/rfc8349.html#section-9.1

Lada


Andy


>
> module example-base {
>   container example {
>     leaf foo {
>       type uint8;
>       default 0;
>     }
>   }
> }
>
> module example-augment {
>   import example {
>     prefix ex;
>   }
>
>   augment "ex:example" {
>     leaf bar {
>       type empty;
>       description
>         "When present, the default value for foo is 10.";
>     }
>   }
> }
>
>
> In this case, when the leaf foo is not configured but the leaf bar is present, the value of foo in the operational datastore should be 10 (rather than 0).
>
> In this case, I think that it would be better/cleaner if the origin is marked as system.
>
> Maybe a better YANG description for bar could be: "When present, the system overrides the default value of foo to 10."
>
> What is your and/or WG opinion?
>
> Thanks again
>
> Italo
>
>> -----Original Message-----
>> From: Juergen Schoenwaelder [mailto:j.schoenwaelder@jacobs-university.de<mailto:j.schoenwaelder@jacobs-university.de>]
>> Sent: mercoledì 20 gennaio 2021 17:05
>> To: Italo Busi <Italo.Busi@huawei.com<mailto:Italo.Busi@huawei.com>>
>> Cc: 'netmod@ietf.org<mailto:netmod@ietf.org>' <netmod@ietf.org<mailto:netmod@ietf.org>>
>> Subject: Re: [netmod] Questions about how to assign default values with
>> YANG
>>
>> On Wed, Jan 20, 2021 at 02:41:39PM +0000, Italo Busi wrote:
>> >
>> > What about the case the leaf is not conditional (but still mandatory false
>> since a YANG default statement is defined)?
>> >
>> > May the server still decide not to use/implement this leaf in the operational
>> datastore?
>> >
>> > For example, in appendix C.1 of RFC8342, auto-negotiation is enabled by
>> default.
>> > What should be the behavior of a system which does not implement auto-
>> negotiation?
>> > Return the value false or no value (in the operational datastore)?
>> >
>>
>> Here are some of the rules I personally like:
>>
>>  - <operational> is the ground truth about what a system has and does
>>  - do not implement leafs that do not apply
>>
>> Hence, interfaces supporting auto-negotiation have either auto-
>> negotiation/enabled = true or auto-negotiation/enabled = false in
>> <operational>. And interfaces not supporting auto-negotiation have nothing
>> to report about auto-negotiation. Yes, I do not want to see auto-
>> negotiation/enabled = false on a loopback interface.
>>
>> My historic Ethernet interface from the last century would also not report
>> auto-negotiation/enabled in <operational>. You may hit applications that love
>> to have auto-negotiation/enabled available on all Ethernet interfaces and then
>> you end in a debate where the application developers tell you that no
>> information in <operational> may have many reasons (instrumentation not
>> implemented, access control rules, whatever and by reporting enabled=false
>> you do them a favor) but the true answer in such a debate is often that
>> modeling things as a boolean is simplistic since there are often more than
>> exactly two states (in this case, enabled, disabled, failed, not-available, ...).
>> So you settle on blaming the model writer. ;-)
>>
>> /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/>
>
> _______________________________________________
> netmod mailing list
> netmod@ietf.org<mailto:netmod@ietf.org>
> https://www.ietf.org/mailman/listinfo/netmod

--
Ladislav Lhotka
Head, CZ.NIC Labs
PGP Key ID: 0xB8F92B08A9F76C67

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