mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-12 14:27:36 +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,
|
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(
|
||||||
|
@ -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(
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
@ -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(
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user