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):
Removes the filesystem from an lv or partition.
"""
process.run([
- 'sudo',
'wipefs',
'--all',
path
#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()
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.
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',
'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)