summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2022-02-27 10:05:40 -0600
committerJohn Estabrook <jestabro@vyos.io>2022-02-28 13:42:24 -0600
commit193cbd15ba39a41614c63b997e6a62254589158a (patch)
treeaa66b973c9b61ec2818d9368c50b0343fdf4f0d1
parent4625fd41f99ddf77c104a657cd90a1ddf5449dd8 (diff)
downloadvyos-1x-193cbd15ba39a41614c63b997e6a62254589158a.tar.gz
vyos-1x-193cbd15ba39a41614c63b997e6a62254589158a.zip
configtree: T4235: distinguish sub(-tract) tree from delete tree
The DiffTree class maintains both the 'sub'(-tract) configtree, containing all paths in the LHS of the comparison that are not in the RHS, and the 'delete' configtree: the delete tree is the minimal subtree containing only the first node of a path not present in the RHS. It is the delete tree that is needed to produce 'delete' commands for config mode, whereas the 'sub' tree contains full information, needed for recursively detecting changes to a node.
-rw-r--r--python/vyos/configtree.py12
1 files changed, 11 insertions, 1 deletions
diff --git a/python/vyos/configtree.py b/python/vyos/configtree.py
index 5ba829a4c..e9cdb69e4 100644
--- a/python/vyos/configtree.py
+++ b/python/vyos/configtree.py
@@ -326,8 +326,13 @@ class DiffTree:
self.__diff_tree.argtypes = [c_char_p, c_void_p, c_void_p]
self.__diff_tree.restype = c_void_p
+ self.__trim_tree = self.__lib.trim_tree
+ self.__trim_tree.argtypes = [c_void_p, c_void_p]
+ self.__trim_tree.restype = c_void_p
+
check_path(path)
path_str = " ".join(map(str, path)).encode()
+
res = self.__diff_tree(path_str, left._get_config(), right._get_config())
# full diff config_tree and python dict representation
@@ -336,9 +341,14 @@ class DiffTree:
# config_tree sub-trees
self.add = self.full.get_subtree(['add'])
- self.delete = self.full.get_subtree(['delete'])
+ self.sub = self.full.get_subtree(['sub'])
self.inter = self.full.get_subtree(['inter'])
+ # trim sub(-tract) tree to get delete tree for commands
+ ref = self.right.get_subtree(path, with_node=True) if path else self.right
+ res = self.__trim_tree(self.sub._get_config(), ref._get_config())
+ self.delete = ConfigTree(address=res)
+
def to_commands(self):
add = self.add.to_commands()
delete = self.delete.to_commands(op="delete")