diff --git a/models/ietf-yang-library-augmentedby@2023-10-27.yang b/models/ietf-yang-library-augmentedby@2023-10-27.yang new file mode 100644 index 000000000..f81d10881 --- /dev/null +++ b/models/ietf-yang-library-augmentedby@2023-10-27.yang @@ -0,0 +1,86 @@ +module ietf-yang-library-augmentedby { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-library-augmentedby"; + prefix yanglib-aug; + + import ietf-yang-library { + prefix yanglib; + reference + "RFC 8525: YANG Library"; + } + + organization + "IETF NETCONF (Network Configuration) Working Group"; + contact + "WG Web: + WG List: + + Author: Zhuoyao Lin + + Benoit Claise + + IGNACIO DOMINGUEZ MARTINEZ-CASANUEVA + "; + + description + "This module augments the ietf-yang-library defined in + [RFC8525] to provide not only the deviation list, but also + the augmented-by list, in order to give sufficient + information about the YANG modules reverse dependency. It + facilitates the process of obtaining the entire + dependencies of YANG module. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', + 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', + 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document + are to be interpreted as described in BCP 14 (RFC 2119) + (RFC 8174) when, and only when, they appear in all + capitals, as shown here. + + Copyright (c) 2022 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + This version of this YANG module is part of RFC XXXX; see the + RFC itself for full legal notices. "; + + revision 2023-10-27 { + description + "Added list augmented-by in yang-library/module-set/module to + make the module store the entire reverse dependency information + (augmented-by and deviation)."; + reference + "RFC XXXX: Support of augmentedby in ietf-yang-library"; + } + + augment "/yanglib:yang-library/yanglib:module-set/yanglib:module" { + description + "Augment the augmented-by list from module info with the + module-augmented-by grouping" ; + + leaf-list augmented-by { + type leafref { + path "../../yanglib:module/yanglib:name"; + } + + description + "Leaf-list of the augmentation used by this server to + modify the conformance of the module associated with + this entry. Note that the same module can be used for + augmented-by for multiple modules, so the same + entry MAY appear within multiple 'module' entries. + + This reference MUST NOT (directly or indirectly) + refer to the module being augmented. + + Robust clients may want to make sure that they handle a + situation where a module augments itself (directly or + indirectly) gracefully."; + } + } +} diff --git a/src/context.c b/src/context.c index 102978c4b..bda87ea1f 100644 --- a/src/context.c +++ b/src/context.c @@ -1158,6 +1158,26 @@ ylib_deviation(struct lyd_node *parent, const struct lys_module *cur_mod, ly_boo return LY_SUCCESS; } +static LY_ERR +ylib_augmentedby(struct lyd_node *parent, const struct lys_module *cur_mod) +{ + struct lys_module *mod, *ylab_mod; + LY_ARRAY_COUNT_TYPE i; + + ylab_mod = ly_ctx_get_module_implemented(LYD_CTX(parent), "ietf-yang-library-augmentedby"); + + if (!cur_mod->implemented || !ylab_mod) { + return LY_SUCCESS; + } + + LY_ARRAY_FOR(cur_mod->augmented_by, i) { + mod = cur_mod->augmented_by[i]; + LY_CHECK_RET(lyd_new_term(parent, ylab_mod, "augmented-by", mod->name, 0, NULL)); + } + + return LY_SUCCESS; +} + static LY_ERR ylib_submodules(struct lyd_node *parent, const struct lysp_module *pmod, ly_bool bis) { @@ -1303,6 +1323,9 @@ ly_ctx_get_yanglib_data(const struct ly_ctx *ctx, struct lyd_node **root_p, cons /* deviation */ LY_CHECK_GOTO(ret = ylib_deviation(cont, mod, 1), error); + + /* augmentation list */ + LY_CHECK_GOTO(ret = ylib_augmentedby(cont, mod), error); } }