mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
lib: nb: call child destroy CBs when YANG container is deleted
Previously the code was only calling the child destroy callbacks if the target deleted node was a non-presence container. We now add a flag to the callback structure to instruct northbound to perform the rescursive delete for code that wishes for this to happen. - Fix wrong relative path lookup in keychain destroy callback Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
baf4c1a78f
commit
d03ecf4562
|
@ -587,9 +587,9 @@ static int key_chains_key_chain_key_crypto_algorithm_destroy(
|
||||||
if (args->event != NB_EV_APPLY)
|
if (args->event != NB_EV_APPLY)
|
||||||
return NB_OK;
|
return NB_OK;
|
||||||
|
|
||||||
name = yang_dnode_get_string(args->dnode, "../../../name");
|
name = yang_dnode_get_string(args->dnode, "../../name");
|
||||||
keychain = keychain_lookup(name);
|
keychain = keychain_lookup(name);
|
||||||
index = (uint32_t)yang_dnode_get_uint64(args->dnode, "../../key-id");
|
index = (uint32_t)yang_dnode_get_uint64(args->dnode, "../key-id");
|
||||||
key = key_lookup(keychain, index);
|
key = key_lookup(keychain, index);
|
||||||
key->hash_algo = KEYCHAIN_ALGO_NULL;
|
key->hash_algo = KEYCHAIN_ALGO_NULL;
|
||||||
keychain_touch(keychain);
|
keychain_touch(keychain);
|
||||||
|
|
|
@ -516,20 +516,33 @@ void nb_config_diff_created(const struct lyd_node *dnode, uint32_t *seq,
|
||||||
static void nb_config_diff_deleted(const struct lyd_node *dnode, uint32_t *seq,
|
static void nb_config_diff_deleted(const struct lyd_node *dnode, uint32_t *seq,
|
||||||
struct nb_config_cbs *changes)
|
struct nb_config_cbs *changes)
|
||||||
{
|
{
|
||||||
|
struct nb_node *nb_node = dnode->schema->priv;
|
||||||
|
struct lyd_node *child;
|
||||||
|
bool recursed = false;
|
||||||
|
|
||||||
/* Ignore unimplemented nodes. */
|
/* Ignore unimplemented nodes. */
|
||||||
if (!dnode->schema->priv)
|
if (!nb_node)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the CB structure indicates it (recurse flag set), call the destroy
|
||||||
|
* callbacks for the children of a containment node.
|
||||||
|
*/
|
||||||
|
if (CHECK_FLAG(dnode->schema->nodetype, LYS_CONTAINER | LYS_LIST) &&
|
||||||
|
CHECK_FLAG(nb_node->cbs.flags, F_NB_CB_DESTROY_RECURSE)) {
|
||||||
|
recursed = true;
|
||||||
|
LY_LIST_FOR (lyd_child(dnode), child) {
|
||||||
|
nb_config_diff_deleted(child, seq, changes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (nb_cb_operation_is_valid(NB_CB_DESTROY, dnode->schema))
|
if (nb_cb_operation_is_valid(NB_CB_DESTROY, dnode->schema))
|
||||||
nb_config_diff_add_change(changes, NB_CB_DESTROY, seq, dnode);
|
nb_config_diff_add_change(changes, NB_CB_DESTROY, seq, dnode);
|
||||||
else if (CHECK_FLAG(dnode->schema->nodetype, LYS_CONTAINER)) {
|
else if (CHECK_FLAG(dnode->schema->nodetype, LYS_CONTAINER) && !recursed) {
|
||||||
struct lyd_node *child;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Non-presence containers need special handling since they
|
* If we didn't already above, call destroy on the children of
|
||||||
* don't have "destroy" callbacks. In this case, what we need to
|
* this container (it's an NP container) as NP containers have
|
||||||
* do is to call the "destroy" callbacks of their child nodes
|
* no destroy CB themselves.
|
||||||
* when applicable (i.e. optional nodes).
|
|
||||||
*/
|
*/
|
||||||
LY_LIST_FOR (lyd_child(dnode), child) {
|
LY_LIST_FOR (lyd_child(dnode), child) {
|
||||||
nb_config_diff_deleted(child, seq, changes);
|
nb_config_diff_deleted(child, seq, changes);
|
||||||
|
|
|
@ -385,6 +385,11 @@ struct nb_callbacks {
|
||||||
*/
|
*/
|
||||||
int (*destroy)(struct nb_cb_destroy_args *args);
|
int (*destroy)(struct nb_cb_destroy_args *args);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags to control the how northbound callbacks are invoked.
|
||||||
|
*/
|
||||||
|
uint flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configuration callback.
|
* Configuration callback.
|
||||||
*
|
*
|
||||||
|
@ -622,6 +627,12 @@ struct nb_callbacks {
|
||||||
void (*cli_show_end)(struct vty *vty, const struct lyd_node *dnode);
|
void (*cli_show_end)(struct vty *vty, const struct lyd_node *dnode);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flag indicating the northbound should recurse destroy the children of this
|
||||||
|
* node when it is destroyed.
|
||||||
|
*/
|
||||||
|
#define F_NB_CB_DESTROY_RECURSE 0x01
|
||||||
|
|
||||||
struct nb_dependency_callbacks {
|
struct nb_dependency_callbacks {
|
||||||
void (*get_dependant_xpath)(const struct lyd_node *dnode, char *xpath);
|
void (*get_dependant_xpath)(const struct lyd_node *dnode, char *xpath);
|
||||||
void (*get_dependency_xpath)(const struct lyd_node *dnode, char *xpath);
|
void (*get_dependency_xpath)(const struct lyd_node *dnode, char *xpath);
|
||||||
|
|
Loading…
Reference in a new issue