On 14. 12. 21 12:03, Michal Vaško wrote:
Michal Vaško <[email protected]> wrote:
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.
Thanks for the reply but I do not think you have answered my
question. Please formulate a formal rule how to assign modules to
non-prefixed identifiers, whether they be in "unique", "must", or any> other 
statement with identifiers. That is what I need to implement it> properly and I am simply not able to 
come up with any that would be
consistent and compliant with the specification.

Interpret the unique argument the same way as an XPath expression, and
apply (from 6.4.1):

    o  Names without a namespace prefix belong to the same namespace as
       the identifier of the current node.  Inside a grouping, that
       namespace is affected by where the grouping is used

So "value" in the unique statement will refer to "value" in "mod_a"
when the grouping is used in "mod_a".

I see. Okay, this should be possible to implement, thanks.

I was too hasty with the reply, this is not working because of the "unique" in the deviation I have in the example. What is the 
"current node" in that case? I suppose that can only be "mylist2", so the namespace will be that of "mod_b". But this 
is wrong, the "c" node belongs to "mod_a", so the "unique" in the deviation would be wrong.

Yes, this is unclear. I guess the only chance is to define the current node to be the (anonymous) root of the module "mod_a". A similar situation can happen inside a refine statement.

Lada


/martin

/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

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

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

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

Reply via email to