Activate journal for a dmcrypt device has been broken for some time: the code path fails because a prototype is missing. Providing a /dev/mapper/XXXX path won't work either, the logic is not there.
diff --git a/qa/workunits/ceph-disk/ceph-disk-test.py b/qa/workunits/ceph-disk/ceph-disk-test.py
index bc6d254..f5fbbd1 100644
--- a/qa/workunits/ceph-disk/ceph-disk-test.py
+++ b/qa/workunits/ceph-disk/ceph-disk-test.py
@@ -178,7 +178,7 @@ class TestCephDisk(object):
disk = c.unused_disks()[0]
osd_uuid = str(uuid.uuid1())
journal_uuid = str(uuid.uuid1())
- d = tempfile.mkdtemp()
+ d = '/tmp' # tempfile.mkdtemp()
c.sh("ceph-disk zap " + disk)
c.sh("ceph-disk prepare " +
" --dmcrypt-key-dir " + d +
@@ -186,25 +186,26 @@ class TestCephDisk(object):
" --journal-uuid " + journal_uuid +
" --dmcrypt " +
" " + disk)
- if type == 'plain':
- c.sh("cryptsetup --key-file " + d + "/" + osd_uuid +
- " --key-size 256 create " + osd_uuid +
- " " + disk + "1")
- else:
- c.sh("cryptsetup --key-file " + d + "/" + osd_uuid + ".luks.key" +
- " luksOpen " +
- " " + disk + "1" +
- " " + osd_uuid)
- if type == 'plain':
- c.sh("cryptsetup --key-file " + d + "/" + journal_uuid +
- " --key-size 256 create " + journal_uuid +
- " " + disk + "2")
- else:
- c.sh("cryptsetup --key-file " + d + "/" + journal_uuid + ".luks.key" +
- " luksOpen " +
- " " + disk + "2" +
- " " + journal_uuid)
- c.sh("ceph-disk activate /dev/mapper/" + osd_uuid)
+ # if type == 'plain':
+ # c.sh("cryptsetup --key-file " + d + "/" + osd_uuid +
+ # " --key-size 256 create " + osd_uuid +
+ # " " + disk + "1")
+ # else:
+ # c.sh("cryptsetup --key-file " + d + "/" + osd_uuid + ".luks.key" +
+ # " luksOpen " +
+ # " " + disk + "1" +
+ # " " + osd_uuid)
+ # if type == 'plain':
+ # c.sh("cryptsetup --key-file " + d + "/" + journal_uuid +
+ # " --key-size 256 create " + journal_uuid +
+ # " " + disk + "2")
+ # else:
+ # c.sh("cryptsetup --key-file " + d + "/" + journal_uuid + ".luks.key" +
+ # " luksOpen " +
+ # " " + disk + "2" +
+ # " " + journal_uuid)
+# c.sh("ceph-disk activate /dev/mapper/" + osd_uuid)
+ c.sh("ceph-disk activate-journal --dmcrypt --dmcrypt-key-dir /tmp " + disk + "2")
data_partition = c.get_osd_partition(osd_uuid)
assert data_partition['type'] == 'data'
assert data_partition['state'] == 'active'
diff --git a/src/ceph-disk b/src/ceph-disk
index a755a7f..26a8763 100755
--- a/src/ceph-disk
+++ b/src/ceph-disk
@@ -1,5 +1,6 @@
#!/usr/bin/env python
#
+# Copyright (C) 2015 Red Hat <contact@redhat.com>
# Copyright (C) 2014 Inktank <info@inktank.com>
# Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com>
# Copyright (C) 2014 Catalyst.net Ltd
@@ -1669,6 +1670,17 @@ def check_journal_reqs(args):
])
return (not allows_journal, not wants_journal, not needs_journal)
+def get_cryptsetup_parameters(cluster):
+ cryptsetup_parameters_str = get_conf(
+ cluster=cluster,
+ variable='osd_cryptsetup_parameters',
+ )
+ if cryptsetup_parameters_str is None:
+ cryptsetup_parameters = []
+ else:
+ cryptsetup_parameters = shlex.split(cryptsetup_parameters_str)
+ return cryptsetup_parameters
+
def main_prepare(args):
journal_dm_keypath = None
osd_dm_keypath = None
@@ -1755,14 +1767,7 @@ def main_prepare(args):
)
journal_size = int(journal_size)
- cryptsetup_parameters_str = get_conf(
- cluster=args.cluster,
- variable='osd_cryptsetup_parameters',
- )
- if cryptsetup_parameters_str is None:
- cryptsetup_parameters = []
- else:
- cryptsetup_parameters = shlex.split(cryptsetup_parameters_str)
+ cryptsetup_parameters = get_cryptsetup_parameters(args.cluster)
dmcrypt_keysize_str = get_conf(
cluster=args.cluster,
@@ -2481,11 +2486,21 @@ def main_activate_journal(args):
# it before proceeding.
rawdev = args.dev
ptype = get_partition_type(rawdev)
- if ptype not in [DMCRYPT_JOURNAL_UUID]:
+ if ptype == DMCRYPT_JOURNAL_UUID:
+ type = 'plain'
+ elif ptype == DMCRYPT_LUKS_JOURNAL_UUID:
+ type = 'LUKS'
+ else:
raise Error('activate-journal --dmcrypt called for invalid dev %s' % (rawdev))
part_uuid = get_partition_uuid(rawdev)
- dmcrypt_key_path = os.path.join(args.dmcrypt_key_dir, part_uuid)
- dev = dmcrypt_map(rawdev, dmcrypt_key_path, part_uuid)
+ dmcrypt_key_path = get_dmcrypt_key_path(part_uuid,
+ args.dmcrypt_key_dir,
+ type == 'LUKS')
+ LOG.debug('main_activate_journal: raw device ' + rawdev + ' type ' + type)
+ dev = dmcrypt_map(rawdev, dmcrypt_key_path, part_uuid,
+ get_cryptsetup_parameters(args.cluster),
+ type == 'LUKS')
+ LOG.debug('main_activate_journal: dmcrypt device ' + dev)
else:
dev = args.dev
@@ -3328,6 +3343,12 @@ def make_prepare_parser(subparsers):
def make_activate_parser(subparsers):
activate_parser = subparsers.add_parser('activate', help='Activate a Ceph OSD')
activate_parser.add_argument(
+ '--cluster',
+ metavar='NAME',
+ default='ceph',
+ help='Ceph cluster name',
+ )
+ activate_parser.add_argument(
'--mount',
action='store_true', default=None,
help='mount a block device [deprecated, ignored]',
@@ -3376,6 +3397,12 @@ def make_activate_parser(subparsers):
def make_activate_journal_parser(subparsers):
activate_journal_parser = subparsers.add_parser('activate-journal', help='Activate an OSD via its journal device')
activate_journal_parser.add_argument(
+ '--cluster',
+ metavar='NAME',
+ default='ceph',
+ help='Ceph cluster name',
+ )
+ activate_journal_parser.add_argument(
'dev',
metavar='DEV',
help='path to journal block device',