mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-12 07:26:08 +00:00
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:
parent
f05a4e3b57
commit
9e34d817fc
@ -449,7 +449,7 @@ static int mgmt_be_txn_cfg_prepare(struct mgmt_be_txn_ctx *txn)
|
||||
client_ctx->candidate_config,
|
||||
txn_req->req.set_cfg.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) {
|
||||
err_buf[sizeof(err_buf) - 1] = 0;
|
||||
MGMTD_BE_CLIENT_ERR(
|
||||
|
@ -694,10 +694,9 @@ static int dnode_create(struct nb_config *candidate, const char *xpath,
|
||||
return NB_OK;
|
||||
}
|
||||
|
||||
int nb_candidate_edit(struct nb_config *candidate,
|
||||
const struct nb_node *nb_node,
|
||||
int nb_candidate_edit(struct nb_config *candidate, const struct nb_node *nb_node,
|
||||
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)
|
||||
{
|
||||
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;
|
||||
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,
|
||||
data->value);
|
||||
else
|
||||
@ -838,10 +842,12 @@ bool nb_is_operation_allowed(struct nb_node *nb_node, enum nb_operation oper)
|
||||
return true;
|
||||
}
|
||||
|
||||
void nb_candidate_edit_config_changes(
|
||||
struct nb_config *candidate_config, struct nb_cfg_change cfg_changes[],
|
||||
size_t num_cfg_changes, const char *xpath_base, char *err_buf,
|
||||
int err_bufsize, bool *error)
|
||||
void nb_candidate_edit_config_changes(struct nb_config *candidate_config,
|
||||
struct nb_cfg_change cfg_changes[],
|
||||
size_t num_cfg_changes,
|
||||
const char *xpath_base, bool in_backend,
|
||||
char *err_buf, int err_bufsize,
|
||||
bool *error)
|
||||
{
|
||||
if (error)
|
||||
*error = false;
|
||||
@ -895,7 +901,8 @@ void nb_candidate_edit_config_changes(
|
||||
* configuration.
|
||||
*/
|
||||
ret = nb_candidate_edit(candidate_config, nb_node,
|
||||
change->operation, xpath, NULL, data);
|
||||
change->operation, xpath, in_backend,
|
||||
NULL, data);
|
||||
yang_data_free(data);
|
||||
if (ret != NB_OK) {
|
||||
flog_warn(
|
||||
|
@ -950,6 +950,9 @@ extern bool nb_is_operation_allowed(struct nb_node *nb_node,
|
||||
* xpath
|
||||
* XPath of the configuration node being edited.
|
||||
*
|
||||
* in_backend
|
||||
* Specify whether the changes are being applied in the backend or not.
|
||||
*
|
||||
* previous
|
||||
* Previous value of the configuration node. Should be used only when the
|
||||
* 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,
|
||||
const struct nb_node *nb_node,
|
||||
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);
|
||||
|
||||
/*
|
||||
@ -1009,6 +1012,9 @@ extern bool nb_candidate_needs_update(const struct nb_config *candidate);
|
||||
* xpath_base
|
||||
* Base xpath for config.
|
||||
*
|
||||
* in_backend
|
||||
* Specify whether the changes are being applied in the backend or not.
|
||||
*
|
||||
* err_buf
|
||||
* 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
|
||||
* TRUE on error, FALSE on success
|
||||
*/
|
||||
extern void nb_candidate_edit_config_changes(
|
||||
struct nb_config *candidate_config, struct nb_cfg_change cfg_changes[],
|
||||
size_t num_cfg_changes, const char *xpath_base, char *err_buf,
|
||||
int err_bufsize, bool *error);
|
||||
extern void nb_candidate_edit_config_changes(struct nb_config *candidate_config,
|
||||
struct nb_cfg_change cfg_changes[],
|
||||
size_t num_cfg_changes,
|
||||
const char *xpath_base,
|
||||
bool in_backend, char *err_buf,
|
||||
int err_bufsize, bool *error);
|
||||
|
||||
/*
|
||||
* Delete candidate configuration changes.
|
||||
|
@ -146,9 +146,9 @@ static int nb_cli_apply_changes_internal(struct vty *vty,
|
||||
|
||||
VTY_CHECK_XPATH;
|
||||
|
||||
nb_candidate_edit_config_changes(
|
||||
vty->candidate_config, vty->cfg_changes, vty->num_cfg_changes,
|
||||
xpath_base, buf, sizeof(buf), &error);
|
||||
nb_candidate_edit_config_changes(vty->candidate_config, vty->cfg_changes,
|
||||
vty->num_cfg_changes, xpath_base,
|
||||
false, buf, sizeof(buf), &error);
|
||||
if (error) {
|
||||
/*
|
||||
* Failure to edit the candidate configuration should never
|
||||
|
@ -256,7 +256,7 @@ frr_confd_cdb_diff_iter(confd_hkeypath_t *kp, enum cdb_iter_op cdb_op,
|
||||
/* Edit the candidate configuration. */
|
||||
data = yang_data_new(xpath, value_str);
|
||||
ret = nb_candidate_edit(iter_args->candidate, nb_node, nb_op, xpath,
|
||||
NULL, data);
|
||||
false, NULL, data);
|
||||
yang_data_free(data);
|
||||
if (ret != NB_OK) {
|
||||
flog_warn(
|
||||
|
@ -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));
|
||||
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);
|
||||
if (ret != NB_OK) {
|
||||
flog_warn(
|
||||
|
@ -587,8 +587,8 @@ static void mgmt_txn_process_set_cfg(struct event *thread)
|
||||
txn_req->req.set_cfg->cfg_changes,
|
||||
(size_t)txn_req->req.set_cfg
|
||||
->num_cfg_changes,
|
||||
NULL, err_buf, sizeof(err_buf),
|
||||
&error);
|
||||
NULL, false, err_buf,
|
||||
sizeof(err_buf), &error);
|
||||
if (error) {
|
||||
mgmt_fe_send_set_cfg_reply(txn->session_id, txn->txn_id,
|
||||
txn_req->req.set_cfg->ds_id,
|
||||
|
Loading…
Reference in New Issue
Block a user