Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rpc input/output extensions are not printed #2280

Open
olivier-matz-6wind opened this issue Aug 5, 2024 · 0 comments · Fixed by #2281
Open

rpc input/output extensions are not printed #2280

olivier-matz-6wind opened this issue Aug 5, 2024 · 0 comments · Fixed by #2281
Labels
is:bug Bug description. status:completed From the developer perspective, the issue was solved (bug fixed, question answered,...)

Comments

@olivier-matz-6wind
Copy link
Contributor

When using a lys_print_*() function on a yang model that contains extensions on rpc input or output nodes, these ones are not displayed.

The problem can be reproduced with the following example:

#include <stddef.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>

#include <libyang/libyang.h>

const char *yang = "module my-mod {\n"
                "  yang-version 1.1;\n"
                "  namespace \"http://example.com/my-mod\";\n"
                "  prefix my-mod;\n"
                "\n"
                "  extension my-ext {\n"
                "    argument arg;\n"
                "    description \"my desc\";\n"
                "  }\n"
                "\n"
                "  extension my-ext2 {\n"
                "    description \"my desc\";\n"
                "  }\n"
                "\n"
                "  rpc my-rpc {\n"
                "    my-mod:my-ext arg-rpc;\n"
                "    input {\n"
                "      my-mod:my-ext arg-input;\n"
                "      my-mod:my-ext2;\n"
                "      leaf in-value {\n"
                "        my-mod:my-ext arg-in-value;\n"
                "        type uint32;\n"
                "      }\n"
                "    }\n"
                "    output {\n"
                "      my-mod:my-ext arg-output;\n"
                "      leaf out-value {\n"
                "        my-mod:my-ext arg-out-value;\n"
                "        type uint32;\n"
                "      }\n"
                "    }\n"
                "  }\n"
                "}\n";

int main(int argc, char **argv)
{
    struct lys_module *mod = NULL;
    struct ly_ctx *ctx = NULL;
    int exit_code = 1;
    int ret;

    (void)argc;
    (void)argv;

    ret = ly_ctx_new(NULL, 0, &ctx);
    if (ret != LY_SUCCESS) {
        fprintf(stderr, "ly_ctx_new() failed: %s\n", ly_strerrcode(ret));
        goto fail;
    }

    ret = lys_parse_mem(ctx, yang, LYS_IN_YANG, &mod);
    if (ret != LY_SUCCESS) {
        fprintf(stderr, "lys_parse_mem() failed: %s\n", ly_strerrcode(ret));
        goto fail;
    }

    printf("%s", yang);
    printf("----------------------\n");
    lys_print_file(stdout, mod, LYS_OUT_YANG, 0);

    exit_code = 0;

fail:
    ly_ctx_destroy(ctx);

    return exit_code;
}

The output of the program is:

module my-mod {
  yang-version 1.1;
  namespace "http://example.com/my-mod";
  prefix my-mod;

  extension my-ext {
    argument arg;
    description "my desc";
  }

  extension my-ext2 {
    description "my desc";
  }

  rpc my-rpc {
    my-mod:my-ext arg-rpc;
    input {
      my-mod:my-ext arg-input;
      my-mod:my-ext2;
      leaf in-value {
        my-mod:my-ext arg-in-value;
        type uint32;
      }
    }
    output {
      my-mod:my-ext arg-output;
      leaf out-value {
        my-mod:my-ext arg-out-value;
        type uint32;
      }
    }
  }
}
----------------------
module my-mod {
  yang-version 1.1;
  namespace "http://example.com/my-mod";
  prefix my-mod;

  extension my-ext {
    argument arg;
    description
      "my desc";
  }
  extension my-ext2 {
    description
      "my desc";
  }

  rpc my-rpc {
    my-mod:my-ext "arg-rpc";

    input {
      leaf in-value {
        my-mod:my-ext "arg-in-value";
        type uint32;
      }
    }
    output {
      leaf out-value {
        my-mod:my-ext "arg-out-value";
        type uint32;
      }
    }
  }
}

The extensions from rpc input and output disappeared on the printed yang.

Note that sysrepo uses a yang print function when installing a module with sr_install_module(), so the generated yang files in /etc/sysrepo/yang won't have any extensions on rpc input or output nodes.

The patch looks quite easy:

--- a/src/printer_yang.c
+++ b/src/printer_yang.c
@@ -1162,7 +1162,7 @@ yprp_inout(struct lys_ypr_ctx *pctx, const struct lysp_node_action_inout *inout,
     ly_print_(pctx->out, "%*s%s {\n", INDENT, inout->name);
     LEVEL++;
 
-    yprp_extension_instances(pctx, LY_STMT_MUST, 0, inout->exts, NULL);
+    yprp_extension_instances(pctx, lyplg_ext_nodetype2stmt(inout->nodetype), 0, inout->exts, NULL);
     LY_ARRAY_FOR(inout->musts, u) {
         yprp_restr(pctx, &inout->musts[u], LY_STMT_MUST, NULL);
     }

I'm submitting a PR for this.

@michalvasko michalvasko added is:bug Bug description. status:completed From the developer perspective, the issue was solved (bug fixed, question answered,...) labels Aug 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
is:bug Bug description. status:completed From the developer perspective, the issue was solved (bug fixed, question answered,...)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants