Use availability zone instead of Region for storage classes

Using the RegionName instead of the availability zone to configure cinder storage classes causes errors. We provide a configurable availability zone option and a default of 'nova' (which should be on most standard deployments

Change-Id: Ie4a6c26d42a85dae5cd95a1f0f220971e21ac691
This commit is contained in:
scrungus 2024-03-25 15:52:45 +00:00 committed by John Garbutt
parent 18045a7070
commit cc89e48141
No known key found for this signature in database
4 changed files with 22 additions and 16 deletions

View File

@ -125,6 +125,7 @@ The driver respects the following cluster and template properties:
The driver supports the following labels:
* csi_cinder_availability_zone: default is nova, operators can configure the default in magnum.conf
* monitoring_enabled: default is off, change to "true" to enable
* kube_dashboard_enabled: defalt is on, change to "false" to disable
* octavia_provider: default is "amphora", ovn is also an option

View File

@ -117,6 +117,11 @@ capi_helm_opts = [
"volume binding and dynamic provisioning should occur."
),
),
cfg.StrOpt(
"csi_cinder_availability_zone",
default="nova",
help=("The default availability zone to use for Cinder volumes."),
),
cfg.StrOpt(
"app_cred_interface_type",
default="public",

View File

@ -625,6 +625,13 @@ class Driver(driver.Driver):
f"Minimum {CONF.capi_helm.minimum_flavor_ram} MB required."
)
def _get_csi_cinder_availability_zone(self, cluster):
return self._label(
cluster,
"csi_cinder_availability_zone",
CONF.capi_helm.csi_cinder_availability_zone,
)
def _get_csi_cinder_reclaim_policy(self, cluster):
return self._label(
cluster,
@ -660,7 +667,7 @@ class Driver(driver.Driver):
"""
LOG.debug("Retrieve volume types from cinder for StorageClasses.")
client = clients.OpenStackClients(context)
region_name = client.cinder_region_name()
availability_zone = self._get_csi_cinder_availability_zone(cluster)
c_client = client.cinder()
volume_types = [i.name for i in c_client.volume_types.list()]
# Use the default volume type if defined. Otherwise use the first
@ -694,7 +701,7 @@ class Driver(driver.Driver):
"name": driver_utils.sanitized_name(volume_type),
"reclaimPolicy": reclaim_policy,
"allowVolumeExpansion": allow_expansion,
"availabilityZone": region_name,
"availabilityZone": availability_zone,
"volumeType": volume_type,
"allowedTopologies": allowed_topologies,
"fstype": fstype,

View File

@ -1957,11 +1957,10 @@ class ClusterAPIDriverTest(base.DbTestCase):
)
mock_labels.assert_called_with(self.cluster_obj)
@mock.patch("magnum.common.clients.OpenStackClients.cinder_region_name")
@mock.patch("magnum.common.clients.OpenStackClients.cinder")
def test_get_storage_classes(self, mock_cinder, mock_osc_rn):
def test_get_storage_classes(self, mock_cinder):
CONF.capi_helm.csi_cinder_default_volume_type = "type3"
mock_osc_rn.return_value = "middle_earth_east"
CONF.capi_helm.csi_cinder_availability_zone = "middle_earth_east"
mock_vol_type_1 = mock.MagicMock()
mock_vol_type_1.name = "type1"
mock_vol_type_2 = mock.MagicMock()
@ -1989,17 +1988,14 @@ class ClusterAPIDriverTest(base.DbTestCase):
"type3", storage_classes["defaultStorageClass"]["volumeType"]
)
self.assertEqual(
"middle_earth_east",
"middleeartheast",
storage_classes["additionalStorageClasses"][0]["availabilityZone"],
)
@mock.patch("magnum.common.clients.OpenStackClients.cinder_region_name")
@mock.patch("magnum.common.clients.OpenStackClients.cinder")
def test_get_storage_class_volume_type_not_available(
self, mock_cinder, mock_osc_rn
):
def test_get_storage_class_volume_type_not_available(self, mock_cinder):
CONF.capi_helm.csi_cinder_default_volume_type = "type4"
mock_osc_rn.return_value = "middle_earth_east"
CONF.capi_helm.csi_cinder_availability_zone = "middle_earth_east"
mock_vol_type_1 = mock.MagicMock()
mock_vol_type_1.name = "type1"
mock_vol_type_2 = mock.MagicMock()
@ -2023,13 +2019,10 @@ class ClusterAPIDriverTest(base.DbTestCase):
self.cluster_obj,
)
@mock.patch("magnum.common.clients.OpenStackClients.cinder_region_name")
@mock.patch("magnum.common.clients.OpenStackClients.cinder")
def test_get_storage_class_volume_type_not_defined(
self, mock_cinder, mock_osc_rn
):
def test_get_storage_class_volume_type_not_defined(self, mock_cinder):
CONF.capi_helm.csi_cinder_default_volume_type = None
mock_osc_rn.return_value = "middle_earth_east"
CONF.capi_helm.csi_cinder_availability_zone = "middle_earth_east"
mock_vol_type_1 = mock.MagicMock()
mock_vol_type_1.name = "__TYPE1__"
mock_vol_type_2 = mock.MagicMock()