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.

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]

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
netmod mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to