aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docker/ceph/ceph-osd/extend_start.sh110
-rw-r--r--docker/kolla-toolbox/find_disks.py142
-rw-r--r--releasenotes/notes/kolla-ceph-bluestore-a30ce85948d28427.yaml4
3 files changed, 234 insertions, 22 deletions
diff --git a/docker/ceph/ceph-osd/extend_start.sh b/docker/ceph/ceph-osd/extend_start.sh
index ee745d0af..57ec84f4e 100644
--- a/docker/ceph/ceph-osd/extend_start.sh
+++ b/docker/ceph/ceph-osd/extend_start.sh
@@ -13,38 +13,97 @@ if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
# NOTE(SamYaple): Static gpt partcodes
CEPH_JOURNAL_TYPE_CODE="45B0969E-9B03-4F30-B4C6-B4B80CEFF106"
CEPH_OSD_TYPE_CODE="4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D"
+ CEPH_OSD_BS_WAL_TYPE_CODE="0FC63DAF-8483-4772-8E79-3D69D8477DE4"
+ CEPH_OSD_BS_DB_TYPE_CODE="CE8DF73C-B89D-45B0-AD98-D45332906d90"
# Wait for ceph quorum before proceeding
ceph quorum_status
if [[ "${USE_EXTERNAL_JOURNAL}" == "False" ]]; then
# Formatting disk for ceph
- sgdisk --zap-all -- "${OSD_DEV}"
- sgdisk --new=2:1M:5G -- "${JOURNAL_DEV}"
- sgdisk --largest-new=1 -- "${OSD_DEV}"
+ if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
+ if [ -n "${OSD_BS_BLOCK_DEV}" ]; then
+ sgdisk --zap-all -- "${OSD_BS_BLOCK_DEV}"
+ sgdisk --new=1:0:+100M --mbrtogpt -- "${OSD_BS_BLOCK_DEV}"
+ sgdisk --largest-new=2 --mbrtogpt -- "${OSD_BS_BLOCK_DEV}"
+ sgdisk --zap-all -- "${OSD_BS_BLOCK_DEV}"2
+ fi
+
+ if [ -n "${OSD_BS_WAL_DEV}" ] && [ "${OSD_BS_BLOCK_DEV}" != "${OSD_BS_WAL_DEV}" ] && [ -n "${OSD_BS_WAL_PARTNUM}" ]; then
+ sgdisk --zap-all -- "${OSD_BS_WAL_DEV}""${OSD_BS_WAL_PARTNUM}"
+ fi
+
+ if [ -n "${OSD_BS_DB_DEV}" ] && [ "${OSD_BS_BLOCK_DEV}" != "${OSD_BS_DB_DEV}" ] && [ -n "${OSD_BS_DB_PARTNUM}" ]; then
+ sgdisk --zap-all -- "${OSD_BS_DB_DEV}""${OSD_BS_DB_PARTNUM}"
+ fi
+ else
+ sgdisk --zap-all -- "${OSD_DEV}"
+ sgdisk --new=2:1M:5G -- "${JOURNAL_DEV}"
+ sgdisk --largest-new=1 -- "${OSD_DEV}"
+ fi
# NOTE(SamYaple): This command may throw errors that we can safely ignore
partprobe || true
fi
- OSD_ID=$(ceph osd create)
- OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
- mkdir -p "${OSD_DIR}"
+ if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
+ OSD_UUID=$(uuidgen)
+ OSD_ID=$(ceph osd new "${OSD_UUID}")
+ OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
+ mkdir -p "${OSD_DIR}"
+
+ mkfs.xfs -f "${OSD_BS_BLOCK_DEV}"1
+ mount "${OSD_BS_BLOCK_DEV}"1 "${OSD_DIR}"
+
+ # This will through an error about no key existing. That is normal. It then
+ # creates the key in the next step.
+ ceph-osd -i "${OSD_ID}" --mkkey
+ echo "bluestore" > "${OSD_DIR}"/type
+ sgdisk "--change-name=2:KOLLA_CEPH_DATA_BS_B_${OSD_ID}" "--typecode=2:${CEPH_OSD_TYPE_CODE}" -- "${OSD_BS_BLOCK_DEV}"
+
+ if [ -n "${OSD_BS_WAL_DEV}" ] && [ "${OSD_BS_BLOCK_DEV}" != "${OSD_BS_WAL_DEV}" ] && [ -n "${OSD_BS_WAL_PARTNUM}" ]; then
+ sgdisk "--change-name="${OSD_BS_WAL_PARTNUM}":KOLLA_CEPH_DATA_BS_W_${OSD_ID}" "--typecode=1:${CEPH_OSD_BS_WAL_TYPE_CODE}" -- "${OSD_BS_WAL_DEV}"
+ fi
+
+ if [ -n "${OSD_BS_DB_DEV}" ] && [ "${OSD_BS_BLOCK_DEV}" != "${OSD_BS_DB_DEV}" ] && [ -n "${OSD_BS_DB_PARTNUM}" ]; then
+ sgdisk "--change-name="${OSD_BS_DB_PARTNUM}":KOLLA_CEPH_DATA_BS_D_${OSD_ID}" "--typecode=1:${CEPH_OSD_BS_DB_TYPE_CODE}" -- "${OSD_BS_DB_DEV}"
+ fi
+
+ partprobe || true
+
+ ln -sf /dev/disk/by-partlabel/KOLLA_CEPH_DATA_BS_B_"${OSD_ID}" "${OSD_DIR}"/block
- if [[ "${OSD_FILESYSTEM}" == "btrfs" ]]; then
- mkfs.btrfs -f "${OSD_PARTITION}"
- elif [[ "${OSD_FILESYSTEM}" == "ext4" ]]; then
- mkfs.ext4 "${OSD_PARTITION}"
+ if [ -n "${OSD_BS_WAL_DEV}" ] && [ "${OSD_BS_BLOCK_DEV}" != "${OSD_BS_WAL_DEV}" ] && [ -n "${OSD_BS_WAL_PARTNUM}" ]; then
+ ln -sf /dev/disk/by-partlabel/KOLLA_CEPH_DATA_BS_W_"${OSD_ID}" "${OSD_DIR}"/block.wal
+ fi
+
+ if [ -n "${OSD_BS_DB_DEV}" ] && [ "${OSD_BS_BLOCK_DEV}" != "${OSD_BS_DB_DEV}" ]i && [ -n "${OSD_BS_DB_PARTNUM}" ]; then
+ ln -sf /dev/disk/by-partlabel/KOLLA_CEPH_DATA_BS_D_"${OSD_ID}" "${OSD_DIR}"/block.db
+ fi
+
+ ceph-osd -i "${OSD_ID}" --mkfs -k "${OSD_DIR}"/keyring --osd-uuid "${OSD_UUID}"
+ ceph auth add "osd.${OSD_ID}" osd 'allow *' mon 'allow profile osd' -i "${OSD_DIR}/keyring"
+ umount "${OSD_BS_BLOCK_DEV}"1
else
- mkfs.xfs -f "${OSD_PARTITION}"
- fi
- mount "${OSD_PARTITION}" "${OSD_DIR}"
+ OSD_ID=$(ceph osd create)
+ OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
+ mkdir -p "${OSD_DIR}"
+
+ if [[ "${OSD_FILESYSTEM}" == "btrfs" ]]; then
+ mkfs.btrfs -f "${OSD_PARTITION}"
+ elif [[ "${OSD_FILESYSTEM}" == "ext4" ]]; then
+ mkfs.ext4 "${OSD_PARTITION}"
+ else
+ mkfs.xfs -f "${OSD_PARTITION}"
+ fi
+ mount "${OSD_PARTITION}" "${OSD_DIR}"
- # This will through an error about no key existing. That is normal. It then
- # creates the key in the next step.
- ceph-osd -i "${OSD_ID}" --mkfs --osd-journal="${JOURNAL_PARTITION}" --mkkey
- ceph auth add "osd.${OSD_ID}" osd 'allow *' mon 'allow profile osd' -i "${OSD_DIR}/keyring"
- umount "${OSD_PARTITION}"
+ # This will through an error about no key existing. That is normal. It then
+ # creates the key in the next step.
+ ceph-osd -i "${OSD_ID}" --mkfs --osd-journal="${JOURNAL_PARTITION}" --mkkey
+ ceph auth add "osd.${OSD_ID}" osd 'allow *' mon 'allow profile osd' -i "${OSD_DIR}/keyring"
+ umount "${OSD_PARTITION}"
+ fi
if [[ "${!CEPH_CACHE[@]}" ]]; then
CEPH_ROOT_NAME=cache
@@ -63,11 +122,20 @@ if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
ceph osd crush add "${OSD_ID}" "${OSD_INITIAL_WEIGHT}" host="${HOSTNAME}${CEPH_ROOT_NAME:+-${CEPH_ROOT_NAME}}"
# Setting partition name based on ${OSD_ID}
- sgdisk "--change-name=${OSD_PARTITION_NUM}:KOLLA_CEPH_DATA_${OSD_ID}" "--typecode=${OSD_PARTITION_NUM}:${CEPH_OSD_TYPE_CODE}" -- "${OSD_DEV}"
- sgdisk "--change-name=${JOURNAL_PARTITION_NUM}:KOLLA_CEPH_DATA_${OSD_ID}_J" "--typecode=${JOURNAL_PARTITION_NUM}:${CEPH_JOURNAL_TYPE_CODE}" -- "${JOURNAL_DEV}"
+ if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
+ sgdisk "--change-name=1:KOLLA_CEPH_BSDATA_${OSD_ID}" -- "${OSD_BS_BLOCK_DEV}"
+ else
+ sgdisk "--change-name=${OSD_PARTITION_NUM}:KOLLA_CEPH_DATA_${OSD_ID}" "--typecode=${OSD_PARTITION_NUM}:${CEPH_OSD_TYPE_CODE}" -- "${OSD_DEV}"
+ sgdisk "--change-name=${JOURNAL_PARTITION_NUM}:KOLLA_CEPH_DATA_${OSD_ID}_J" "--typecode=${JOURNAL_PARTITION_NUM}:${CEPH_JOURNAL_TYPE_CODE}" -- "${JOURNAL_DEV}"
+ fi
+ partprobe || true
exit 0
fi
OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
-ARGS="-i ${OSD_ID} --osd-journal ${JOURNAL_PARTITION} -k ${OSD_DIR}/keyring"
+if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
+ ARGS="-i ${OSD_ID}"
+else
+ ARGS="-i ${OSD_ID} --osd-journal ${JOURNAL_PARTITION} -k ${OSD_DIR}/keyring"
+fi
diff --git a/docker/kolla-toolbox/find_disks.py b/docker/kolla-toolbox/find_disks.py
index 63f5262af..b7047d58a 100644
--- a/docker/kolla-toolbox/find_disks.py
+++ b/docker/kolla-toolbox/find_disks.py
@@ -157,6 +157,7 @@ def extract_disk_info(ct, dev, name, use_udev):
kwargs['fs_uuid'] = get_id_fs_uuid(dev, use_udev)
kwargs['fs_label'] = dev.get('ID_FS_LABEL', '')
if dev.get('DEVTYPE', '') == 'partition':
+ kwargs['partition_label'] = name
kwargs['device'] = dev.find_parent('block').device_node
kwargs['partition'] = dev.device_node
kwargs['partition_num'] = \
@@ -187,6 +188,121 @@ def extract_disk_info(ct, dev, name, use_udev):
yield kwargs
+def extract_disk_info_bs(ct, dev, name, use_udev):
+ if not dev:
+ return
+ kwargs = dict(bs_db_partition='', bs_db_label='', bs_db_device='',
+ bs_wal_partition='', bs_wal_label='', bs_wal_device='',
+ bs_wal_partition_num='', bs_db_partition_num='',
+ partition='', partition_label='', partition_num='',
+ device='', partition_usage='')
+ kwargs['fs_uuid'] = get_id_fs_uuid(dev, use_udev)
+ kwargs['fs_label'] = dev.get('ID_FS_LABEL', '')
+
+ if dev.get('DEVTYPE', '') == 'partition':
+ actual_name = get_id_part_entry_name(dev, use_udev)
+
+ if (('BOOTSTRAP_BS' in name and name in actual_name)
+ or ('BSDATA' in name and name in actual_name)):
+ if '_BS_D' in actual_name:
+ kwargs['partition_usage'] = 'block.db'
+ kwargs['bs_db_partition_num'] = \
+ re.sub(r'.*[^\d]', '', dev.device_node)
+ kwargs['bs_db_device'] = dev.device_node[:-1]
+ kwargs['bs_db_label'] = actual_name
+ return kwargs
+ if '_BS_W' in actual_name:
+ kwargs['partition_usage'] = 'block.wal'
+ kwargs['bs_wal_partition_num'] = \
+ re.sub(r'.*[^\d]', '', dev.device_node)
+ kwargs['bs_wal_device'] = dev.device_node[:-1]
+ kwargs['bs_wal_label'] = actual_name
+ return kwargs
+ if '_BS' in actual_name:
+ kwargs['partition_usage'] = 'block'
+ kwargs['partition'] = dev.device_node[:-1]
+ kwargs['partition_label'] = actual_name
+ kwargs['partition_num'] = \
+ re.sub(r'.*[^\d]', '', dev.device_node)
+ kwargs['device'] = dev.device_node[:-1]
+ return kwargs
+ return 0
+
+
+def nb_of_block_device(disks):
+ block_info = dict()
+ block_info['block_label'] = list()
+ nb_of_blocks = 0
+ for item in disks:
+ if item['partition_usage'] == 'block':
+ block_info['block_label'].append(item['partition_label'])
+ nb_of_blocks += 1
+ block_info['nb_of_block'] = nb_of_blocks
+ return block_info
+
+
+def combine_info(disks):
+ info = list()
+ blocks = nb_of_block_device(disks)
+ block_id = 0
+ while block_id < blocks['nb_of_block']:
+ final = dict()
+ idx = 0
+ idx_osd = idx_wal = idx_db = -1
+ for item in disks:
+ if (item['partition_usage'] == 'block' and
+ item['partition_label'] ==
+ blocks['block_label'][block_id]):
+ idx_osd = idx
+ elif (item['partition_usage'] == 'block.wal' and
+ item['bs_wal_label'] ==
+ blocks['block_label'][block_id].replace('_BS', '_BS_W')):
+ idx_wal = idx
+ elif (item['partition_usage'] == 'block.db' and
+ item['bs_db_label'] ==
+ blocks['block_label'][block_id].replace('_BS', '_BS_D')):
+ idx_db = idx
+ idx = idx + 1
+
+ # write the information of block.db and block.wal to block item
+ # if block.db and block.wal are found
+ if idx_wal != -1:
+ disks[idx_osd]['bs_wal_device'] = disks[idx_wal]['bs_wal_device']
+ disks[idx_osd]['bs_wal_partition_num'] = \
+ disks[idx_wal]['bs_wal_partition_num']
+ disks[idx_osd]['bs_wal_label'] = disks[idx_wal]['bs_wal_label']
+ disks[idx_wal]['partition_usage'] = ''
+ if idx_db != -1:
+ disks[idx_osd]['bs_db_device'] = disks[idx_db]['bs_db_device']
+ disks[idx_osd]['bs_db_partition_num'] = \
+ disks[idx_db]['bs_db_partition_num']
+ disks[idx_osd]['bs_db_label'] = disks[idx_db]['bs_db_label']
+ disks[idx_db]['partition_usage'] = ''
+
+ final['fs_uuid'] = disks[idx_osd]['fs_uuid']
+ final['fs_label'] = disks[idx_osd]['fs_label']
+ final['bs_db_device'] = disks[idx_osd]['bs_db_device']
+ final['bs_db_partition_num'] = disks[idx_osd]['bs_db_partition_num']
+ final['bs_db_label'] = disks[idx_osd]['bs_db_label']
+ final['bs_wal_device'] = disks[idx_osd]['bs_wal_device']
+ final['bs_wal_partition_num'] = disks[idx_osd]['bs_wal_partition_num']
+ final['bs_wal_label'] = disks[idx_osd]['bs_wal_label']
+ final['device'] = disks[idx_osd]['device']
+ final['partition'] = disks[idx_osd]['partition']
+ final['partition_label'] = disks[idx_osd]['partition_label']
+ final['partition_num'] = disks[idx_osd]['partition_num']
+ final['external_journal'] = False
+ final['journal'] = ''
+ final['journal_device'] = ''
+ final['journal_num'] = 0
+
+ info.append(final)
+ disks[idx_osd]['partition_usage'] = ''
+ block_id += 1
+
+ return info
+
+
def main():
argument_spec = dict(
match_mode=dict(required=False, choices=['strict', 'prefix'],
@@ -203,9 +319,33 @@ def main():
ret = list()
ct = pyudev.Context()
for dev in find_disk(ct, name, match_mode, use_udev):
- for info in extract_disk_info(ct, dev, name, use_udev):
+ if '_BSDATA' in name:
+ info = extract_disk_info_bs(ct, dev, name, use_udev)
if info:
ret.append(info)
+ elif '_BS' in name:
+ info = extract_disk_info_bs(ct, dev, name, use_udev)
+ if info:
+ ret.append(info)
+
+ info = extract_disk_info_bs(ct, dev,
+ name.replace('_BS', '_BS_W'),
+ use_udev)
+ if info:
+ ret.append(info)
+
+ info = extract_disk_info_bs(ct, dev,
+ name.replace('_BS', '_BS_D'),
+ use_udev)
+ if info:
+ ret.append(info)
+ else:
+ for info in extract_disk_info(ct, dev, name, use_udev):
+ if info:
+ ret.append(info)
+
+ if '_BS' in name and len(ret) > 0:
+ ret = combine_info(ret)
module.exit_json(disks=json.dumps(ret))
except Exception as e:
diff --git a/releasenotes/notes/kolla-ceph-bluestore-a30ce85948d28427.yaml b/releasenotes/notes/kolla-ceph-bluestore-a30ce85948d28427.yaml
new file mode 100644
index 000000000..bd377f8e4
--- /dev/null
+++ b/releasenotes/notes/kolla-ceph-bluestore-a30ce85948d28427.yaml
@@ -0,0 +1,4 @@
+---
+features:
+ - |
+ Support Kolla Ceph to deploy bluestore OSDs in Rocky release.