]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/ceph-volume/ceph_volume/devices/lvm/zap.py
update sources to v12.2.3
[ceph.git] / ceph / src / ceph-volume / ceph_volume / devices / lvm / zap.py
index df19686ff996e94f5205f807d42fbbbd5dc5190f..10d348ceadfdb4ed4f63abd5939a329f06f78b9e 100644 (file)
@@ -5,8 +5,10 @@ from textwrap import dedent
 
 from ceph_volume import decorators, terminal, process
 from ceph_volume.api import lvm as api
+from ceph_volume.util import system
 
 logger = logging.getLogger(__name__)
+mlogger = terminal.MultiLogger(__name__)
 
 
 def wipefs(path):
@@ -14,7 +16,6 @@ def wipefs(path):
     Removes the filesystem from an lv or partition.
     """
     process.run([
-        'sudo',
         'wipefs',
         '--all',
         path
@@ -57,13 +58,35 @@ class Zap(object):
             #TODO: ensure device is a partition
             path = device
 
-        logger.info("Zapping: %s", path)
-        terminal.write("Zapping: %s" % path)
+        mlogger.info("Zapping: %s", path)
+
+        # check if there was a pv created with the
+        # name of device
+        pv = api.get_pv(pv_name=device)
+        if pv:
+            vg_name = pv.vg_name
+            lv = api.get_lv(vg_name=vg_name)
+
+        if lv:
+            osd_path = "/var/lib/ceph/osd/{}-{}".format(lv.tags['ceph.cluster_name'], lv.tags['ceph.osd_id'])
+            if system.path_is_mounted(osd_path):
+                mlogger.info("Unmounting %s", osd_path)
+                system.unmount(osd_path)
+
+        if args.destroy and pv:
+            logger.info("Found a physical volume created from %s, will destroy all it's vgs and lvs", device)
+            vg_name = pv.vg_name
+            mlogger.info("Destroying volume group %s because --destroy was given", vg_name)
+            api.remove_vg(vg_name)
+            mlogger.info("Destroying physical volume %s because --destroy was given", device)
+            api.remove_pv(device)
+        elif args.destroy and not pv:
+            mlogger.info("Skipping --destroy because no associated physical volumes are found for %s", device)
 
         wipefs(path)
         zap_data(path)
 
-        if lv:
+        if lv and not pv:
             # remove all lvm metadata
             lv.clear_tags()
 
@@ -71,9 +94,13 @@ class Zap(object):
 
     def main(self):
         sub_command_help = dedent("""
-        Zaps the given logical volume or partition. If given a path to a logical
-        volume it must be in the format of vg/lv. Any filesystems present
-        on the given lv or partition will be removed and all data will be purged.
+        Zaps the given logical volume, raw device or partition for reuse by ceph-volume.
+        If given a path to a logical volume it must be in the format of vg/lv. Any
+        filesystems present on the given device, vg/lv, or partition will be removed and
+        all data will be purged.
+
+        If the logical volume, raw device or partition is being used for any ceph related
+        mount points they will be unmounted.
 
         However, the lv or partition will be kept intact.
 
@@ -87,6 +114,19 @@ class Zap(object):
 
               ceph-volume lvm zap /dev/sdc1
 
+        If the --destroy flag is given and you are zapping a raw device or partition
+        then all vgs and lvs that exist on that raw device or partition will be destroyed.
+
+        This is especially useful if a raw device or partition was used by ceph-volume lvm create
+        or ceph-volume lvm prepare commands previously and now you want to reuse that device.
+
+        For example:
+
+          ceph-volume lvm zap /dev/sda --destroy
+
+        If the --destroy flag is given and you are zapping an lv then the lv is still
+        kept intact for reuse.
+
         """)
         parser = argparse.ArgumentParser(
             prog='ceph-volume lvm zap',
@@ -98,7 +138,13 @@ class Zap(object):
             'device',
             metavar='DEVICE',
             nargs='?',
-            help='Path to an lv (as vg/lv) or to a partition like /dev/sda1'
+            help='Path to an lv (as vg/lv), partition (as /dev/sda1) or device (as /dev/sda)'
+        )
+        parser.add_argument(
+            '--destroy',
+            action='store_true',
+            default=False,
+            help='Destroy all volume groups and logical volumes if you are zapping a raw device or partition',
         )
         if len(self.argv) == 0:
             print(sub_command_help)