From 6b3655fe4bd3c493e6b10dd597d791a5b572df2b Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Wed, 22 Feb 2017 01:49:12 +0100 Subject: [PATCH] ceph-disk: dmcrypt activate must use the same cluster as prepare When dmcrypt is used, the fsid cannot be retrieved from the data partition because it is encrypted. Store the fsid in the lockbox to enable dmcrypt activation using the same logic as regular activation. The fsid is used to retrive the cluster name that was used during prepare, reason why activation does not and must not have a --cluster argument. Fixes: http://tracker.ceph.com/issues/17821 Signed-off-by: Loic Dachary (cherry picked from commit 7f66672b675abbc0262769d32a38112c781fefac) Conflicts: src/ceph-disk/ceph_disk/main.py --- src/ceph-disk/ceph_disk/main.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ceph-disk/ceph_disk/main.py b/src/ceph-disk/ceph_disk/main.py index dc35c2fbab0..c9dc4d01931 100755 --- a/src/ceph-disk/ceph_disk/main.py +++ b/src/ceph-disk/ceph_disk/main.py @@ -1165,10 +1165,19 @@ def get_dmcrypt_key( if os.path.exists(path): mode = get_oneliner(path, 'key-management-mode') osd_uuid = get_oneliner(path, 'osd-uuid') + ceph_fsid = read_one_line(path, 'ceph_fsid') + if ceph_fsid is None: + raise Error('No cluster uuid assigned.') + cluster = find_cluster_by_uuid(ceph_fsid) + if cluster is None: + raise Error('No cluster conf found in ' + SYSCONFDIR + + ' with fsid %s' % ceph_fsid) + if mode == KEY_MANAGEMENT_MODE_V1: key, stderr, ret = command( [ 'ceph', + '--cluster', cluster, '--name', 'client.osd-lockbox.' + osd_uuid, '--keyring', @@ -2461,6 +2470,7 @@ class Lockbox(object): command_check_call( [ 'ceph', + '--cluster', cluster, '--name', 'client.bootstrap-osd', '--keyring', bootstrap, 'config-key', @@ -2472,6 +2482,7 @@ class Lockbox(object): keyring, stderr, ret = command( [ 'ceph', + '--cluster', cluster, '--name', 'client.bootstrap-osd', '--keyring', bootstrap, 'auth', @@ -2509,6 +2520,9 @@ class Lockbox(object): LOG.debug('Mounting lockbox ' + str(" ".join(args))) command_check_call(args) write_one_line(path, 'osd-uuid', self.args.osd_uuid) + if self.args.cluster_uuid is None: + self.args.cluster_uuid = get_fsid(cluster=self.args.cluster) + write_one_line(path, 'ceph_fsid', self.args.cluster_uuid) self.create_key() self.symlink_spaces(path) write_one_line(path, 'magic', CEPH_LOCKBOX_ONDISK_MAGIC) @@ -3766,15 +3780,17 @@ def _deallocate_osd_id(cluster, osd_id): ]) -def _remove_lockbox(uuid): +def _remove_lockbox(uuid, cluster): command([ 'ceph', + '--cluster', cluster, 'auth', 'del', 'client.osd-lockbox.' + uuid, ]) command([ 'ceph', + '--cluster', cluster, 'config-key', 'del', 'dm-crypt/osd/' + uuid + '/luks', @@ -3872,7 +3888,7 @@ def main_destroy_locked(args): for name in Space.NAMES: if target_dev.get(name + '_uuid'): dmcrypt_unmap(target_dev[name + '_uuid']) - _remove_lockbox(target_dev['uuid']) + _remove_lockbox(target_dev['uuid'], args.cluster) # Check zap flag. If we found zap flag, we need to find device for # destroy this osd data. -- 2.47.3