Browse Source

[1443] append .X if backup config file exists

where X is 1, and increases until a nonexistant file is found
Jelte Jansen 13 years ago
parent
commit
d98c6ee086
2 changed files with 42 additions and 21 deletions
  1. 5 0
      src/lib/python/isc/config/cfgmgr.py
  2. 37 21
      src/lib/python/isc/config/tests/cfgmgr_test.py

+ 5 - 0
src/lib/python/isc/config/cfgmgr.py

@@ -159,6 +159,11 @@ class ConfigManagerData:
             old_file_name = self.db_filename
         if new_file_name is None:
             new_file_name = old_file_name + ".bak"
+        if os.path.exists(new_file_name):
+            i = 1
+            while os.path.exists(new_file_name + "." + str(i)):
+                i += 1
+            new_file_name = new_file_name + "." + str(i)
         if os.path.exists(old_file_name):
             logger.info(CFGMGR_RENAMED_CONFIG_FILE, old_file_name, new_file_name)
             os.rename(old_file_name, new_file_name)

+ 37 - 21
src/lib/python/isc/config/tests/cfgmgr_test.py

@@ -74,36 +74,52 @@ class TestConfigManagerData(unittest.TestCase):
         self.assertEqual(self.config_manager_data, new_config)
         os.remove(output_file_name)
 
+    def check_existance(self, files, should_exist=[], should_not_exist=[]):
+        for n in should_exist:
+            self.assertTrue(os.path.exists(files[n]))
+        for n in should_not_exist:
+            self.assertFalse(os.path.exists(files[n]))
+
     def test_rename_config_file(self):
-        output_file_name = "b10-config-rename-test"
-        renamed_file_name = "b10-config-rename-test.bak"
-        if os.path.exists(output_file_name):
-            os.remove(output_file_name)
-        if os.path.exists(renamed_file_name):
-            os.remove(renamed_file_name)
+        # test file names, put in array for easy cleanup
+        filenames = [ "b10-config-rename-test",
+                      "b10-config-rename-test.bak",
+                      "b10-config-rename-test.bak.1",
+                      "b10-config-rename-test.bak.2" ]
+
+        for filename in filenames:
+            if os.path.exists(filename):
+                os.remove(filename)
 
         # The original does not exist, so the new one should not be created
-        self.config_manager_data.rename_config_file(output_file_name)
-        self.assertFalse(os.path.exists(output_file_name))
-        self.assertFalse(os.path.exists(renamed_file_name))
+        self.config_manager_data.rename_config_file(filenames[0])
+        self.check_existance(filenames, [], [0, 1, 2, 3])
 
         # now create a file to rename, and call rename again
-        self.config_manager_data.write_to_file(output_file_name)
-        self.config_manager_data.rename_config_file(output_file_name)
-        self.assertFalse(os.path.exists(output_file_name))
-        self.assertTrue(os.path.exists(renamed_file_name))
+        self.config_manager_data.write_to_file(filenames[0])
+        self.config_manager_data.rename_config_file(filenames[0])
+        self.check_existance(filenames, [1], [0, 2, 3])
+
+        # If backup already exists, give it a new name automatically
+        self.config_manager_data.write_to_file(filenames[0])
+        self.config_manager_data.rename_config_file(filenames[0])
+        self.check_existance(filenames, [1, 2], [0, 3])
+
+        # If backup already exists, give it a new name automatically with
+        # increasing postfix
+        self.config_manager_data.write_to_file(filenames[0])
+        self.config_manager_data.rename_config_file(filenames[0])
+        self.check_existance(filenames, [1, 2, 3], [0])
 
         # Test with explicit renamed file argument
-        self.config_manager_data.rename_config_file(renamed_file_name,
-                                                    output_file_name)
-        self.assertTrue(os.path.exists(output_file_name))
-        self.assertFalse(os.path.exists(renamed_file_name))
+        self.config_manager_data.rename_config_file(filenames[1],
+                                                    filenames[0])
+        self.check_existance(filenames, [0, 2, 3], [1])
 
         # clean up again to be nice
-        if os.path.exists(output_file_name):
-            os.remove(output_file_name)
-        if os.path.exists(renamed_file_name):
-            os.remove(renamed_file_name)
+        for filename in filenames:
+            if os.path.exists(filename):
+                os.remove(filename)
 
     def test_equality(self):
         # tests the __eq__ function. Equality is only defined