mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-17 00:20:07 +00:00
Merge pull request #15946 from LabNConsulting/chopps/rpc-cleanup
mgmtd RPC minor cleanup
This commit is contained in:
commit
8ac0a1d50e
@ -1443,20 +1443,14 @@ static void fe_adapter_handle_rpc(struct mgmt_fe_session_ctx *session,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snode->nodetype == LYS_RPC)
|
if (snode->nodetype != LYS_RPC && snode->nodetype != LYS_ACTION) {
|
||||||
clients =
|
|
||||||
mgmt_be_interested_clients(xpath,
|
|
||||||
MGMT_BE_XPATH_SUBSCR_TYPE_RPC);
|
|
||||||
else if (snode->nodetype == LYS_ACTION)
|
|
||||||
clients =
|
|
||||||
mgmt_be_interested_clients(xpath,
|
|
||||||
MGMT_BE_XPATH_SUBSCR_TYPE_CFG);
|
|
||||||
else {
|
|
||||||
fe_adapter_send_error(session, req_id, false, -EINVAL,
|
fe_adapter_send_error(session, req_id, false, -EINVAL,
|
||||||
"Not an RPC or action path: %s", xpath);
|
"Not an RPC or action path: %s", xpath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clients = mgmt_be_interested_clients(xpath,
|
||||||
|
MGMT_BE_XPATH_SUBSCR_TYPE_RPC);
|
||||||
if (!clients) {
|
if (!clients) {
|
||||||
__dbg("No backends implement xpath: %s for txn-id: %" PRIu64
|
__dbg("No backends implement xpath: %s for txn-id: %" PRIu64
|
||||||
" session-id: %" PRIu64,
|
" session-id: %" PRIu64,
|
||||||
|
@ -2695,8 +2695,10 @@ int mgmt_txn_notify_error(struct mgmt_be_client_adapter *adapter,
|
|||||||
case MGMTD_TXN_PROC_RPC:
|
case MGMTD_TXN_PROC_RPC:
|
||||||
rpc = txn_req->req.rpc;
|
rpc = txn_req->req.rpc;
|
||||||
rpc->recv_clients |= (1u << id);
|
rpc->recv_clients |= (1u << id);
|
||||||
rpc->errstr = XSTRDUP(MTYPE_MGMTD_ERR, errstr);
|
if (errstr) {
|
||||||
|
XFREE(MTYPE_MGMTD_ERR, rpc->errstr);
|
||||||
|
rpc->errstr = XSTRDUP(MTYPE_MGMTD_ERR, errstr);
|
||||||
|
}
|
||||||
/* check if done yet */
|
/* check if done yet */
|
||||||
if (rpc->recv_clients != rpc->sent_clients)
|
if (rpc->recv_clients != rpc->sent_clients)
|
||||||
return 0;
|
return 0;
|
||||||
@ -2798,8 +2800,9 @@ int mgmt_txn_notify_rpc_reply(struct mgmt_be_client_adapter *adapter,
|
|||||||
struct mgmt_txn_ctx *txn = mgmt_txn_id2ctx(txn_id);
|
struct mgmt_txn_ctx *txn = mgmt_txn_id2ctx(txn_id);
|
||||||
struct mgmt_txn_req *txn_req;
|
struct mgmt_txn_req *txn_req;
|
||||||
struct txn_req_rpc *rpc;
|
struct txn_req_rpc *rpc;
|
||||||
|
struct lyd_node *tree;
|
||||||
size_t data_len = msg_len - sizeof(*reply_msg);
|
size_t data_len = msg_len - sizeof(*reply_msg);
|
||||||
LY_ERR err;
|
LY_ERR err = LY_SUCCESS;
|
||||||
|
|
||||||
if (!txn) {
|
if (!txn) {
|
||||||
__log_err("RPC reply from %s for a missing txn-id %" PRIu64,
|
__log_err("RPC reply from %s for a missing txn-id %" PRIu64,
|
||||||
@ -2820,22 +2823,34 @@ int mgmt_txn_notify_rpc_reply(struct mgmt_be_client_adapter *adapter,
|
|||||||
|
|
||||||
rpc = txn_req->req.rpc;
|
rpc = txn_req->req.rpc;
|
||||||
|
|
||||||
/* we don't expect more than one daemon to provide output for an RPC */
|
tree = NULL;
|
||||||
if (!rpc->client_results && data_len > 0) {
|
if (data_len)
|
||||||
err = yang_parse_rpc(rpc->xpath, reply_msg->result_type,
|
err = yang_parse_rpc(rpc->xpath, reply_msg->result_type,
|
||||||
reply_msg->data, true,
|
reply_msg->data, true, &tree);
|
||||||
&rpc->client_results);
|
if (err) {
|
||||||
|
__log_err("RPC reply from %s for txn-id %" PRIu64
|
||||||
|
" req_id %" PRIu64 " error parsing result of type %u: %s",
|
||||||
|
adapter->name, txn_id, req_id, reply_msg->result_type,
|
||||||
|
ly_strerrcode(err));
|
||||||
|
}
|
||||||
|
if (!err && tree) {
|
||||||
|
if (!rpc->client_results)
|
||||||
|
rpc->client_results = tree;
|
||||||
|
else
|
||||||
|
err = lyd_merge_siblings(&rpc->client_results, tree,
|
||||||
|
LYD_MERGE_DESTRUCT);
|
||||||
if (err) {
|
if (err) {
|
||||||
__log_err("RPC reply from %s for txn-id %" PRIu64
|
__log_err("RPC reply from %s for txn-id %" PRIu64
|
||||||
" req_id %" PRIu64
|
" req_id %" PRIu64 " error merging result: %s",
|
||||||
" error parsing result of type %u",
|
|
||||||
adapter->name, txn_id, req_id,
|
adapter->name, txn_id, req_id,
|
||||||
reply_msg->result_type);
|
ly_strerrcode(err));
|
||||||
rpc->errstr =
|
|
||||||
XSTRDUP(MTYPE_MGMTD_ERR,
|
|
||||||
"Cannot parse result from the backend");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (err) {
|
||||||
|
XFREE(MTYPE_MGMTD_ERR, rpc->errstr);
|
||||||
|
rpc->errstr = XSTRDUP(MTYPE_MGMTD_ERR,
|
||||||
|
"Cannot parse result from the backend");
|
||||||
|
}
|
||||||
|
|
||||||
rpc->recv_clients |= (1u << id);
|
rpc->recv_clients |= (1u << id);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user