Merge "[rook-ceph] storage backend activation"
This commit is contained in:
commit
308cc06b46
@ -0,0 +1,29 @@
|
||||
From c9888799b8afae1500142d534c305a6cc38ebbe3 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Figueiredo <alex.fernandesfigueiredo@windriver.com>
|
||||
Date: Wed, 2 Apr 2025 11:20:52 -0300
|
||||
Subject: [PATCH] Enable ceph pool creation for AIO systems
|
||||
|
||||
The ceph admin tool/CLI requires the option "--yes-i-really-mean-it" to enable
|
||||
the storage init job to set the pool size to 1 for AIO-SX deployments.
|
||||
|
||||
Signed-off-by: Alex Figueiredo <alex.fernandesfigueiredo@windriver.com>
|
||||
---
|
||||
nova/templates/bin/_storage-init.sh.tpl | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/nova/templates/bin/_storage-init.sh.tpl b/nova/templates/bin/_storage-init.sh.tpl
|
||||
index cb3505d4..70c71a9f 100644
|
||||
--- a/nova/templates/bin/_storage-init.sh.tpl
|
||||
+++ b/nova/templates/bin/_storage-init.sh.tpl
|
||||
@@ -34,7 +34,7 @@ if [ "x$STORAGE_BACKEND" == "xrbd" ]; then
|
||||
fi
|
||||
size_protection=$(ceph osd pool get $1 nosizechange | cut -f2 -d: | tr -d '[:space:]')
|
||||
ceph osd pool set $1 nosizechange 0
|
||||
- ceph osd pool set $1 size ${RBD_POOL_REPLICATION}
|
||||
+ ceph osd pool set $1 size ${RBD_POOL_REPLICATION} --yes-i-really-mean-it
|
||||
ceph osd pool set $1 nosizechange ${size_protection}
|
||||
ceph osd pool set $1 crush_rule "${RBD_POOL_CRUSH_RULE}"
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
@ -21,3 +21,4 @@
|
||||
0021-horizon-Allows-setting-Django-s-CSRF_TRUSTED_ORIGINS.patch
|
||||
0022-horizon-fix-templating-of-list-of-strings-for-CSRF_T.patch
|
||||
0023-Change-uWSGI-socket-to-allow-IPv6-binding.patch
|
||||
0024-Enable-ceph-pool-creation-for-AIO-systems.patch
|
||||
|
@ -107,17 +107,20 @@ CEPH_ROOK_MANAGER_APP = 'rook-ceph-mgr'
|
||||
CEPH_ROOK_MANAGER_SVC = 'rook-ceph-mgr-restful'
|
||||
CEPH_ROOK_POLL_CRUSH_RULE = 'kube-rbd'
|
||||
|
||||
CEPH_POOL_IMAGES_NAME = 'images'
|
||||
CEPH_RBD_POOL_USER_CINDER = "cinder"
|
||||
CEPH_RBD_POOL_USER_GLANCE = 'images'
|
||||
|
||||
CEPH_POOL_IMAGES_NAME = constants.CEPH_POOL_IMAGES_NAME
|
||||
CEPH_POOL_IMAGES_CHUNK_SIZE = 256
|
||||
|
||||
CEPH_POOL_EPHEMERAL_NAME = 'ephemeral'
|
||||
CEPH_POOL_EPHEMERAL_NAME = constants.CEPH_POOL_EPHEMERAL_NAME
|
||||
CEPH_POOL_EPHEMERAL_CHUNK_SIZE = 256
|
||||
|
||||
CEPH_POOL_VOLUMES_NAME = 'cinder-volumes'
|
||||
CEPH_POOL_VOLUMES_NAME = constants.CEPH_POOL_VOLUMES_NAME
|
||||
CEPH_POOL_VOLUMES_APP_NAME = 'cinder-volumes'
|
||||
CEPH_POOL_VOLUMES_CHUNK_SIZE = 512
|
||||
|
||||
CEPH_POOL_BACKUP_NAME = 'cinder.backups'
|
||||
CEPH_POOL_BACKUP_NAME = 'backups'
|
||||
CEPH_POOL_BACKUP_APP_NAME = 'cinder-backup'
|
||||
CEPH_POOL_BACKUP_CHUNK_SIZE = 256
|
||||
|
||||
|
@ -4,10 +4,10 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
from oslo_log import log as logging
|
||||
from sysinv.common import constants
|
||||
from sysinv.common import exception
|
||||
from sysinv.common import storage_backend_conf
|
||||
from sysinv.common import utils
|
||||
from sysinv.helm import common
|
||||
from tsconfig import tsconfig as tsc
|
||||
|
||||
@ -19,8 +19,8 @@ from k8sapp_openstack.utils import get_image_rook_ceph
|
||||
from k8sapp_openstack.utils import is_netapp_available
|
||||
from k8sapp_openstack.utils import is_rook_ceph_backend_available
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
ROOK_CEPH_BACKEND_NAME = app_constants.CEPH_ROOK_BACKEND_NAME
|
||||
NETAPP_NFS_BACKEND_NAME = 'netapp-nfs'
|
||||
NETAPP_ISCSI_BACKEND_NAME = 'netapp-iscsi'
|
||||
|
||||
@ -57,7 +57,7 @@ class CinderHelm(openstack.OpenstackBaseHelm):
|
||||
backend_overrides = self._get_common_backend_overrides()
|
||||
|
||||
# Ceph and Rook Ceph are mutually exclusive, so it's either one or the other
|
||||
if self._is_rook_ceph():
|
||||
if is_rook_ceph_backend_available():
|
||||
cinder_overrides = self._get_conf_rook_ceph_cinder_overrides(cinder_overrides)
|
||||
backend_overrides = self._get_conf_rook_ceph_backends_overrides(backend_overrides)
|
||||
ceph_overrides = self._get_conf_rook_ceph_overrides()
|
||||
@ -121,18 +121,11 @@ class CinderHelm(openstack.OpenstackBaseHelm):
|
||||
# are not necessarily the same. Therefore, the ceph client image must be
|
||||
# dynamically configured based on the ceph backend currently deployed.
|
||||
if is_rook_ceph_backend_available():
|
||||
rook_ceph_config_helper = get_image_rook_ceph()
|
||||
overrides[common.HELM_NS_OPENSTACK] = self._update_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
{
|
||||
'images': {
|
||||
'tags': {
|
||||
'cinder_backup_storage_init': rook_ceph_config_helper,
|
||||
'cinder_storage_init': rook_ceph_config_helper
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
overrides[common.HELM_NS_OPENSTACK] =\
|
||||
self._update_image_tag_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
['cinder_backup_storage_init', 'cinder_storage_init'],
|
||||
get_image_rook_ceph())
|
||||
|
||||
if namespace in self.SUPPORTED_NAMESPACES:
|
||||
return overrides[namespace]
|
||||
@ -284,7 +277,7 @@ class CinderHelm(openstack.OpenstackBaseHelm):
|
||||
'volume_backend_name': bk_name,
|
||||
'volume_driver': 'cinder.volume.drivers.rbd.RBDDriver',
|
||||
'rbd_pool': rbd_pool.encode('utf8', 'strict'),
|
||||
'rbd_user': 'cinder',
|
||||
'rbd_user': app_constants.CEPH_RBD_POOL_USER_CINDER,
|
||||
'rbd_ceph_conf':
|
||||
(constants.CEPH_CONF_PATH +
|
||||
constants.SB_TYPE_CEPH_CONF_FILENAME),
|
||||
@ -415,10 +408,10 @@ class CinderHelm(openstack.OpenstackBaseHelm):
|
||||
# Retrieve the existing enabled_backends value, or set it to an empty string if not present
|
||||
existing_backends = cinder_overrides['DEFAULT'].get('enabled_backends', '')
|
||||
|
||||
# Append 'ceph-store' if it's not already in the enabled_backends list
|
||||
# Append 'ceph-rook-store' if it's not already in the enabled_backends list
|
||||
backends_list = existing_backends.split(',') if existing_backends else []
|
||||
if ROOK_CEPH_BACKEND_NAME not in backends_list:
|
||||
backends_list.append(ROOK_CEPH_BACKEND_NAME)
|
||||
if app_constants.CEPH_ROOK_BACKEND_NAME not in backends_list:
|
||||
backends_list.append(app_constants.CEPH_ROOK_BACKEND_NAME)
|
||||
|
||||
# Update Cinder overrides
|
||||
cinder_overrides['DEFAULT'].update({
|
||||
@ -426,26 +419,35 @@ class CinderHelm(openstack.OpenstackBaseHelm):
|
||||
# If the user doesn't want Ceph Rook to be the default backend,
|
||||
# he can pass a Helm override changing this value, which will
|
||||
# override this value
|
||||
'default_volume_type': ROOK_CEPH_BACKEND_NAME,
|
||||
'default_volume_type': app_constants.CEPH_ROOK_BACKEND_NAME,
|
||||
})
|
||||
return cinder_overrides
|
||||
|
||||
def _get_conf_rook_ceph_overrides(self):
|
||||
replication = 2
|
||||
if utils.is_aio_simplex_system(self.dbapi):
|
||||
replication = 1
|
||||
rook_backend = storage_backend_conf.StorageBackendConfig\
|
||||
.get_configured_backend(self.dbapi, constants.SB_TYPE_CEPH_ROOK)
|
||||
if not rook_backend:
|
||||
LOG.error("No rook ceph backend configured")
|
||||
return {}
|
||||
replication, _ = storage_backend_conf\
|
||||
.StorageBackendConfig\
|
||||
.get_ceph_pool_replication(self.dbapi, ceph_backend=rook_backend)
|
||||
|
||||
chunk_size = self._estimate_ceph_pool_pg_num(self.dbapi.istor_get_all())
|
||||
|
||||
pools = {
|
||||
'cinder-volumes': {
|
||||
'app_name': 'cinder-volumes',
|
||||
'chunk_size': 8,
|
||||
'crush_rule': 'kube-rbd',
|
||||
f'{app_constants.CEPH_POOL_VOLUMES_NAME}': {
|
||||
'app_name': app_constants.CEPH_POOL_VOLUMES_APP_NAME,
|
||||
'chunk_size': min(chunk_size,
|
||||
app_constants.CEPH_POOL_VOLUMES_CHUNK_SIZE),
|
||||
'crush_rule': app_constants.CEPH_ROOK_POLL_CRUSH_RULE,
|
||||
'replication': replication,
|
||||
},
|
||||
'backup': {
|
||||
'app_name': 'cinder-volumes',
|
||||
'chunk_size': 8,
|
||||
'crush_rule': 'kube-rbd',
|
||||
f'{app_constants.CEPH_POOL_BACKUP_NAME}': {
|
||||
'app_name': app_constants.CEPH_POOL_BACKUP_APP_NAME,
|
||||
'chunk_size': min(chunk_size,
|
||||
app_constants.CEPH_POOL_BACKUP_CHUNK_SIZE),
|
||||
'crush_rule': app_constants.CEPH_ROOK_POLL_CRUSH_RULE,
|
||||
'replication': replication,
|
||||
},
|
||||
}
|
||||
@ -458,12 +460,12 @@ class CinderHelm(openstack.OpenstackBaseHelm):
|
||||
return ceph_override
|
||||
|
||||
def _get_conf_rook_ceph_backends_overrides(self, backend_overrides):
|
||||
backend_overrides[ROOK_CEPH_BACKEND_NAME] = {
|
||||
backend_overrides[app_constants.CEPH_ROOK_BACKEND_NAME] = {
|
||||
'image_volume_cache_enabled': 'True',
|
||||
'volume_backend_name': ROOK_CEPH_BACKEND_NAME,
|
||||
'volume_backend_name': app_constants.CEPH_ROOK_BACKEND_NAME,
|
||||
'volume_driver': 'cinder.volume.drivers.rbd.RBDDriver',
|
||||
'rbd_pool': 'cinder-volumes',
|
||||
'rbd_user': 'cinder',
|
||||
'rbd_pool': app_constants.CEPH_POOL_VOLUMES_NAME,
|
||||
'rbd_user': app_constants.CEPH_RBD_POOL_USER_CINDER,
|
||||
'rbd_ceph_conf':
|
||||
(constants.CEPH_CONF_PATH +
|
||||
constants.SB_TYPE_CEPH_CONF_FILENAME),
|
||||
@ -472,14 +474,14 @@ class CinderHelm(openstack.OpenstackBaseHelm):
|
||||
ceph_uuid = get_ceph_uuid()
|
||||
if ceph_uuid:
|
||||
backend_overrides['rbd1']['rbd_secret_uuid'] = ceph_uuid
|
||||
backend_overrides[ROOK_CEPH_BACKEND_NAME]['rbd_secret_uuid'] = ceph_uuid
|
||||
backend_overrides[app_constants.CEPH_ROOK_BACKEND_NAME]['rbd_secret_uuid'] = ceph_uuid
|
||||
|
||||
return backend_overrides
|
||||
|
||||
def _get_ceph_client_rook_overrides(self):
|
||||
return {
|
||||
'user_secret_name': constants.K8S_RBD_PROV_ADMIN_SECRET_NAME,
|
||||
'internal_ceph_backend': ROOK_CEPH_BACKEND_NAME,
|
||||
'internal_ceph_backend': app_constants.CEPH_ROOK_BACKEND_NAME,
|
||||
}
|
||||
|
||||
def _get_ceph_client_overrides(self):
|
||||
|
@ -7,7 +7,6 @@
|
||||
|
||||
from sysinv.common import constants
|
||||
from sysinv.common import exception
|
||||
from sysinv.common import utils
|
||||
from sysinv.common.storage_backend_conf import StorageBackendConfig
|
||||
from sysinv.helm import common
|
||||
|
||||
@ -17,10 +16,6 @@ from k8sapp_openstack.utils import get_image_rook_ceph
|
||||
from k8sapp_openstack.utils import is_rook_ceph_backend_available
|
||||
|
||||
|
||||
# Info used in the Glance Helm chart.
|
||||
RBD_STORE_USER = 'images'
|
||||
|
||||
|
||||
class GlanceHelm(openstack.OpenstackBaseHelm):
|
||||
"""Class to encapsulate helm operations for the glance chart"""
|
||||
|
||||
@ -32,7 +27,7 @@ class GlanceHelm(openstack.OpenstackBaseHelm):
|
||||
AUTH_USERS = ['glance']
|
||||
|
||||
def get_overrides(self, namespace=None):
|
||||
self._rook_ceph = self._is_rook_ceph()
|
||||
self._rook_ceph = is_rook_ceph_backend_available()
|
||||
|
||||
overrides = {
|
||||
common.HELM_NS_OPENSTACK: {
|
||||
@ -53,17 +48,11 @@ class GlanceHelm(openstack.OpenstackBaseHelm):
|
||||
# are not necessarily the same. Therefore, the ceph client image must be
|
||||
# dynamically configured based on the ceph backend currently deployed.
|
||||
if is_rook_ceph_backend_available():
|
||||
rook_ceph_config_helper = get_image_rook_ceph()
|
||||
overrides[common.HELM_NS_OPENSTACK] = self._update_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
{
|
||||
'images': {
|
||||
'tags': {
|
||||
'glance_storage_init': rook_ceph_config_helper,
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
overrides[common.HELM_NS_OPENSTACK] =\
|
||||
self._update_image_tag_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
['glance_storage_init'],
|
||||
get_image_rook_ceph())
|
||||
|
||||
if namespace in self.SUPPORTED_NAMESPACES:
|
||||
return overrides[namespace]
|
||||
@ -141,18 +130,16 @@ class GlanceHelm(openstack.OpenstackBaseHelm):
|
||||
rbd_store_pool = ""
|
||||
rbd_store_user = ""
|
||||
replication = 1
|
||||
elif self._rook_ceph:
|
||||
rbd_store_pool = constants.CEPH_POOL_IMAGES_NAME
|
||||
rbd_store_user = RBD_STORE_USER
|
||||
|
||||
replication = 2
|
||||
if utils.is_aio_simplex_system(self.dbapi):
|
||||
replication = 1
|
||||
else:
|
||||
rbd_store_pool = app_constants.CEPH_POOL_IMAGES_NAME
|
||||
rbd_store_user = RBD_STORE_USER
|
||||
replication, min_replication = \
|
||||
StorageBackendConfig.get_ceph_pool_replication(self.dbapi)
|
||||
rbd_store_user = app_constants.CEPH_RBD_POOL_USER_GLANCE
|
||||
target = constants.SB_TYPE_CEPH_ROOK if self._rook_ceph\
|
||||
else constants.SB_TYPE_CEPH
|
||||
backend = StorageBackendConfig.get_configured_backend(self.dbapi,
|
||||
target)
|
||||
replication, _ = StorageBackendConfig.get_ceph_pool_replication(
|
||||
api=self.dbapi,
|
||||
ceph_backend=backend)
|
||||
|
||||
if not self._rook_ceph:
|
||||
# Only the primary Ceph tier is used for the glance images pool
|
||||
@ -162,7 +149,7 @@ class GlanceHelm(openstack.OpenstackBaseHelm):
|
||||
constants.CEPH_CRUSH_TIER_SUFFIX,
|
||||
"-ruleset").replace('-', '_')
|
||||
else:
|
||||
rule_name = "storage_tier_ruleset"
|
||||
rule_name = app_constants.CEPH_ROOK_POLL_CRUSH_RULE
|
||||
|
||||
chunk_size = self._estimate_ceph_pool_pg_num(self.dbapi.istor_get_all())
|
||||
|
||||
|
@ -44,17 +44,11 @@ class GnocchiHelm(openstack.OpenstackBaseHelm):
|
||||
# are not necessarily the same. Therefore, the ceph client image must be
|
||||
# dynamically configured based on the ceph backend currently deployed.
|
||||
if is_rook_ceph_backend_available():
|
||||
rook_ceph_config_helper = get_image_rook_ceph()
|
||||
overrides[common.HELM_NS_OPENSTACK] = self._update_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
{
|
||||
'images': {
|
||||
'tags': {
|
||||
'gnocchi_storage_init': rook_ceph_config_helper,
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
overrides[common.HELM_NS_OPENSTACK] =\
|
||||
self._update_image_tag_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
['gnocchi_storage_init'],
|
||||
get_image_rook_ceph())
|
||||
|
||||
if namespace in self.SUPPORTED_NAMESPACES:
|
||||
return overrides[namespace]
|
||||
|
@ -53,17 +53,11 @@ class LibvirtHelm(openstack.OpenstackBaseHelm):
|
||||
# are not necessarily the same. Therefore, the ceph client image must be
|
||||
# dynamically configured based on the ceph backend currently deployed.
|
||||
if is_rook_ceph_backend_available():
|
||||
rook_ceph_config_helper = get_image_rook_ceph()
|
||||
overrides[common.HELM_NS_OPENSTACK] = self._update_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
{
|
||||
'images': {
|
||||
'tags': {
|
||||
'ceph_config_helper': rook_ceph_config_helper,
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
overrides[common.HELM_NS_OPENSTACK] =\
|
||||
self._update_image_tag_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
['ceph_config_helper'],
|
||||
get_image_rook_ceph())
|
||||
|
||||
if namespace in self.SUPPORTED_NAMESPACES:
|
||||
return overrides[namespace]
|
||||
@ -75,7 +69,7 @@ class LibvirtHelm(openstack.OpenstackBaseHelm):
|
||||
|
||||
def _get_conf_overrides(self):
|
||||
admin_keyring = 'null'
|
||||
if self._is_rook_ceph():
|
||||
if is_rook_ceph_backend_available():
|
||||
admin_keyring = self._get_rook_ceph_admin_keyring()
|
||||
|
||||
overrides = {
|
||||
|
@ -25,11 +25,6 @@ from k8sapp_openstack.utils import is_rook_ceph_backend_available
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
# Align ephemeral rbd_user with the cinder rbd_user so that the same libvirt
|
||||
# secret can be used for accessing both pools. This also aligns with the
|
||||
# behavior defined in nova/virt/libvirt/volume/net.py:_set_auth_config_rbd()
|
||||
RBD_POOL_USER = "cinder"
|
||||
|
||||
DEFAULT_NOVA_PCI_ALIAS = [
|
||||
{"vendor_id": constants.NOVA_PCI_ALIAS_QAT_PF_VENDOR,
|
||||
"product_id": constants.NOVA_PCI_ALIAS_QAT_DH895XCC_PF_DEVICE,
|
||||
@ -88,7 +83,7 @@ class NovaHelm(openstack.OpenstackBaseHelm):
|
||||
self.rbd_config = {}
|
||||
|
||||
def get_overrides(self, namespace=None):
|
||||
self._rook_ceph = self._is_rook_ceph()
|
||||
self._rook_ceph = is_rook_ceph_backend_available()
|
||||
|
||||
self.labels_by_hostid = self._get_host_labels()
|
||||
self.cpus_by_hostid = self._get_host_cpus()
|
||||
@ -169,18 +164,11 @@ class NovaHelm(openstack.OpenstackBaseHelm):
|
||||
# are not necessarily the same. Therefore, the ceph client image must be
|
||||
# dynamically configured based on the ceph backend currently deployed.
|
||||
if is_rook_ceph_backend_available():
|
||||
rook_ceph_config_helper = get_image_rook_ceph()
|
||||
overrides[common.HELM_NS_OPENSTACK] = self._update_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
{
|
||||
'images': {
|
||||
'tags': {
|
||||
'nova_service_cleaner': rook_ceph_config_helper,
|
||||
'nova_storage_init': rook_ceph_config_helper
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
overrides[common.HELM_NS_OPENSTACK] =\
|
||||
self._update_image_tag_overrides(
|
||||
overrides[common.HELM_NS_OPENSTACK],
|
||||
['nova_service_cleaner', 'nova_storage_init'],
|
||||
get_image_rook_ceph())
|
||||
|
||||
if namespace in self.SUPPORTED_NAMESPACES:
|
||||
return overrides[namespace]
|
||||
@ -724,52 +712,29 @@ class NovaHelm(openstack.OpenstackBaseHelm):
|
||||
def get_region_name(self):
|
||||
return self._get_service_region_name(self.SERVICE_NAME)
|
||||
|
||||
def _get_rook_ceph_rbd_ephemeral_storage(self):
|
||||
ephemeral_storage_conf = {}
|
||||
ephemeral_pools = []
|
||||
|
||||
# Get the values for replication and min replication from the storage
|
||||
# backend attributes.
|
||||
replication = 2
|
||||
if utils.is_aio_simplex_system(self.dbapi):
|
||||
replication = 1
|
||||
|
||||
# Form the dictionary with the info for the ephemeral pool.
|
||||
# If needed, multiple pools can be specified.
|
||||
ephemeral_pool = {
|
||||
'rbd_pool_name': constants.CEPH_POOL_EPHEMERAL_NAME,
|
||||
'rbd_user': RBD_POOL_USER,
|
||||
'rbd_crush_rule': "storage_tier_ruleset",
|
||||
'rbd_replication': replication,
|
||||
'rbd_chunk_size': constants.CEPH_POOL_EPHEMERAL_PG_NUM
|
||||
}
|
||||
ephemeral_pools.append(ephemeral_pool)
|
||||
|
||||
ephemeral_storage_conf = {
|
||||
'type': 'rbd',
|
||||
'rbd_pools': ephemeral_pools
|
||||
}
|
||||
|
||||
return ephemeral_storage_conf
|
||||
|
||||
def _get_rbd_ephemeral_storage(self):
|
||||
if self._rook_ceph:
|
||||
return self._get_rook_ceph_rbd_ephemeral_storage()
|
||||
|
||||
ephemeral_storage_conf = {}
|
||||
ephemeral_pools = []
|
||||
|
||||
# Get the values for replication and min replication from the storage
|
||||
# backend attributes.
|
||||
replication, min_replication = \
|
||||
StorageBackendConfig.get_ceph_pool_replication(self.dbapi)
|
||||
target = constants.SB_TYPE_CEPH_ROOK if self._rook_ceph\
|
||||
else constants.SB_TYPE_CEPH
|
||||
backend = StorageBackendConfig.get_configured_backend(self.dbapi,
|
||||
target)
|
||||
if not backend:
|
||||
LOG.error("No storage backend configured")
|
||||
return {}
|
||||
replication, _ = StorageBackendConfig.get_ceph_pool_replication(
|
||||
api=self.dbapi,
|
||||
ceph_backend=backend)
|
||||
|
||||
# For now, the ephemeral pool will only be on the primary Ceph tier
|
||||
rule_name = "{0}{1}{2}".format(
|
||||
ceph_rule_name = "{0}{1}{2}".format(
|
||||
constants.SB_TIER_DEFAULT_NAMES[
|
||||
constants.SB_TIER_TYPE_CEPH],
|
||||
constants.CEPH_CRUSH_TIER_SUFFIX,
|
||||
"-ruleset").replace('-', '_')
|
||||
rook_ceph_rule_name = app_constants.CEPH_ROOK_POLL_CRUSH_RULE
|
||||
rule_name = rook_ceph_rule_name if self._rook_ceph else ceph_rule_name
|
||||
|
||||
chunk_size = self._estimate_ceph_pool_pg_num(self.dbapi.istor_get_all())
|
||||
|
||||
@ -777,10 +742,15 @@ class NovaHelm(openstack.OpenstackBaseHelm):
|
||||
# If needed, multiple pools can be specified.
|
||||
ephemeral_pool = {
|
||||
'rbd_pool_name': app_constants.CEPH_POOL_EPHEMERAL_NAME,
|
||||
'rbd_user': RBD_POOL_USER,
|
||||
# Align ephemeral rbd_user with the cinder rbd_user so that the same
|
||||
# libvirt secret can be used for accessing both pools. This also
|
||||
# aligns with the behavior defined in
|
||||
# nova/virt/libvirt/volume/net.py:_set_auth_config_rbd()
|
||||
'rbd_user': app_constants.CEPH_RBD_POOL_USER_CINDER,
|
||||
'rbd_crush_rule': rule_name,
|
||||
'rbd_replication': replication,
|
||||
'rbd_chunk_size': min(chunk_size, app_constants.CEPH_POOL_EPHEMERAL_CHUNK_SIZE)
|
||||
'rbd_chunk_size': min(chunk_size,
|
||||
app_constants.CEPH_POOL_EPHEMERAL_CHUNK_SIZE)
|
||||
}
|
||||
ephemeral_pools.append(ephemeral_pool)
|
||||
|
||||
|
@ -261,6 +261,28 @@ class OpenstackBaseHelm(FluxCDBaseHelm):
|
||||
dictionary[key] = value
|
||||
return dictionary
|
||||
|
||||
def _update_image_tag_overrides(self,
|
||||
overrides: dict,
|
||||
images: list,
|
||||
tag: str):
|
||||
"""Overrides the images.tags for a given list of images
|
||||
|
||||
Args:
|
||||
overrides (dict): base overrides to be updated
|
||||
images (list): list of images to be updated, as defined in the
|
||||
images.tags keys of the chart values
|
||||
tags (str): new image to override the values of the the given
|
||||
images.tags. Must be in the standard <repo:tag> format
|
||||
"""
|
||||
tags_overrides = dict(zip(images, [tag] * len(images)))
|
||||
images_overrides = {
|
||||
'images': {
|
||||
'tags': tags_overrides
|
||||
}
|
||||
}
|
||||
overrides_updated = self._update_overrides(overrides, images_overrides)
|
||||
return overrides_updated
|
||||
|
||||
def _get_endpoints_identity_overrides(self, service_name, users,
|
||||
service_users=()):
|
||||
# Returns overrides for admin and individual users
|
||||
@ -567,7 +589,7 @@ class OpenstackBaseHelm(FluxCDBaseHelm):
|
||||
return uefi_config
|
||||
|
||||
def _get_ceph_client_overrides(self):
|
||||
if self._is_rook_ceph():
|
||||
if app_utils.is_rook_ceph_backend_available():
|
||||
return {
|
||||
'user_secret_name': constants.K8S_RBD_PROV_ADMIN_SECRET_NAME,
|
||||
}
|
||||
@ -731,7 +753,7 @@ class OpenstackBaseHelm(FluxCDBaseHelm):
|
||||
try:
|
||||
kube = kubernetes.KubeOperator()
|
||||
keyring = kube.kube_get_secret(constants.K8S_RBD_PROV_ADMIN_SECRET_NAME,
|
||||
common.HELM_NS_STORAGE_PROVISIONER)
|
||||
app_constants.HELM_NS_ROOK_CEPH)
|
||||
return base64.b64decode(keyring.data['key']).decode('utf-8')
|
||||
except Exception:
|
||||
pass
|
||||
|
@ -14,6 +14,7 @@ from oslo_log import log as logging
|
||||
from sysinv.api.controllers.v1 import utils
|
||||
from sysinv.common import constants
|
||||
from sysinv.common import exception
|
||||
from sysinv.common import kubernetes
|
||||
from sysinv.helm import common
|
||||
from sysinv.helm import lifecycle_base as base
|
||||
from sysinv.helm import lifecycle_utils as lifecycle_utils
|
||||
@ -23,6 +24,7 @@ from sysinv.helm.lifecycle_constants import LifecycleConstants
|
||||
from k8sapp_openstack import utils as app_utils
|
||||
from k8sapp_openstack.common import constants as app_constants
|
||||
from k8sapp_openstack.helpers import ldap
|
||||
from k8sapp_openstack.utils import is_rook_ceph_backend_available
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
@ -208,29 +210,42 @@ class OpenstackAppLifecycleOperator(base.AppLifecycleOperator):
|
||||
lifecycle_utils.create_local_registry_secrets(app_op, app, hook_info)
|
||||
|
||||
try:
|
||||
kube = kubernetes.KubeOperator()
|
||||
# Create openstack namespace if it doesn't exist
|
||||
# Copy the latest configmap with the ceph monitor information
|
||||
# required by the application into the application namespace
|
||||
if app_op._kube.kube_get_config_map(
|
||||
if kube.kube_get_config_map(
|
||||
self.APP_OPENSTACK_RESOURCE_CONFIG_MAP,
|
||||
common.HELM_NS_OPENSTACK):
|
||||
# Already have one. Delete it, in case it changed
|
||||
app_op._kube.kube_delete_config_map(
|
||||
kube.kube_delete_config_map(
|
||||
self.APP_OPENSTACK_RESOURCE_CONFIG_MAP,
|
||||
common.HELM_NS_OPENSTACK)
|
||||
|
||||
# Read rbd-storage-init config map and rename it to ceph-etc
|
||||
config_map_body = app_op._kube.kube_read_config_map(
|
||||
self.APP_KUBESYSTEM_RESOURCE_CONFIG_MAP,
|
||||
common.HELM_NS_RBD_PROVISIONER)
|
||||
if is_rook_ceph_backend_available():
|
||||
# Read ceph-etc config map from rooh-ceph namespace
|
||||
config_map_name = self.APP_OPENSTACK_RESOURCE_CONFIG_MAP
|
||||
config_map_ns = app_constants.HELM_NS_ROOK_CEPH
|
||||
else:
|
||||
# Read rbd-storage-init config map from kube-system namespace
|
||||
config_map_name = self.APP_KUBESYSTEM_RESOURCE_CONFIG_MAP
|
||||
config_map_ns = common.HELM_NS_RBD_PROVISIONER
|
||||
|
||||
config_map_body.metadata.resource_version = None
|
||||
config_map_body.metadata.namespace = common.HELM_NS_OPENSTACK
|
||||
config_map_body.metadata.name = self.APP_OPENSTACK_RESOURCE_CONFIG_MAP
|
||||
config_map_body = kube.kube_read_config_map(config_map_name,
|
||||
config_map_ns)
|
||||
|
||||
# Create configmap with correct name
|
||||
app_op._kube.kube_create_config_map(
|
||||
common.HELM_NS_OPENSTACK,
|
||||
config_map_body)
|
||||
if config_map_body:
|
||||
config_map_body.metadata.resource_version = None
|
||||
config_map_body.metadata.namespace = common.HELM_NS_OPENSTACK
|
||||
config_map_body.metadata.name = self.APP_OPENSTACK_RESOURCE_CONFIG_MAP
|
||||
|
||||
# Create configmap with correct name
|
||||
kube.kube_create_config_map(
|
||||
common.HELM_NS_OPENSTACK,
|
||||
config_map_body)
|
||||
else:
|
||||
raise exception.LifecycleMissingInfo(
|
||||
f"Missing {self.APP_OPENSTACK_RESOURCE_CONFIG_MAP} config map")
|
||||
|
||||
# Perform pre apply LDAP-related actions.
|
||||
self._pre_apply_ldap_actions(app)
|
||||
|
Loading…
x
Reference in New Issue
Block a user