lib: better conditionalize leaf-list predicate xpath addition

If we're in the backend we already have the predicate added by mgmtd -- don't
add it again.

Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
Christian Hopps 2024-01-18 04:17:35 +00:00
parent f05a4e3b57
commit 9e34d817fc
7 changed files with 38 additions and 23 deletions

View File

@ -449,7 +449,7 @@ static int mgmt_be_txn_cfg_prepare(struct mgmt_be_txn_ctx *txn)
client_ctx->candidate_config, client_ctx->candidate_config,
txn_req->req.set_cfg.cfg_changes, txn_req->req.set_cfg.cfg_changes,
(size_t)txn_req->req.set_cfg.num_cfg_changes, (size_t)txn_req->req.set_cfg.num_cfg_changes,
NULL, err_buf, sizeof(err_buf), &error); NULL, true, err_buf, sizeof(err_buf), &error);
if (error) { if (error) {
err_buf[sizeof(err_buf) - 1] = 0; err_buf[sizeof(err_buf) - 1] = 0;
MGMTD_BE_CLIENT_ERR( MGMTD_BE_CLIENT_ERR(

View File

@ -694,10 +694,9 @@ static int dnode_create(struct nb_config *candidate, const char *xpath,
return NB_OK; return NB_OK;
} }
int nb_candidate_edit(struct nb_config *candidate, int nb_candidate_edit(struct nb_config *candidate, const struct nb_node *nb_node,
const struct nb_node *nb_node,
enum nb_operation operation, const char *xpath, enum nb_operation operation, const char *xpath,
const struct yang_data *previous, bool in_backend, const struct yang_data *previous,
const struct yang_data *data) const struct yang_data *data)
{ {
struct lyd_node *dnode, *dep_dnode, *old_dnode, *parent; struct lyd_node *dnode, *dep_dnode, *old_dnode, *parent;
@ -706,8 +705,13 @@ int nb_candidate_edit(struct nb_config *candidate,
uint32_t options = 0; uint32_t options = 0;
LY_ERR err; LY_ERR err;
/* Use special notation for leaf-lists (RFC 6020, section 9.13.5). */ /*
if (nb_node->snode->nodetype == LYS_LEAFLIST) * Use special notation for leaf-lists (RFC 6020, section 9.13.5).
* if we are in a backend client this notation was already applied
* by mgmtd before sending to us.
*/
if (!in_backend && nb_node->snode->nodetype == LYS_LEAFLIST &&
(operation == NB_OP_DESTROY || operation == NB_OP_DELETE))
snprintf(xpath_edit, sizeof(xpath_edit), "%s[.='%s']", xpath, snprintf(xpath_edit, sizeof(xpath_edit), "%s[.='%s']", xpath,
data->value); data->value);
else else
@ -838,10 +842,12 @@ bool nb_is_operation_allowed(struct nb_node *nb_node, enum nb_operation oper)
return true; return true;
} }
void nb_candidate_edit_config_changes( void nb_candidate_edit_config_changes(struct nb_config *candidate_config,
struct nb_config *candidate_config, struct nb_cfg_change cfg_changes[], struct nb_cfg_change cfg_changes[],
size_t num_cfg_changes, const char *xpath_base, char *err_buf, size_t num_cfg_changes,
int err_bufsize, bool *error) const char *xpath_base, bool in_backend,
char *err_buf, int err_bufsize,
bool *error)
{ {
if (error) if (error)
*error = false; *error = false;
@ -895,7 +901,8 @@ void nb_candidate_edit_config_changes(
* configuration. * configuration.
*/ */
ret = nb_candidate_edit(candidate_config, nb_node, ret = nb_candidate_edit(candidate_config, nb_node,
change->operation, xpath, NULL, data); change->operation, xpath, in_backend,
NULL, data);
yang_data_free(data); yang_data_free(data);
if (ret != NB_OK) { if (ret != NB_OK) {
flog_warn( flog_warn(

View File

@ -950,6 +950,9 @@ extern bool nb_is_operation_allowed(struct nb_node *nb_node,
* xpath * xpath
* XPath of the configuration node being edited. * XPath of the configuration node being edited.
* *
* in_backend
* Specify whether the changes are being applied in the backend or not.
*
* previous * previous
* Previous value of the configuration node. Should be used only when the * Previous value of the configuration node. Should be used only when the
* operation is NB_OP_MOVE, otherwise this parameter is ignored. * operation is NB_OP_MOVE, otherwise this parameter is ignored.
@ -964,7 +967,7 @@ extern bool nb_is_operation_allowed(struct nb_node *nb_node,
extern int nb_candidate_edit(struct nb_config *candidate, extern int nb_candidate_edit(struct nb_config *candidate,
const struct nb_node *nb_node, const struct nb_node *nb_node,
enum nb_operation operation, const char *xpath, enum nb_operation operation, const char *xpath,
const struct yang_data *previous, bool in_backend, const struct yang_data *previous,
const struct yang_data *data); const struct yang_data *data);
/* /*
@ -1009,6 +1012,9 @@ extern bool nb_candidate_needs_update(const struct nb_config *candidate);
* xpath_base * xpath_base
* Base xpath for config. * Base xpath for config.
* *
* in_backend
* Specify whether the changes are being applied in the backend or not.
*
* err_buf * err_buf
* Buffer to store human-readable error message in case of error. * Buffer to store human-readable error message in case of error.
* *
@ -1018,10 +1024,12 @@ extern bool nb_candidate_needs_update(const struct nb_config *candidate);
* error * error
* TRUE on error, FALSE on success * TRUE on error, FALSE on success
*/ */
extern void nb_candidate_edit_config_changes( extern void nb_candidate_edit_config_changes(struct nb_config *candidate_config,
struct nb_config *candidate_config, struct nb_cfg_change cfg_changes[], struct nb_cfg_change cfg_changes[],
size_t num_cfg_changes, const char *xpath_base, char *err_buf, size_t num_cfg_changes,
int err_bufsize, bool *error); const char *xpath_base,
bool in_backend, char *err_buf,
int err_bufsize, bool *error);
/* /*
* Delete candidate configuration changes. * Delete candidate configuration changes.

View File

@ -146,9 +146,9 @@ static int nb_cli_apply_changes_internal(struct vty *vty,
VTY_CHECK_XPATH; VTY_CHECK_XPATH;
nb_candidate_edit_config_changes( nb_candidate_edit_config_changes(vty->candidate_config, vty->cfg_changes,
vty->candidate_config, vty->cfg_changes, vty->num_cfg_changes, vty->num_cfg_changes, xpath_base,
xpath_base, buf, sizeof(buf), &error); false, buf, sizeof(buf), &error);
if (error) { if (error) {
/* /*
* Failure to edit the candidate configuration should never * Failure to edit the candidate configuration should never

View File

@ -256,7 +256,7 @@ frr_confd_cdb_diff_iter(confd_hkeypath_t *kp, enum cdb_iter_op cdb_op,
/* Edit the candidate configuration. */ /* Edit the candidate configuration. */
data = yang_data_new(xpath, value_str); data = yang_data_new(xpath, value_str);
ret = nb_candidate_edit(iter_args->candidate, nb_node, nb_op, xpath, ret = nb_candidate_edit(iter_args->candidate, nb_node, nb_op, xpath,
NULL, data); false, NULL, data);
yang_data_free(data); yang_data_free(data);
if (ret != NB_OK) { if (ret != NB_OK) {
flog_warn( flog_warn(

View File

@ -219,7 +219,7 @@ static int frr_sr_process_change(struct nb_config *candidate,
sr_val_to_buff(sr_data, value_str, sizeof(value_str)); sr_val_to_buff(sr_data, value_str, sizeof(value_str));
data = yang_data_new(xpath, value_str); data = yang_data_new(xpath, value_str);
ret = nb_candidate_edit(candidate, nb_node, nb_op, xpath, NULL, data); ret = nb_candidate_edit(candidate, nb_node, nb_op, xpath, false, NULL, data);
yang_data_free(data); yang_data_free(data);
if (ret != NB_OK) { if (ret != NB_OK) {
flog_warn( flog_warn(

View File

@ -587,8 +587,8 @@ static void mgmt_txn_process_set_cfg(struct event *thread)
txn_req->req.set_cfg->cfg_changes, txn_req->req.set_cfg->cfg_changes,
(size_t)txn_req->req.set_cfg (size_t)txn_req->req.set_cfg
->num_cfg_changes, ->num_cfg_changes,
NULL, err_buf, sizeof(err_buf), NULL, false, err_buf,
&error); sizeof(err_buf), &error);
if (error) { if (error) {
mgmt_fe_send_set_cfg_reply(txn->session_id, txn->txn_id, mgmt_fe_send_set_cfg_reply(txn->session_id, txn->txn_id,
txn_req->req.set_cfg->ds_id, txn_req->req.set_cfg->ds_id,