|
20 | 20 |
|
21 | 21 | from medusa.config import MedusaConfig, StorageConfig, _namedtuple_from_dict |
22 | 22 | from medusa.storage import Storage |
23 | | -from medusa.purge import backups_to_purge_by_age, backups_to_purge_by_count, backups_to_purge_by_name |
| 23 | +from medusa.purge import ( |
| 24 | + backups_to_purge_by_age, backups_to_purge_by_count, backups_to_purge_by_name, backups_to_purge_by_completion |
| 25 | +) |
24 | 26 | from medusa.purge import filter_differential_backups, filter_files_within_gc_grace |
25 | 27 |
|
26 | 28 | from tests.storage_test import make_node_backup, make_cluster_backup, make_blob |
@@ -91,6 +93,43 @@ def test_purge_backups_by_count(self): |
91 | 93 | obsolete_backups = backups_to_purge_by_count(backups, 40) |
92 | 94 | assert len(obsolete_backups) == 0 |
93 | 95 |
|
| 96 | + def test_purge_backups_by_completion(self): |
| 97 | + backups = list() |
| 98 | + |
| 99 | + # Build a list of 40 bi-daily backups, making every second backup incomplete |
| 100 | + complete = True |
| 101 | + now = datetime.now() |
| 102 | + for i in range(0, 80, 2): |
| 103 | + file_time = now + timedelta(days=(i + 1) - 80) |
| 104 | + backups.append(make_node_backup(self.storage, str(i), file_time, differential=True, complete=complete)) |
| 105 | + complete = not complete |
| 106 | + |
| 107 | + self.assertEqual(40, len(backups)) |
| 108 | + complete_backup_names = {nb.name for nb in filter(lambda nb: nb.finished is not None, backups)} |
| 109 | + self.assertEqual(len(complete_backup_names), 20, "The amount of complete backups is not correct") |
| 110 | + |
| 111 | + # the base with all 40 backups |
| 112 | + complete, incomplete_to_purge = backups_to_purge_by_completion(backups) |
| 113 | + self.assertEqual(20, len(complete)) # 1 is kept because it might be in progress |
| 114 | + self.assertEqual(19, len(incomplete_to_purge)) # 1 is kept because it might be in progress |
| 115 | + |
| 116 | + # take all complete backups, but only half of the incomplete ones |
| 117 | + test_backups = list() |
| 118 | + for i in range(0, 40, 1): |
| 119 | + # take each complete backup |
| 120 | + if backups[i].finished is not None: |
| 121 | + test_backups.append(backups[i]) |
| 122 | + continue |
| 123 | + # but only first half of the incomplete ones |
| 124 | + if i > 20: |
| 125 | + continue |
| 126 | + test_backups.append(backups[i]) |
| 127 | + self.assertEqual(20, len(list(filter(lambda b: b.finished is not None, test_backups)))) |
| 128 | + self.assertEqual(10, len(list(filter(lambda b: b.finished is None, test_backups)))) |
| 129 | + complete, incomplete_to_purge = backups_to_purge_by_completion(test_backups) |
| 130 | + self.assertEqual(20, len(complete)) # 1 is kept because it might be in progress |
| 131 | + self.assertEqual(9, len(incomplete_to_purge)) # 1 is kept because it might be in progress |
| 132 | + |
94 | 133 | def test_filter_differential_backups(self): |
95 | 134 | backups = list() |
96 | 135 | backups.append(make_node_backup(self.storage, "one", datetime.now(), differential=True)) |
|
0 commit comments