Michal Vasko <[email protected]> wrote:
> Hi Andy,
> 
> thanks for the clarification but it definitely could have been worded
> in a clearer way. Both the 'conceptual data node' and 'rest of the
> nodes' hint that an actual node must be the target.

But it says:

     [...] the first node in the absolute-schema-nodeid string
     identifies the YANG data structure to augment

I think that is pretty clear.


/martin



> 
> Regards,
> Michal
> 
> On 2. 10. 2025 18:28, Andy Bierman wrote:
> >
> >
> > On Wed, Oct 1, 2025 at 11:51 PM Michal Vasko
> > <[email protected]> wrote:
> >
> >     Hi,
> >
> >     I would just like to include the text that I think restricts this
> >     use of the augment-structure. It is in the description of this
> >     extension in RFC 8791 <https://datatracker.ietf.org/doc/html/rfc8791>.
> >
> >     The mandatory 'path' parameter value identifies the YANG
> >     conceptual data node that is being augmented and is
> >     represented as an absolute-schema-nodeid string, where the
> >     first node in the absolute-schema-nodeid string identifies the
> >     YANG data structure to augment, and the rest of the nodes in
> >     the string identifies the node within the YANG structure to
> >     augment.
> >
> >     It clearly mentions referencing a "conceptual data node", not a
> >     'structure' extension. I think this is the reason we have not
> >     supported it in 'libyang'. Note that I do not mind adding support
> >     for this in libyang (we have already implemented it) but the
> >     wording is definitely misleading if the intention was for
> >     'structure' to be allowed to be augmented directly. Maybe even
> >     deserves an errata.
> >
> >
> >
> > It does not say the following nodes are required.
> >
> >     and the rest of the nodes
> > INTENDED:
> > and the rest of the nodes (if any)
> > It is true that the old RFC 8040 'yang-data' extension did require a
> > container in it, but that was changed in RFC 8791.
> > This was done in part to make groupings work better e.g. data node
> > /foo/A
> > grouping stuff {     leaf A { type string; }
> >    }
> >    rc:yang-data foo {
> >      container foo {
> >        uses stuff;
> >      }
> >    }
> > sx:structure foo { uses stuff; }
> > container foo { uses stuff; }
> >
> >     Regards,
> >     Michal
> >
> >
> >
> > Andy
> >
> >     On 2. 10. 2025 8:38, Phú Liên wrote:
> >>
> >>
> >>     ---------- Forwarded message ---------
> >>     From: *Phú Liên* <[email protected]>
> >>     Date: Thu, Oct 2, 2025 at 1:36 PM
> >>     Subject: Re: [netmod] Question about using augment-structure to
> >>     augment the root node of a Yang data structure
> >>     To: Andy Bierman <[email protected]>
> >>
> >>
> >>     Hi Andy,
> >>
> >>     Thank you for your confirmation. I can now request a bug fix for
> >>     Yanglint.
> >>
> >>     Best regards,
> >>     Phu
> >>
> >>     On Thu, Oct 2, 2025 at 12:02 AM Andy Bierman <[email protected]>
> >>     wrote:
> >>
> >>
> >>
> >>         On Wed, Oct 1, 2025 at 12:56 AM Phú Liên
> >>         <[email protected]> wrote:
> >>
> >>             Hi RFC 8791 authors,
> >>
> >>             I have a question regarding YANG data structure
> >>             extensions (RFC 8791) and the use of augment-structure.
> >>             Specifically, is it possible to augment the root of a
> >>             YANG data structure?
> >>
> >>             For example, with the YANG model below, yanglint
> >>             validates successfully if the last "sx:augment-structure
> >>             /foo:mystruct" statement is commented out. However, if
> >>             that statement is included, yanglint reports an error:
> >>
> >>             * Yang model
> >>
> >>             ```
> >>             module foo {
> >>               namespace "foo";
> >>               prefix foo;
> >>
> >>               import ietf-yang-structure-ext { prefix sx; }
> >>
> >>               sx:structure mystruct {
> >>                 container mycontainer {
> >>                   leaf leaf1 {
> >>                     type string;
> >>                   }
> >>                 }
> >>               }
> >>
> >>               sx:augment-structure /foo:mystruct/foo:mycontainer {
> >>                 leaf leaf2 {
> >>                   type string;
> >>                 }
> >>               }
> >>
> >>               // Augment to the root of the structure, so `leaf3`
> >>             will be a sibling of `mycontainer`.
> >>               sx:augment-structure /foo:mystruct {
> >>                 leaf leaf3 {
> >>                   type string;
> >>                 }
> >>               }
> >>             }
> >>             ```
> >>
> >>             * Yanglint error
> >>
> >>             ```
> >>             libyang err : Augment extension target node
> >>             "/foo:mystruct" from module "foo" was not found.
> >>             
> >> (/foo:{extension='sx:augment-structure'}/{augment='/foo:mystruct'})
> >>             ```
> >>
> >>             Moreover, if we cannot use augment-structure to add
> >>             augments to the root of a structure, could you please
> >>             suggest how to make the following leafref path valid in
> >>             the YANG model below?
> >>
> >>
> >>
> >>         I do not see any text in RFC 8791 that prohibits augmenting
> >>         the structure.
> >>         A valid path argument is provided to the extension.
> >>
> >>             sx:augment-structure /foo:mystruct
> >>
> >>         The structure 'mystruct' should be treated like a top-level
> >>         NP container.
> >>         It shares the same namespace as real data-def-stmts.
> >>
> >>
> >>         Andy
> >>
> >>             * a.yang
> >>
> >>             ```
> >>             module a {
> >>               namespace "urn:a";
> >>               prefix a;
> >>
> >>               import b {
> >>                 prefix b;
> >>               }
> >>               import ietf-yang-structure-ext {
> >>                 prefix sx;
> >>               }
> >>
> >>               grouping leafrefs {
> >>                 leaf leaf1 {
> >>                   type leafref {
> >>                     path "/a:top/a:leaf2";
> >>                   }
> >>                 }
> >>               }
> >>
> >>               grouping leaves {
> >>                 leaf leaf2 {
> >>                   type string;
> >>                 }
> >>               }
> >>
> >>               container top {
> >>                 config false;
> >>                 uses leaves;
> >>               }
> >>
> >>
> >>               // Augments 'a:leaf1' into '/b:mystruct/b:mycontainer'.
> >>             This augmented
> >>               // 'a:leaf1' will be a sibling of 'b:myleaf'.
> >>               //
> >>               // XPath within a structure can only reference nodes
> >>             inside the same
> >>               // structure. Therefore, '/a:top/a:leaf2' must also be
> >>             augmented into
> >>               // 'b:mystruct' to satisfy the leafref path.
> >>               sx:augment-structure "/b:mystruct/b:mycontainer" {
> >>                 uses leafrefs;
> >>               }
> >>
> >>               // This 'augment-structure' attempts to satisfy the
> >>             leafref path by augmenting
> >>               // '/a:top/a:leaf2' into the root of '/b:mystruct'.
> >>             However, yanglint reports
> >>               // an error because we are augmenting to the root of a
> >>             structure.
> >>               sx:augment-structure "/b:mystruct" {
> >>                 container top {
> >>                   uses leaves;
> >>                 }
> >>               }
> >>
> >>               // This 'augment-structure' is valid in yanglint but
> >>             does not satisfy the
> >>               // leafref path because it augments '/b:top/a:leaf2',
> >>             not '/a:top/a:leaf2'.
> >>               sx:augment-structure "/b:mystruct/b:top" {
> >>                 uses leaves;
> >>               }
> >>             }
> >>             ```
> >>
> >>             * b.yang
> >>
> >>             ```
> >>             module b {
> >>               namespace "urn:b";
> >>               prefix b;
> >>
> >>               import ietf-yang-structure-ext {
> >>                 prefix sx;
> >>               }
> >>
> >>               sx:structure mystruct {
> >>                 container mycontainer {
> >>                   leaf myleaf {
> >>                     type string;
> >>                   }
> >>                 }
> >>                 container top { }
> >>               }
> >>             }
> >>             ```
> >>
> >>             Yanglint reports the following error for the second
> >>             augment-structure statement:
> >>
> >>             ```
> >>             libyang err : Augment extension target node "/b:mystruct"
> >>             from module "a" was not found.
> >>             (/a:{extension='sx:augment-structure'}/{augment='/b:mystruct'})
> >>             ```
> >>
> >>             And the following error for the third augment-structure
> >>             statement:
> >>
> >>             ```
> >>             libyang err : Not found node "top" in path.
> >>             (/b:mycontainer/a:leaf1)
> >>             ```
> >>
> >>             By the way, we found that this use of augment-structure
> >>             is claimed to be supported in the following links:
> >>
> >>             *
> >>             
> >> https://docs.yumaworks.com/en/latest/yangauto/define-abstract-yang.html
> >>             *
> >>             
> >> https://dr2lopez.github.io/yang-provenance/draft-lopez-opsawg-yang-provenance.html
> >>
> >>             BR/Phu
> >>             _______________________________________________
> >>             netmod mailing list -- [email protected]
> >>             To unsubscribe send an email to [email protected]
> >>
> >>
> >>     _______________________________________________
> >>     netmod mailing list [email protected]
> >>     To unsubscribe send an email [email protected]
> >     _______________________________________________
> >     netmod mailing list -- [email protected]
> >     To unsubscribe send an email to [email protected]
> >
> >
> > _______________________________________________
> > netmod mailing list [email protected]
> > To unsubscribe send an email [email protected]
_______________________________________________
netmod mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to