pvl/backup/lvm.py
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--
version: 0.3.0
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
724a90bd77b5 fixup __str__s
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    92
    def __str__ (self) :
724a90bd77b5 fixup __str__s
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    93
        return self.name
724a90bd77b5 fixup __str__s
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    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
724a90bd77b5 fixup __str__s
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   156
    def __str__ (self) :
724a90bd77b5 fixup __str__s
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   157
        return self.lvm_path
724a90bd77b5 fixup __str__s
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   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