On Fri, 2019-03-22 at 10:24 +0100, Martin Bjorklund wrote:
> Hi,
> 
> RFC 8407, section 4.10 says:
> 
>    A mandatory database data definition is defined as a node that a
>    client must provide for the database to be valid.  The server is not
>    required to provide a value.
> 
>    Top-level database data definitions MUST NOT be mandatory.

The term "database" is somewhat unclear. Other documents use "datastore".

> 
> The objective for this rule is to avoid a situation where a module cannot
> be loaded w/o providing additional config, or a situation where you
> can't boot a server w/o additional config.

In fact, this issue is related to the semantics of a particular datastore. For
example, mandatory top-level nodes make a very good sense in <operational>. If I
remember correctly, the NACM module has some.

> 
> 
> Consider this snippet:
> 
>   container top {
>     leaf foo {
>       type int32;
>       default 0;
>     }
>     leaf bar {
>       when '../foo = 42';
>       mandatory true;
>       type int32;
>     }
>   }
> 
> 
> Is /top/bar considered a mandatory top level node?

Of course it is, as well as the /top, per definition in RFC 7950:

   o  mandatory node: A mandatory node is one of:

      *  A leaf, choice, anydata, or anyxml node with a "mandatory"
         statement with the value "true".

      *  A list or leaf-list node with a "min-elements" statement with a
         value greater than zero.

      *  A container node without a "presence" statement and that has at
         least one mandatory node as a child.

> 
> IMO it doesn't violate the spirit of the rule.  So the question is; is
> this allowed?

My answer is that the mandatory property is a syntactic/schema constraint
whereas "when" should be treated as a semantic rule because its expression has
to be evaluated on a particular instance. As such, it should not interfere with
schema constraints including mandatory.

If the when expression is more complicated (e.g. involves data from other
modules), it may not be possible to determine just by looking at a single module
whether an empty datastore is valid or not.

Even in your trivial example, what if an implementation adds a deviation module
changing the default for /top/foo to 42?

Lada

> 
> 
> /martin
> 
> P.S. the real data model is a potential solution to a problem with
> ietf-alarms from draft-ietf-ccamp-alarm-module:
> 
>       leaf notify-status-changes {
>         type enumeration {
>           enum all-state-changes {
>             ...
>           }
>           enum raise-and-clear {
>             ...
>           }
>           enum severity-level {
>             ...
>           }
>         }
>         default "all-state-changes";
>         description
>           ...
>       }
>       leaf notify-severity-level {
>         when '../notify-status-changes = "severity-level"';
>         type severity;
>         mandatory true;
>         ...
>       }
> 
> 
> pyang complains that this violates the cited rule.
> 
> D.S.
> 
> _______________________________________________
> netmod mailing list
> 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
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to