2af5c44319f6 — Alain Leufroy 3 years ago
edit: fix, propagate changes to descendants
2 files changed, 20 insertions(+), 4 deletions(-)

M overlayctl
M test_overlayctl.py
M overlayctl +3 -4
@@ 674,8 674,9 @@ def editer(
             return
         layer.lowers[:] = lowers
         layer.dump()
+        for layer in _iter_descendants(layer):
+            layer.dump()
         systemctl.daemon_reload()
-    # XXX propagate to descendants
     logger.debug("Systemd \"%s\" restarted", layer.unitname)
     logger.info("\"%s\" updated", layer.name)
 

          
@@ 768,7 769,6 @@ def deplacer(oldname, newname, interrupt
         return
 
     with _stop_branch(layer, interrupt=interrupt, preserve=preserve, restart=interrupt):
-
         # Move overlay dirs.
         layer.upperdir.rename(_new.upperdir)
         layer.workdir.rename(_new.workdir)

          
@@ 776,9 776,8 @@ def deplacer(oldname, newname, interrupt
         layer.delete()
 
         layer.name = newname
+
         layer.dump()
-
-        # Update existing layers that depends on the moved one.
         for layer in _iter_descendants(layer):
             layer.dump()
 

          
M test_overlayctl.py +17 -0
@@ 389,6 389,7 @@ class TestStop(BaseTest):
 
 
 class TestEdit(BaseTest):
+    """Test for `edit` command."""
 
     def test_prepending_lowers(self):
         # User can augment lowers with the --prepend option.

          
@@ 446,6 447,22 @@ class TestEdit(BaseTest):
             self.get_mount_dir('base1'),
         ])
 
+    def test_modifications_propagated_to_descendants(self):
+        # Modifications are propagated to descendants.
+        self.get_mount_dir('base').mkdir()
+        overlayctl.creater('lower1', ['base'])
+        overlayctl.creater('lower2', ['base'])
+        overlayctl.creater('layer', ['lower2'])
+        self.systemctl.reset_mock()
+        self.systemctl.status.return_value = {'Active': 'inactive'}
+        overlayctl.editer('lower2', prepended=['lower1'])
+        self.assert_daemon_reload_called()
+        self.check_mount_unit('layer', [
+            self.get_upper_dir('lower2'),
+            self.get_upper_dir('lower1'),
+            self.get_mount_dir('base'),
+        ])
+
     def test_with_editor(self):
         # The user's editor is started with no options.
         # In the editor, user can move, add and remove lower freely.