Hi,

Michal Vaško <[email protected]> wrote:
> Hello,
> 
> I would like to get some input for a use-case I came across, which to
> me does not seem to have any consistent rules that can be applied.
> 
> module mod_b {
>     namespace "x:example:mod_b";
>     prefix "mb";
> 
>     grouping mylist_wrapper {
>         list mylist {
>             key "name";
>             unique "value";
>             leaf name {
>                 type string;
>             }
>             leaf value {
>                 type uint32;
>             }
>         }
>     }
> 
>     list mylist2 {
>         key "a";
>         leaf a {
>             type string;
>         }
>         leaf b {
>             type string;
>         }
>     }
> }
> 
> 
> module mod_a {
>     namespace "x:example:mod_a";
>     prefix "ma";
> 
>     import mod_b { prefix "mb"; }
> 
>     container root {
>         uses mb:mylist_wrapper;
>     }
> 
>     augment /mb:mylist2 {
>         leaf c {
>             type string;
>         }
>     }
> 
>     deviation /mb:mylist2 {
>         deviate add {
>             unique "mb:b c";
>         }
>     }
> }
> 
> The focus is on the "unique" statements and how to resolve
> non-prefixed identifiers. RFC 7950 says that the argument is a "list
> of schema node identifiers"[1], which use "current module" for
> non-prefixed identifiers[2]. I have asked on this mailing list a few
> years back what current module means and the answer I got was the
> module where the statement is defined.
> 
> So let's get to the examples. As they are written, the unique in
> "mylist" should be wrong because the node "value" belongs to the
> module "mod_a" when the grouping is instantiated there, but unique is
> defined in the module "mod_b".
> 
> But even if we use the other understanding of current module and
> interpret is as the module of the context node of the statement
> (corresponds to the "current()" XPath function), then the other
> "unique" in the deviation cannot be resolved. It is referencing node
> "c", which belongs to the module "mod_a" (added by an augment) but the
> current module would then be "mod_b".
> 
> To summarize, if strictly following the specs, the "unique" in the
> "mylist" should probably reference "value" with a prefix, but that is
> not possible because "mod_a" is not even imported and it generally
> does not make sense. But then I cannot think of any consistent rule to
> successfully resolve both "unique" statements in this example. Can
> anyone help me with this, please?

Compare with this:

     grouping mylist_wrapper {
         list mylist {
             key "name";
             unique "value";
             must "value > 42";
             leaf name {
                 type string;
             }
             leaf value {
                 type uint32;
             }
         }
     }

I think the rules for the prefixes in "unique" should be the same as
for "must".  So I think that the correct syntax is to not use any
prefix in "unique".

And the deviation that adds a unique statement look correct.


/martin

> Finally, I am asking because I am trying to implement this correctly
> in yanglint. I have also tried to test these examples with pyang,
> which, however, seems to not have any consistent rules applied because
> it loads these examples without warnings. No warnings are printed even
> if the "unique" in the deviation is changed to "b c", which is
> definitely wrong since node "b" belongs to "mod_b" and node "c"
> belongs to "mod_a".
> 
> Thanks,
> Michal
> 
> [1] https://datatracker.ietf.org/doc/html/rfc7950#section-7.8.3
> [2] https://datatracker.ietf.org/doc/html/rfc7950#section-6.5
> 
> _______________________________________________
> netmod mailing list
> [email protected]
> https://www.ietf.org/mailman/listinfo/netmod

_______________________________________________
netmod mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to