Allow the user to skip Bluestore features
This patchset allows users to skip either the WAL, DB or both bluestore devices when adding an OSD. It does so by modifying the 'add-disk' action to take an additional parameter, called 'bluestore-skip' which specifies which features to avoid using. Change-Id: I744316656a2570950c42b1c3898a41a4185ffbd7
This commit is contained in:
@@ -69,6 +69,11 @@ add-disk:
|
||||
type: boolean
|
||||
description: |
|
||||
Must be set when 'use-crimson' is True.
|
||||
bluestore-skip:
|
||||
type: string
|
||||
description: |
|
||||
A comma-separated list of what Bluestore features to omit. This can
|
||||
be the WAL and DB devices (for example - "wal,db").
|
||||
required:
|
||||
- osd-devices
|
||||
blacklist-add-disk:
|
||||
|
@@ -79,8 +79,8 @@ def start_crimson_osd(osd_id, device):
|
||||
'crimson-osd@{}'.format(osd_id)])
|
||||
|
||||
|
||||
def add_device(request, device_path, bucket=None,
|
||||
osd_id=None, part_iter=None, use_crimson=False):
|
||||
def add_device(request, device_path, bucket=None, osd_id=None,
|
||||
part_iter=None, use_crimson=False, bluestore_skip=None):
|
||||
"""Add a new device to be used by the OSD unit.
|
||||
|
||||
:param request: A broker request to notify monitors of changes.
|
||||
@@ -99,6 +99,12 @@ def add_device(request, device_path, bucket=None,
|
||||
demand, to service bcache creation, or None, if no
|
||||
partitions need to be created.
|
||||
:type part_iter: Option[PartitionIter, None]
|
||||
|
||||
:param use_crimson: Whether to use Crimson for the OSD (Experimental).
|
||||
:type use_crimson: bool
|
||||
|
||||
:param bluestore_skip: Which Bluestore features to avoid.
|
||||
:type bluestore_skip: Option[str, None]
|
||||
"""
|
||||
if part_iter is not None:
|
||||
effective_dev = part_iter.create_bcache(device_path)
|
||||
@@ -111,12 +117,15 @@ def add_device(request, device_path, bucket=None,
|
||||
if osd_id is not None and osd_id.startswith('osd.'):
|
||||
osd_id = osd_id[4:]
|
||||
|
||||
if bluestore_skip:
|
||||
bluestore_skip = bluestore_skip.split(',')
|
||||
|
||||
charms_ceph.utils.osdize(effective_dev, hookenv.config('osd-format'),
|
||||
ceph_hooks.get_journal_devices(),
|
||||
hookenv.config('ignore-device-errors'),
|
||||
hookenv.config('osd-encrypt'),
|
||||
hookenv.config('osd-encrypt-keymanager'),
|
||||
osd_id)
|
||||
osd_id, bluestore_skip)
|
||||
|
||||
if use_crimson:
|
||||
start_crimson_osd(osd_id, effective_dev)
|
||||
@@ -233,6 +242,8 @@ if __name__ == "__main__":
|
||||
else:
|
||||
osd_ids = [None] * len(devices)
|
||||
|
||||
bluestore_skip = hookenv.action_get('bluestore-skip')
|
||||
|
||||
errors = []
|
||||
for dev, osd_id in zip(devices, osd_ids):
|
||||
try:
|
||||
|
@@ -769,7 +769,7 @@ def handle_create_cephfs(request, service):
|
||||
log(msg, level=ERROR)
|
||||
return {'exit-code': 1, 'stderr': msg}
|
||||
|
||||
if get_cephfs(service=service):
|
||||
if cephfs_name in get_cephfs(service=service):
|
||||
# CephFS new has already been called
|
||||
log("CephFS already created")
|
||||
return
|
||||
@@ -853,15 +853,10 @@ def handle_create_cephfs_client(request, service):
|
||||
log(msg, level=ERROR)
|
||||
return {'exit-code': 1, 'stderr': msg}
|
||||
|
||||
# Check that the provided fs_name exists
|
||||
if fs_name not in get_cephfs(service=service):
|
||||
msg = ("Ceph filesystem {} does not exist."
|
||||
+ "Cannot authorize client").format(
|
||||
fs_name)
|
||||
log(msg, level=ERROR)
|
||||
return {'exit-code': 1, 'stderr': msg}
|
||||
|
||||
# Check that the provided client does NOT exist.
|
||||
# Skip creation if the request has already been called
|
||||
# This makes it a bit more compatible with older Ceph versions
|
||||
# that throw when trying to authorize a user with the same
|
||||
# capabilites that it currently has.
|
||||
try:
|
||||
cmd = ["ceph", "--id", service, "auth", "ls", "-f", "json"]
|
||||
auth_ls = json.loads(check_output(cmd, encoding="utf-8"))
|
||||
@@ -873,12 +868,14 @@ def handle_create_cephfs_client(request, service):
|
||||
return {'exit-code': 1, 'stderr': str(err)}
|
||||
|
||||
client = "client.{}".format(client_id)
|
||||
if client in (elem["entity"] for elem in auth_ls["auth_dump"]):
|
||||
msg = "Client {} already exists".format(client)
|
||||
log(msg, level=ERROR)
|
||||
return {'exit-code': 1, 'stderr': msg}
|
||||
for elem in auth_ls["auth_dump"]:
|
||||
if client == elem["entity"]:
|
||||
log("Client {} has already been created".format(client))
|
||||
return {'exit-code': 0, 'key': elem["key"]}
|
||||
|
||||
# Try to authorize the client
|
||||
# `ceph fs authorize` already returns the correct error
|
||||
# message if the filesystem doesn't exist.
|
||||
try:
|
||||
cmd = [
|
||||
"ceph",
|
||||
|
@@ -1541,11 +1541,11 @@ def get_devices(name):
|
||||
|
||||
|
||||
def osdize(dev, osd_format, osd_journal, ignore_errors=False, encrypt=False,
|
||||
key_manager=CEPH_KEY_MANAGER, osd_id=None):
|
||||
key_manager=CEPH_KEY_MANAGER, osd_id=None, bluestore_skip=None):
|
||||
if dev.startswith('/dev'):
|
||||
osdize_dev(dev, osd_format, osd_journal,
|
||||
ignore_errors, encrypt,
|
||||
key_manager, osd_id)
|
||||
key_manager, osd_id, bluestore_skip)
|
||||
else:
|
||||
if cmp_pkgrevno('ceph', '14.0.0') >= 0:
|
||||
log("Directory backed OSDs can not be created on Nautilus",
|
||||
@@ -1556,7 +1556,7 @@ def osdize(dev, osd_format, osd_journal, ignore_errors=False, encrypt=False,
|
||||
|
||||
def osdize_dev(dev, osd_format, osd_journal, ignore_errors=False,
|
||||
encrypt=False, key_manager=CEPH_KEY_MANAGER,
|
||||
osd_id=None):
|
||||
osd_id=None, bluestore_skip=None):
|
||||
"""
|
||||
Prepare a block device for use as a Ceph OSD
|
||||
|
||||
@@ -1570,6 +1570,8 @@ def osdize_dev(dev, osd_format, osd_journal, ignore_errors=False,
|
||||
processing
|
||||
:param: encrypt: Encrypt block devices using 'key_manager'
|
||||
:param: key_manager: Key management approach for encryption keys
|
||||
:param: osd_id: The ID for the newly created OSD
|
||||
:param: bluestore_skip: Bluestore parameters to skip ('wal' and/or 'db')
|
||||
:raises subprocess.CalledProcessError: in the event that any supporting
|
||||
subprocess operation failed
|
||||
:raises ValueError: if an invalid key_manager is provided
|
||||
@@ -1620,7 +1622,8 @@ def osdize_dev(dev, osd_format, osd_journal, ignore_errors=False,
|
||||
osd_journal,
|
||||
encrypt,
|
||||
key_manager,
|
||||
osd_id)
|
||||
osd_id,
|
||||
bluestore_skip)
|
||||
else:
|
||||
cmd = _ceph_disk(dev,
|
||||
osd_format,
|
||||
@@ -1694,7 +1697,7 @@ def _ceph_disk(dev, osd_format, osd_journal, encrypt=False):
|
||||
|
||||
|
||||
def _ceph_volume(dev, osd_journal, encrypt=False, key_manager=CEPH_KEY_MANAGER,
|
||||
osd_id=None):
|
||||
osd_id=None, bluestore_skip=None):
|
||||
"""
|
||||
Prepare and activate a device for usage as a Ceph OSD using ceph-volume.
|
||||
|
||||
@@ -1706,6 +1709,7 @@ def _ceph_volume(dev, osd_journal, encrypt=False, key_manager=CEPH_KEY_MANAGER,
|
||||
:param: encrypt: Use block device encryption
|
||||
:param: key_manager: dm-crypt Key Manager to use
|
||||
:param: osd_id: The OSD-id to recycle, or None to create a new one
|
||||
:param: bluestore_skip: Bluestore parameters to skip ('wal' and/or 'db')
|
||||
:raises subprocess.CalledProcessError: in the event that any supporting
|
||||
LVM operation failed.
|
||||
:returns: list. 'ceph-volume' command and required parameters for
|
||||
@@ -1732,7 +1736,11 @@ def _ceph_volume(dev, osd_journal, encrypt=False, key_manager=CEPH_KEY_MANAGER,
|
||||
encrypt=encrypt,
|
||||
key_manager=key_manager))
|
||||
|
||||
for extra_volume in ('wal', 'db'):
|
||||
extras = ('wal', 'db')
|
||||
if bluestore_skip:
|
||||
extras = tuple(set(extras) - set(bluestore_skip))
|
||||
|
||||
for extra_volume in extras:
|
||||
devices = get_devices('bluestore-{}'.format(extra_volume))
|
||||
if devices:
|
||||
cmd.append('--block.{}'.format(extra_volume))
|
||||
@@ -2075,6 +2083,7 @@ def get_cephfs(service):
|
||||
for part in parts:
|
||||
if "name" in part:
|
||||
filesystems.append(part.split(' ')[1])
|
||||
return filesystems
|
||||
except subprocess.CalledProcessError:
|
||||
return []
|
||||
|
||||
|
@@ -53,7 +53,7 @@ class AddDiskActionTests(CharmTestCase):
|
||||
self.hookenv.relation_set.assert_has_calls([call])
|
||||
mock_osdize.assert_has_calls([mock.call('/dev/myosddev',
|
||||
None, '', True, True,
|
||||
True, None)])
|
||||
True, None, None)])
|
||||
|
||||
piter = add_disk.PartitionIter(['/dev/cache'], 100, ['/dev/myosddev'])
|
||||
mock_create_bcache = mock.MagicMock(side_effect=lambda b: '/dev/cache')
|
||||
|
Reference in New Issue
Block a user