From d4639ac116407f71ba6bff06a3202c1490d57dee Mon Sep 17 00:00:00 2001 From: Andrew Schoen Date: Thu, 1 Feb 2018 14:52:46 -0600 Subject: [PATCH] ceph-volume: when zapping unmount osd directories If you zap an lv, device or partition and it's currently mounted as a ceph osd directory then it will be unmounted so the zap can complete. Signed-off-by: Andrew Schoen --- doc/ceph-volume/lvm/zap.rst | 3 ++ .../ceph_volume/devices/lvm/zap.py | 48 ++++++++++++------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/doc/ceph-volume/lvm/zap.rst b/doc/ceph-volume/lvm/zap.rst index 579cfe6e44d2b..e0c190242acbe 100644 --- a/doc/ceph-volume/lvm/zap.rst +++ b/doc/ceph-volume/lvm/zap.rst @@ -10,6 +10,9 @@ on the given lv or partition will be removed and all data will be purged. .. note:: The lv or partition will be kept intact. +.. note:: If the logicial volume, raw device or partition is being used for any ceph related + mountpoints they will be unmounted. + Zapping a logical volume:: ceph-volume lvm zap {vg name/lv name} diff --git a/src/ceph-volume/ceph_volume/devices/lvm/zap.py b/src/ceph-volume/ceph_volume/devices/lvm/zap.py index dda21d2b89c97..16ebc76f6b55f 100644 --- a/src/ceph-volume/ceph_volume/devices/lvm/zap.py +++ b/src/ceph-volume/ceph_volume/devices/lvm/zap.py @@ -5,6 +5,7 @@ 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__) @@ -59,27 +60,37 @@ class Zap(object): logger.info("Zapping: %s", path) terminal.write("Zapping: %s" % path) - if args.destroy and not lv: - # check if there was a pv created with the - # name of device - pv = api.PVolumes().get(pv_name=device) - if pv: - logger.info("Found a physical volume created from %s, will destroy all it's vgs and lvs", device) - vg_name = pv.vg_name - logger.info("Destroying volume group %s because --destroy was given", vg_name) - terminal.write("Destroying volume group %s because --destroy was given" % vg_name) - api.remove_vg(vg_name) - logger.info("Destroying physical volume %s because --destroy was given", device) - terminal.write("Destroying physical volume %s because --destroy was given" % device) - api.remove_pv(device) - else: - logger.info("Skipping --destroy because no associated physical volumes are found for %s", device) - terminal.write("Skipping --destroy because no associated physical volumes are found for %s" % device) + # check if there was a pv created with the + # name of device + pv = api.PVolumes().get(pv_name=device) + if pv: + vg_name = pv.vg_name + lv = api.Volumes().get(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): + logger.info("Unmounting %s", osd_path) + terminal.write("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 + logger.info("Destroying volume group %s because --destroy was given", vg_name) + terminal.write("Destroying volume group %s because --destroy was given" % vg_name) + api.remove_vg(vg_name) + logger.info("Destroying physical volume %s because --destroy was given", device) + terminal.write("Destroying physical volume %s because --destroy was given" % device) + api.remove_pv(device) + elif args.destroy and not pv: + logger.info("Skipping --destroy because no associated physical volumes are found for %s", device) + terminal.write("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() @@ -92,6 +103,9 @@ class Zap(object): filesystems present on the given device, vg/lv, or partition will be removed and all data will be purged. + If the logicial volume, raw device or partition is being used for any ceph related + mountpoints they will be unmounted. + However, the lv or partition will be kept intact. Example calls for supported scenarios: -- 2.39.5