Skip to content

Commit

Permalink
lib, mgmtd: add ability to request the exact node in get-data request
Browse files Browse the repository at this point in the history
RESTCONF expects to receive the exact node as a result, not the whole
data tree.

Signed-off-by: Igor Ryzhov <[email protected]>
  • Loading branch information
idryzhov committed Jan 15, 2024
1 parent 10eac0a commit 9859f30
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 2 deletions.
1 change: 1 addition & 0 deletions lib/mgmt_msg_native.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ _Static_assert(sizeof(struct mgmt_msg_tree_data) ==
/* Flags for get-data request */
#define GET_DATA_FLAG_STATE 0x01 /* get only "config false" data */
#define GET_DATA_FLAG_CONFIG 0x02 /* get only "config true" data */
#define GET_DATA_FLAG_EXACT 0x04 /* get exact data node instead of the full tree */

/**
* struct mgmt_msg_get_data - frontend get-data request.
Expand Down
10 changes: 9 additions & 1 deletion mgmtd/mgmt_txn.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ struct txn_req_get_tree {
uint64_t recv_clients; /* Bitmask of clients recv reply from */
int32_t partial_error; /* an error while gather results */
uint8_t result_type; /* LYD_FORMAT for results */
uint8_t exact; /* if exact node is requested */
uint8_t simple_xpath; /* if xpath is simple */
struct lyd_node *client_results; /* result tree from clients */
};
Expand Down Expand Up @@ -1258,6 +1259,7 @@ static int txn_get_tree_data_done(struct mgmt_txn_ctx *txn,
{
struct txn_req_get_tree *get_tree = txn_req->req.get_tree;
uint64_t req_id = txn_req->req_id;
struct lyd_node *result;
int ret = NB_OK;

/* cancel timer and send reply onward */
Expand All @@ -1272,12 +1274,17 @@ static int txn_get_tree_data_done(struct mgmt_txn_ctx *txn,
ret = NB_ERR;
}

result = get_tree->client_results;

if (ret == NB_OK && result && get_tree->exact)
result = yang_dnode_get(result, get_tree->xpath);

if (ret == NB_OK)
ret = mgmt_fe_adapter_send_tree_data(txn->session_id,
txn->txn_id,
txn_req->req_id,
get_tree->result_type,
get_tree->client_results,
result,
get_tree->partial_error,
false);

Expand Down Expand Up @@ -2383,6 +2390,7 @@ int mgmt_txn_send_get_tree_oper(uint64_t txn_id, uint64_t req_id,
txn_req = mgmt_txn_req_alloc(txn, req_id, MGMTD_TXN_PROC_GETTREE);
get_tree = txn_req->req.get_tree;
get_tree->result_type = result_type;
get_tree->exact = CHECK_FLAG(flags, GET_DATA_FLAG_EXACT);
get_tree->simple_xpath = simple_xpath;
get_tree->xpath = XSTRDUP(MTYPE_MGMTD_XPATH, xpath);

Expand Down
6 changes: 5 additions & 1 deletion mgmtd/mgmt_vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,13 +251,14 @@ DEFPY(show_mgmt_get_config, show_mgmt_get_config_cmd,
}

DEFPY(show_mgmt_get_data, show_mgmt_get_data_cmd,
"show mgmt get-data WORD$path [with-config|only-config]$content [json|xml]$fmt",
"show mgmt get-data WORD$path [with-config|only-config]$content [exact]$exact [json|xml]$fmt",
SHOW_STR
MGMTD_STR
"Get a data from the operational datastore\n"
"XPath expression specifying the YANG data root\n"
"Include \"config true\" data\n"
"Get only \"config true\" data\n"
"Get exact node instead of the whole data tree\n"
"JSON output format\n"
"XML output format\n")
{
Expand All @@ -269,6 +270,9 @@ DEFPY(show_mgmt_get_data, show_mgmt_get_data_cmd,
if (content && content[0] == 'w')
flags |= GET_DATA_FLAG_STATE;

if (exact)
flags |= GET_DATA_FLAG_EXACT;

/* get rid of extraneous trailing slash-* or single '/' unless root */
if (plen > 2 && ((path[plen - 2] == '/' && path[plen - 1] == '*') ||
(path[plen - 2] != '/' && path[plen - 1] == '/'))) {
Expand Down

0 comments on commit 9859f30

Please sign in to comment.