From e533792e0dbafc160238c0f5783f4430e2705571 Mon Sep 17 00:00:00 2001 From: Alfredo Deza Date: Tue, 5 Dec 2017 10:08:35 -0500 Subject: [PATCH] ceph-volume lvm.common create a rollback_osd utility to cleanup failed osd prepare/create calls Signed-off-by: Alfredo Deza --- .../ceph_volume/devices/lvm/common.py | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/ceph-volume/ceph_volume/devices/lvm/common.py b/src/ceph-volume/ceph_volume/devices/lvm/common.py index b2fbbf991ed..29183922737 100644 --- a/src/ceph-volume/ceph_volume/devices/lvm/common.py +++ b/src/ceph-volume/ceph_volume/devices/lvm/common.py @@ -1,7 +1,43 @@ from ceph_volume.util import arg_validators +from ceph_volume import process +from ceph_volume import terminal import argparse +def rollback_osd(args, osd_id=None): + """ + When the process of creating or preparing fails, the OSD needs to be either + purged (ID fully removed) or destroyed (ID persists). This is important + because otherwise it would leave the ID around, which can cause confusion + if relying on the automatic (OSD.N + 1) behavior. + + When the OSD id is specified in the command line explicitly (with + ``--osd-id``) , the the ID is then preserved with a soft removal (``ceph + osd destroy``), otherwise it is fully removed with ``purge``. + """ + if not osd_id: + # it means that it wasn't generated, so there is nothing to rollback here + return + + # once here, this is an error condition that needs to be rolled back + terminal.error('Was unable to complete a new OSD, will rollback changes') + osd_name = 'osd.%s' + if args.osd_id is None: + terminal.error('OSD will be fully purged from the cluster, because the ID was generated') + # the ID wasn't passed in explicitly, so make sure it is fully removed + process.run([ + 'ceph', 'osd', 'purge', + osd_name % osd_id, + '--yes-i-really-mean-it']) + else: + terminal.error('OSD will be destroyed, keeping the ID because it was provided with --osd-id') + # the ID was passed explicitly, so allow to re-use by using `destroy` + process.run([ + 'ceph', 'osd', 'destroy', + osd_name % args.osd_id, + '--yes-i-really-mean-it']) + + def common_parser(prog, description): """ Both prepare and create share the same parser, those are defined here to -- 2.39.5