author | Tero Marttila <terom@paivola.fi> |
Mon, 05 Mar 2012 10:02:30 +0200 | |
changeset 39 | dfc5e8013eaa |
parent 29 | 5abd153d78eb |
child 42 | 43e27a3e9efe |
permissions | -rw-r--r-- |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
Simple /sbin/lvm wrapper for handling snapshots. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
from pvl.backup.invoke import invoke, optargs, InvokeError |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
import contextlib |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
import os.path |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
import logging |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
log = logging.getLogger('pvl.backup.lvm') |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
class LVMError (Exception) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
14 |
pass |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
class LVM (object) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
LVM VolumeGroup |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
# path to lvm2 binary |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
22 |
LVM = '/sbin/lvm' |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
# VG name |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
name = None |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
28 |
def __init__ (self, name) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
29 |
self.name = name |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
31 |
def lv_name (self, lv) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
32 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
vg/lv name. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
return '{vg}/{lv}'.format(vg=self.name, lv=lv) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
def lv_path (self, lv) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
/dev/vg/lv path. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
return '/dev/{vg}/{lv}'.format(vg=self.name, lv=lv) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
def command (self, cmd, *args, **opts) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
Invoke a command with options/arguments, given via Python arguments/keyword arguments |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
48 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
log.debug("{cmd} {opts} {args}".format(cmd=cmd, args=args, opts=opts)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
# invoke |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
invoke(self.LVM, [cmd] + optargs(*args, **opts)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
def volume (self, name) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
56 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
57 |
Return an LVMVolume for given named LV. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
return LVMVolume(self, name) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
@contextlib.contextmanager |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
63 |
def snapshot (self, base, **kwargs) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
65 |
A Context Manager for handling an LVMSnapshot. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
66 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
67 |
See LVMSnapshot.create() |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
68 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
69 |
with lvm.snapshot(lv) as snapshot : ... |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
70 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
71 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
72 |
log.debug("creating snapshot from {base}: {opts}".format(base=base, opts=kwargs)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
73 |
snapshot = LVMSnapshot.create(self, base, **kwargs) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
74 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
75 |
try : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
log.debug("got: {0}".format(snapshot)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
yield snapshot |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
78 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
finally: |
29
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
80 |
# XXX: there's some timing bug with an umount leaving the LV open, do we need to wait for it to get closed after mount? |
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
81 |
# https://bugzilla.redhat.com/show_bug.cgi?id=577798 |
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
82 |
# some udev event bug, possibly fixed in lvm2 2.02.86? |
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
83 |
# try to just patiently wait for it to settle down... if this isn't enough, we need some dmremove magic |
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
84 |
log.debug("cleanup: waiting for snapshot volume to settle...") |
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
85 |
import time |
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
86 |
time.sleep(1) |
5abd153d78eb
lvm: try and workaround an umount -> lvremove udev timing bug with a time.sleep(1)
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
87 |
|
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
88 |
# cleanup |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
89 |
log.debug("cleanup: {0}".format(snapshot)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
90 |
snapshot.close() |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
91 |
|
10 | 92 |
def __str__ (self) : |
93 |
return self.name |
|
94 |
||
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
95 |
def __repr__ (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
96 |
return "LVM(name={name})".format(name=repr(self.name)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
97 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
98 |
class LVMVolume (object) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
99 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
100 |
LVM Logical Volume. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
101 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
102 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
103 |
# VG |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
104 |
lvm = None |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
105 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
106 |
# name |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
107 |
name = None |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
108 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
109 |
def __init__ (self, lvm, name) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
110 |
self.lvm = lvm |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
111 |
self.name = name |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
112 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
113 |
@property |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
114 |
def lvm_path (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
115 |
return self.lvm.lv_name(self.name) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
116 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
117 |
@property |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
118 |
def dev_path (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
119 |
return self.lvm.lv_path(self.name) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
120 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
121 |
def verify_exists (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
122 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
123 |
Verify that the LV exists. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
124 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
125 |
Raises an LVMError otherwise. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
126 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
127 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
128 |
# lvdisplay |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
129 |
try : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
130 |
self.lvm.command('lvs', self.lvm_path) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
131 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
132 |
except InvokeError : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
133 |
raise LVMError("Unable to lvdisplay LV: {path}".format(path=self.lvm_path)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
134 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
135 |
# dev |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
136 |
if not self.test_dev() : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
137 |
raise LVMError("LV dev does not exist: {path}".format(path=self.dev_path)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
138 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
139 |
def verify_missing (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
140 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
141 |
Verify that the LV does NOT exist. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
142 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
143 |
Raises an LVMError otherwise. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
144 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
145 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
146 |
if self.test_dev() : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
147 |
raise Exception("LV already exists: {path}".format(path=self.dev_path)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
148 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
149 |
def test_dev (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
150 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
151 |
Tests for existance of device file, returning True/False. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
152 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
153 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
154 |
return os.path.exists(self.dev_path) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
155 |
|
10 | 156 |
def __str__ (self) : |
157 |
return self.lvm_path |
|
158 |
||
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
159 |
def __repr__ (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
160 |
return "LVMVolume(lvm={lvm}, name={name})".format( |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
161 |
lvm = repr(self.lvm), |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
162 |
name = repr(self.name), |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
163 |
) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
164 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
165 |
class LVMSnapshot (LVMVolume) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
166 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
167 |
LVM snapshot |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
168 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
169 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
170 |
# default snapshot size |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
171 |
LVM_SNAPSHOT_SIZE = '5G' |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
172 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
173 |
# base lv |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
174 |
base = None |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
175 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
176 |
@classmethod |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
177 |
def create (cls, lvm, base, tag, size=LVM_SNAPSHOT_SIZE) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
178 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
179 |
Create a new LVM snapshot of the given LV. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
180 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
181 |
Returns a (snapshot_name, dev_path) tuple. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
182 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
183 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
184 |
# snapshot name |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
185 |
name = '{name}-{tag}'.format(name=base.name, tag=tag) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
186 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
187 |
# snapshot instance |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
188 |
snapshot = cls(lvm, base, name) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
189 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
190 |
## verify |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
191 |
# base should exist |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
192 |
base.verify_exists() |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
193 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
194 |
# snapshot should not |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
195 |
snapshot.verify_missing() |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
196 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
197 |
## create |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
198 |
snapshot.open() |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
199 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
200 |
# verify |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
201 |
if not snapshot.test_dev() : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
202 |
raise LVMError("Failed to find new snapshot LV device: {path}".format(path=snapshot.dev_path)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
203 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
204 |
# yay |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
205 |
return snapshot |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
206 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
207 |
def __init__ (self, lvm, base, name, size=LVM_SNAPSHOT_SIZE) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
208 |
LVMVolume.__init__(self, lvm, name) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
209 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
210 |
self.base = base |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
211 |
self.size = size |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
212 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
213 |
def open (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
214 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
215 |
Create snapshot volume. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
216 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
217 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
218 |
# create |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
219 |
self.lvm.command('lvcreate', self.base.lvm_path, snapshot=True, name=self.name, size=self.size) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
220 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
221 |
def close (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
222 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
223 |
Remove snapshot volume. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
224 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
225 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
226 |
# XXX: can't deactivate snapshot volume |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
227 |
#self.lvm.command('lvchange', name, available='n') |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
228 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
229 |
# XXX: risky! |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
230 |
self.lvm.command('lvremove', '-f', self.lvm_path) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
231 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
232 |
def __repr__ (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
233 |
return "LVMSnapshot(lvm={lvm}, base={base}, name={name})".format( |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
234 |
lvm = str(self.lvm), |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
235 |
base = str(self.base), |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
236 |
name = repr(self.name), |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
237 |
) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
238 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
239 |