File: test_destroymissing.py

package info (click to toggle)
zfs-autobackup 3.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 616 kB
  • sloc: python: 5,044; sh: 94; makefile: 3
file content (135 lines) | stat: -rw-r--r-- 5,692 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

from basetest import *


class TestZfsNode(unittest2.TestCase):

    def setUp(self):
        prepare_zpools()
        self.longMessage=True



    def  test_destroymissing(self):

        #initial backup
        with mocktime("19101111000000"): #1000 years in past
            self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-holds".split(" ")).run())

        with mocktime("20101111000000"): #far in past
            self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-holds --allow-empty".split(" ")).run())


        with self.subTest("Should do nothing yet"):
            with OutputIO() as buf:
                with redirect_stdout(buf):
                    self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 0s".split(" ")).run())

                print(buf.getvalue())
                self.assertNotIn(": Destroy missing", buf.getvalue())


        with self.subTest("missing dataset of us that still has children"):

            #just deselect it so it counts as 'missing'
            shelltest("zfs set autobackup:test=child test_source1/fs1")

            with OutputIO() as buf:
                with redirect_stdout(buf), redirect_stderr(buf):
                        self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 0s".split(" ")).run())

                print(buf.getvalue())
                #should have done the snapshot cleanup for destoy missing:
                self.assertIn("fs1@test-19101111000000: Destroying", buf.getvalue())

                self.assertIn("fs1: Destroy missing: Still has children here.", buf.getvalue())

            shelltest("zfs inherit autobackup:test test_source1/fs1")


        with self.subTest("Normal destroyed leaf"):
            shelltest("zfs destroy -r test_source1/fs1/sub")

            #wait for deadline of last snapshot
            with OutputIO() as buf:
                with redirect_stdout(buf):
                    #100y: lastest should not be old enough, while second to latest snapshot IS old enough:
                    self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 100y".split(" ")).run())

                print(buf.getvalue())
                self.assertIn(": Waiting for deadline", buf.getvalue())

            #past deadline, destroy
            with OutputIO() as buf:
                with redirect_stdout(buf):
                    self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 1y".split(" ")).run())

                print(buf.getvalue())
                self.assertIn("sub: Destroying", buf.getvalue())


        with self.subTest("Leaf with other snapshot still using it"):
            shelltest("zfs destroy -r test_source1/fs1")
            shelltest("zfs snapshot -r test_target1/test_source1/fs1@other1")


            with OutputIO() as buf:
                with redirect_stdout(buf):
                    self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 0s".split(" ")).run())

                print(buf.getvalue())

                #cant finish because still in use:
                self.assertIn("fs1: Destroy missing: Still in use", buf.getvalue())

            shelltest("zfs destroy test_target1/test_source1/fs1@other1")


        with self.subTest("In use by clone"):
            shelltest("zfs clone test_target1/test_source1/fs1@test-20101111000000 test_target1/clone1")

            with OutputIO() as buf:
                with redirect_stdout(buf), redirect_stderr(buf):
                        self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 0s".split(" ")).run())

                print(buf.getvalue())
                #now tries to destroy our own last snapshot (before the final destroy of the dataset)
                self.assertIn("fs1@test-20101111000000: Destroying", buf.getvalue())
                #but cant finish because still in use:
                self.assertIn("fs1: Error during --destroy-missing", buf.getvalue())

            shelltest("zfs destroy test_target1/clone1")


        with self.subTest("Should leave test_source1 parent"):

            with OutputIO() as buf:
                with redirect_stdout(buf), redirect_stderr(buf):
                        self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 0s".split(" ")).run())

                print(buf.getvalue())
                #should have done the snapshot cleanup for destoy missing:
                self.assertIn("fs1: Destroying", buf.getvalue())

            with OutputIO() as buf:
                with redirect_stdout(buf), redirect_stderr(buf):
                        self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --no-snapshot --destroy-missing 0s".split(" ")).run())

                print(buf.getvalue())
                #on second run it sees the dangling ex-parent but doesnt know what to do with it (since it has no own snapshot)
                self.assertIn("test_source1: Destroy missing: has no snapshots made by us", buf.getvalue())




        #end result
        r=shelltest("zfs list -H -o name -r -t all test_target1")
        self.assertMultiLineEqual(r,"""
test_target1
test_target1/test_source1
test_target1/test_source2
test_target1/test_source2/fs2
test_target1/test_source2/fs2/sub
test_target1/test_source2/fs2/sub@test-19101111000000
test_target1/test_source2/fs2/sub@test-20101111000000
""")