mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 09:22:32 +00:00
lib: northbound cli support to end config nodes
Some more complex CLI usages will require northbound to support signalizing a custom configuration node end. For an example: ``` router bgp 100 bgp router-id 10.254.254.1 neighbor 10.0.0.100 remote-as 200 ! address-family ipv4 unicast network 10.0.1.0/24 network 10.0.2.0/24 network 10.0.3.0/24 exit-address-family ! address-family ipv6 unicast neighbor 10.0.0.100 activate exit-address-family ! ``` This commit implements a new callback called `cli_show_end` which complements `cli_show` and is only called at the end of processing the yang configuration node. It will be used to write the configuration node termination like: "!" or "exit-address-family". Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
This commit is contained in:
parent
990e89e5ed
commit
a4d3c1d41d
@ -337,6 +337,27 @@ struct nb_callbacks {
|
|||||||
*/
|
*/
|
||||||
void (*cli_show)(struct vty *vty, struct lyd_node *dnode,
|
void (*cli_show)(struct vty *vty, struct lyd_node *dnode,
|
||||||
bool show_defaults);
|
bool show_defaults);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optional callback to show the CLI node end for lists or containers.
|
||||||
|
*
|
||||||
|
* vty
|
||||||
|
* The vty terminal to dump the configuration to.
|
||||||
|
*
|
||||||
|
* dnode
|
||||||
|
* libyang data node that should be shown in the form of a CLI
|
||||||
|
* command.
|
||||||
|
*
|
||||||
|
* show_defaults
|
||||||
|
* Specify whether to display default configuration values or not.
|
||||||
|
* This parameter can be ignored most of the time since the
|
||||||
|
* northbound doesn't call this callback for default leaves or
|
||||||
|
* non-presence containers that contain only default child nodes.
|
||||||
|
* The exception are commands associated to multiple configuration
|
||||||
|
* nodes, in which case it might be desirable to hide one or more
|
||||||
|
* parts of the command when this parameter is set to false.
|
||||||
|
*/
|
||||||
|
void (*cli_show_end)(struct vty *vty, struct lyd_node *dnode);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -434,10 +434,29 @@ static int nb_cli_candidate_load_transaction(struct vty *vty,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ly_iter_next_is_up: detects when iterating up on the yang model.
|
||||||
|
*
|
||||||
|
* This function detects whether next node in the iteration is upwards,
|
||||||
|
* then return the node otherwise return NULL.
|
||||||
|
*/
|
||||||
|
static struct lyd_node *ly_iter_next_up(struct lyd_node *elem)
|
||||||
|
{
|
||||||
|
/* Are we going downwards? Is this still not a leaf? */
|
||||||
|
if (!(elem->schema->nodetype & (LYS_LEAF | LYS_LEAFLIST | LYS_ANYDATA)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Are there still leaves in this branch? */
|
||||||
|
if (elem->next != NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return elem->parent;
|
||||||
|
}
|
||||||
|
|
||||||
void nb_cli_show_dnode_cmds(struct vty *vty, struct lyd_node *root,
|
void nb_cli_show_dnode_cmds(struct vty *vty, struct lyd_node *root,
|
||||||
bool with_defaults)
|
bool with_defaults)
|
||||||
{
|
{
|
||||||
struct lyd_node *next, *child;
|
struct lyd_node *next, *child, *parent;
|
||||||
|
|
||||||
LY_TREE_DFS_BEGIN (root, next, child) {
|
LY_TREE_DFS_BEGIN (root, next, child) {
|
||||||
struct nb_node *nb_node;
|
struct nb_node *nb_node;
|
||||||
@ -452,6 +471,19 @@ void nb_cli_show_dnode_cmds(struct vty *vty, struct lyd_node *root,
|
|||||||
|
|
||||||
(*nb_node->cbs.cli_show)(vty, child, with_defaults);
|
(*nb_node->cbs.cli_show)(vty, child, with_defaults);
|
||||||
next:
|
next:
|
||||||
|
/*
|
||||||
|
* When transiting upwards in the yang model we should
|
||||||
|
* give the previous container/list node a chance to
|
||||||
|
* print its close vty output (e.g. "!" or "end-family"
|
||||||
|
* etc...).
|
||||||
|
*/
|
||||||
|
parent = ly_iter_next_up(child);
|
||||||
|
if (parent != NULL) {
|
||||||
|
nb_node = parent->schema->priv;
|
||||||
|
if (nb_node->cbs.cli_show_end)
|
||||||
|
(*nb_node->cbs.cli_show_end)(vty, parent);
|
||||||
|
}
|
||||||
|
|
||||||
LY_TREE_DFS_END(root, next, child);
|
LY_TREE_DFS_END(root, next, child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user