*/
if (yang_module_find("frr-interface")) {
struct lyd_node *if_dnode;
+ char oldpath[XPATH_MAXLEN];
+ char newpath[XPATH_MAXLEN];
if_dnode = yang_dnode_get(
running_config->dnode,
"/frr-interface:lib/interface[name='%s'][vrf='%s']/vrf",
ifp->name, old_vrf->name);
+
if (if_dnode) {
- nb_running_unset_entry(if_dnode->parent);
+ yang_dnode_get_path(if_dnode->parent, oldpath,
+ sizeof(oldpath));
yang_dnode_change_leaf(if_dnode, vrf->name);
- nb_running_set_entry(if_dnode->parent, ifp);
+ yang_dnode_get_path(if_dnode->parent, newpath,
+ sizeof(newpath));
+ nb_running_move_tree(oldpath, newpath);
running_config->version++;
}
}
#include "northbound.h"
#include "northbound_cli.h"
#include "northbound_db.h"
+#include "frrstr.h"
DEFINE_MTYPE_STATIC(LIB, NB_NODE, "Northbound Node")
DEFINE_MTYPE_STATIC(LIB, NB_CONFIG, "Northbound Configuration")
config->entry = entry;
}
+void nb_running_move_tree(const char *xpath_from, const char *xpath_to)
+{
+ struct nb_config_entry *entry;
+ struct list *entries = hash_to_list(running_config_entries);
+ struct listnode *ln;
+
+ for (ALL_LIST_ELEMENTS_RO(entries, ln, entry)) {
+ if (!frrstr_startswith(entry->xpath, xpath_from))
+ continue;
+
+ hash_release(running_config_entries, entry);
+
+ char *newpath =
+ frrstr_replace(entry->xpath, xpath_from, xpath_to);
+ strlcpy(entry->xpath, newpath, sizeof(entry->xpath));
+ XFREE(MTYPE_TMP, newpath);
+
+ hash_get(running_config_entries, entry, hash_alloc_intern);
+ }
+
+ list_delete(&entries);
+}
+
static void *nb_running_unset_entry_helper(const struct lyd_node *dnode)
{
struct nb_config_entry *config, s;
*/
extern void nb_running_set_entry(const struct lyd_node *dnode, void *entry);
+/*
+ * Move an entire tree of user pointer nodes.
+ *
+ * Suppose we have xpath A/B/C/D, with user pointers associated to C and D. We
+ * need to move B to be under Z, so the new xpath is Z/B/C/D. Because user
+ * pointers are indexed with their absolute path, We need to move all user
+ * pointers at and below B to their new absolute paths; this function does
+ * that.
+ *
+ * xpath_from
+ * base xpath of tree to move (A/B)
+ *
+ * xpath_to
+ * base xpath of new location of tree (Z/B)
+ */
+extern void nb_running_move_tree(const char *xpath_from, const char *xpath_to);
+
/*
* Unset the user pointer associated to a configuration node.
*