Requires: util-linux
Requires: xfsprogs
Requires: python%{python3_pkgversion}-setuptools
+Requires: python%{python3_pkgversion}-packaging
Requires: python%{python3_pkgversion}-ceph-common = %{_epoch_prefix}%{version}-%{release}
%description volume
This package contains a tool to deploy OSD with different devices like
def __getattr__(self, *a):
raise RuntimeError("No valid ceph configuration file was loaded.")
-conf = namedtuple('config', ['ceph', 'cluster', 'verbosity', 'path', 'log_path'])
+conf = namedtuple('config', ['ceph', 'cluster', 'verbosity', 'path', 'log_path', 'dmcrypt_no_workqueue'])
conf.ceph = UnloadedConfig()
+conf.dmcrypt_no_workqueue = None
__version__ = "1.0.0"
raise RuntimeError('could not find a bluestore OSD to activate')
is_encrypted = osd_block_lv.tags.get('ceph.encrypted', '0') == '1'
+ if is_encrypted and conf.dmcrypt_no_workqueue is None:
+ encryption_utils.set_dmcrypt_no_workqueue()
dmcrypt_secret = None
osd_id = osd_block_lv.tags['ceph.osd_id']
conf.cluster = osd_block_lv.tags['ceph.cluster_name']
)
parser.add_argument(
'--dmcrypt',
- action='store_true',
+ action=arg_validators.DmcryptAction,
help='Enable device encryption via dm-crypt',
)
parser.add_argument(
'default': "",
},
'--dmcrypt': {
- 'action': 'store_true',
+ 'action': arg_validators.DmcryptAction,
'help': 'Enable device encryption via dm-crypt',
},
'--no-systemd': {
)
parser.add_argument(
'--dmcrypt',
- action='store_true',
+ action=arg_validators.DmcryptAction,
help='Enable device encryption via dm-crypt',
)
parser.add_argument(
from ceph_volume import terminal, decorators, process
from ceph_volume.util.device import Device
from ceph_volume.util import disk
-
+from ceph_volume.util.encryption import set_dmcrypt_no_workqueue
+from ceph_volume import process, conf
def valid_osd_id(val):
return str(int(val))
+class DmcryptAction(argparse._StoreTrueAction):
+ def __init__(self, *args, **kwargs):
+ super(DmcryptAction, self).__init__(*args, **kwargs)
+
+ def __call__(self, *args, **kwargs):
+ set_dmcrypt_no_workqueue()
+ super(DmcryptAction, self).__call__(*args, **kwargs)
+
class ValidDevice(object):
def __init__(self, as_string=False, gpt_ok=False):
# check if we are not a device mapper
if "dm-" not in real_path:
self.path = real_path
- if not sys_info.devices:
- if self.path:
- sys_info.devices = disk.get_devices(device=self.path)
- else:
- sys_info.devices = disk.get_devices()
- if sys_info.devices.get(self.path, {}):
- self.device_nodes = sys_info.devices[self.path]['device_nodes']
+ if not sys_info.devices.get(self.path):
+ sys_info.devices = disk.get_devices()
self.sys_api = sys_info.devices.get(self.path, {})
self.partitions = self._get_partitions()
self.lv_api = None
self._is_lvm_member = None
self.ceph_device = False
self._parse()
+ self.device_nodes = sys_info.devices[self.path]['device_nodes']
self.lsm_data = self.fetch_lsm(with_lsm)
self.available_lvm, self.rejected_reasons_lvm = self._check_lvm_reject_reasons()
from ceph_volume.util.device import Device
from .prepare import write_keyring
from .disk import lsblk, device_family, get_part_entry_type
+from packaging import version
logger = logging.getLogger(__name__)
mlogger = terminal.MultiLogger(__name__)
+def set_dmcrypt_no_workqueue(target_version: str = '2.3.4') -> None:
+ """
+ set `conf.dmcrypt_no_workqueue` to `True` if the available
+ version of `cryptsetup` is greater or equal to `version`
+ """
+ command = ["cryptsetup", "--version"]
+ out, err, rc = process.call(command)
+ try:
+ if version.parse(out[0]) >= version.parse(f'cryptsetup {target_version}'):
+ conf.dmcrypt_no_workqueue = True
+ except IndexError:
+ mlogger.debug(f'cryptsetup version check: rc={rc} out={out} err={err}')
+ raise RuntimeError("Couldn't check the cryptsetup version.")
+
+def bypass_workqueue(device: str) -> bool:
+ return not Device(device).rotational and conf.dmcrypt_no_workqueue
+
def get_key_size_from_conf():
"""
Return the osd dmcrypt key size from config file.
'--key-size', '256',
]
+ if bypass_workqueue(device):
+ command.extend(['--perf-no_read_workqueue',
+ '--perf-no_write_workqueue'])
+
process.call(command, stdin=key, terminal_verbose=True, show_command=True)
device,
mapping,
]
+
+ if bypass_workqueue(device):
+ command.extend(['--perf-no_read_workqueue',
+ '--perf-no_write_workqueue'])
+
process.call(command, stdin=key, terminal_verbose=True, show_command=True)