Skip to content

Commit

Permalink
Merge pull request FRRouting#16840 from LabNConsulting/chopps/yang-lib
Browse files Browse the repository at this point in the history
add ietf-yang-library support
  • Loading branch information
donaldsharp committed Sep 18, 2024
2 parents 174d46d + d5e4e2d commit 04a6f2d
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/northbound.h
Original file line number Diff line number Diff line change
Expand Up @@ -1716,6 +1716,7 @@ extern void nb_terminate(void);

extern void nb_oper_init(struct event_loop *loop);
extern void nb_oper_terminate(void);
extern bool nb_oper_is_yang_lib_query(const char *xpath);

#ifdef __cplusplus
}
Expand Down
10 changes: 10 additions & 0 deletions lib/northbound_oper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1741,6 +1741,16 @@ static enum nb_error nb_op_walk_start(struct nb_op_yield_state *ys)
return __walk(ys, false);
}

bool nb_oper_is_yang_lib_query(const char *xpath)
{
const char *libstr = "/ietf-yang-library:";
const unsigned long liblen = strlen(libstr);

if (strncmp(libstr, xpath, liblen))
return false;

return strlen(xpath) > liblen;
}

void *nb_oper_walk(const char *xpath, struct yang_translator *translator,
uint32_t flags, bool should_batch, nb_oper_data_cb cb,
Expand Down
3 changes: 3 additions & 0 deletions mgmtd/mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ void mgmt_init(void)
/* Initialize MGMTD Transaction module */
mgmt_txn_init(mm, mm->master);

/* Add yang-library module */
yang_module_load("ietf-yang-library", NULL);

/* Initialize the MGMTD Frontend Adapter Module */
mgmt_fe_adapter_init(mm->master);

Expand Down
25 changes: 25 additions & 0 deletions mgmtd/mgmt_fe_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -1337,6 +1337,31 @@ static void fe_adapter_handle_get_data(struct mgmt_fe_session_ctx *session,
goto done;
}

/* Check for yang-library shortcut */
if (nb_oper_is_yang_lib_query(msg->xpath)) {
struct lyd_node *ylib = NULL;
LY_ERR err;

err = ly_ctx_get_yanglib_data(ly_native_ctx, &ylib, "%u",
ly_ctx_get_change_count(
ly_native_ctx));
if (err) {
fe_adapter_send_error(session, req_id, false, err,
"Error getting yang-library data, session-id: %" PRIu64
" error: %s",
session->session_id,
ly_last_errmsg());
} else {
yang_lyd_trim_xpath(&ylib, msg->xpath);
(void)fe_adapter_send_tree_data(session, req_id, false,
msg->result_type,
wd_options, ylib, 0);
}
if (ylib)
lyd_free_all(ylib);
goto done;
}

switch (msg->datastore) {
case MGMT_MSG_DATASTORE_CANDIDATE:
ds_id = MGMTD_DS_CANDIDATE;
Expand Down
10 changes: 10 additions & 0 deletions tests/topotests/mgmt_oper/r1/frr-yanglib.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
log timestamp precision 6
log file frr.log

no debug memstats-at-exit

debug mgmt backend datastore frontend transaction

interface r1-eth0
ip address 1.1.1.1/24
exit
45 changes: 45 additions & 0 deletions tests/topotests/mgmt_oper/test_yanglib.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env python
# SPDX-License-Identifier: ISC
# -*- coding: utf-8 eval: (blacken-mode 1) -*-
#
# September 17 2024, Christian Hopps <[email protected]>
#
# Copyright (c) 2024, LabN Consulting, L.L.C.
#

import json
import pytest
from lib.topogen import Topogen

pytestmark = [pytest.mark.staticd, pytest.mark.mgmtd]


@pytest.fixture(scope="module")
def tgen(request):
"Setup/Teardown the environment and provide tgen argument to tests"

topodef = {"s1": ("r1",)}

tgen = Topogen(topodef, request.module.__name__)
tgen.start_topology()

router_list = tgen.routers()
for rname, router in router_list.items():
router.load_frr_config("frr-yanglib.conf")

tgen.start_router()
yield tgen
tgen.stop_topology()


def test_yang_lib(tgen):
if tgen.routers_have_failure():
pytest.skip(tgen.errors)

r1 = tgen.gears["r1"].net
output = r1.cmd_nostatus(
"vtysh -c 'show mgmt get-data /ietf-yang-library:yang-library'"
)
ret = json.loads(output)
loaded_modules = ret['ietf-yang-library:yang-library']['module-set'][0]['module']
assert len(loaded_modules) > 10, "Modules missing from yang-library"

0 comments on commit 04a6f2d

Please sign in to comment.