From a90e30c3208fbc77e58d8d777d16d8df5e9721fc Mon Sep 17 00:00:00 2001 From: Arnaud M Date: Wed, 30 Oct 2024 00:31:40 +0100 Subject: [PATCH] Use block-storage as default cinder service type A recent change in tempest switch cinder service type from volumev3 to block-storage, preventing us to discover correctly the endpoints. block-storage is the default service type for cinder since years but the volumev3 alias was widely used instead. We will now use block-storage as default now and keep volumev3 as alias. Also add block-store as another valid (but less used) alias. See: https://review.opendev.org/c/openstack/tempest/+/930296 Closes-bug: #2085878 Change-Id: If2ff4c3ac7049e4df57521af7707ba5203d286ac Signed-off-by: Arnaud M --- mistral_extra/actions/openstack/actions.py | 37 +++++++------ mistral_extra/actions/openstack/base.py | 53 +++++++++++++++---- .../actions/openstack/utils/exceptions.py | 4 ++ .../actions/openstack/utils/keystone.py | 2 +- ...ev3-to-block-storage-ea7aff76e436f692.yaml | 6 +++ 5 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 releasenotes/notes/switch-volumev3-to-block-storage-ea7aff76e436f692.yaml diff --git a/mistral_extra/actions/openstack/actions.py b/mistral_extra/actions/openstack/actions.py index a433757..d5f0ebf 100644 --- a/mistral_extra/actions/openstack/actions.py +++ b/mistral_extra/actions/openstack/actions.py @@ -79,7 +79,7 @@ zun_api_versions = _try_import('zunclient.api_versions') class NovaAction(base.OpenStackAction): - _service_type = 'compute' + _service_types = ['compute'] @classmethod def _get_client_class(cls): @@ -115,7 +115,7 @@ class NovaAction(base.OpenStackAction): class GlanceAction(base.OpenStackAction): - _service_type = 'image' + _service_types = ['image'] @classmethod def _get_client_class(cls): @@ -142,7 +142,7 @@ class GlanceAction(base.OpenStackAction): class KeystoneAction(base.OpenStackAction): - _service_type = 'identity' + _service_types = ['identity'] @classmethod def _get_client_class(cls): @@ -176,7 +176,7 @@ class KeystoneAction(base.OpenStackAction): class HeatAction(base.OpenStackAction): - _service_type = 'orchestration' + _service_types = ['orchestration'] @classmethod def _get_client_class(cls): @@ -204,7 +204,7 @@ class HeatAction(base.OpenStackAction): class NeutronAction(base.OpenStackAction): - _service_type = 'network' + _service_types = ['network'] @classmethod def _get_client_class(cls): @@ -229,7 +229,14 @@ class NeutronAction(base.OpenStackAction): class CinderAction(base.OpenStackAction): - _service_type = 'volumev3' + # NOTE(amorin) block-storage is the official one, but since years, + # cinder has been using volumev3 as default. The effort to switch + # the default to block-storage has been done during epoxy cycle. + # Also adding block-store as another alias. + # See all service types here: + # https://service-types.openstack.org/ + # lp-2085878 + _service_types = ['block-storage', 'volumev3', 'block-store'] @classmethod def _get_client_class(cls): @@ -266,7 +273,7 @@ class CinderAction(base.OpenStackAction): class MistralAction(base.OpenStackAction): - _service_type = 'workflowv2' + _service_types = ['workflowv2'] @classmethod def _get_client_class(cls): @@ -293,7 +300,7 @@ class MistralAction(base.OpenStackAction): class TroveAction(base.OpenStackAction): - _service_type = 'database' + _service_types = ['database'] @classmethod def _get_client_class(cls): @@ -455,7 +462,7 @@ class SwiftServiceAction(base.OpenStackAction): class ZaqarAction(base.OpenStackAction): - _service_type = 'messaging' + _service_types = ['messaging'] @classmethod def _get_client_class(cls): @@ -590,7 +597,7 @@ class ZaqarAction(base.OpenStackAction): class BarbicanAction(base.OpenStackAction): - _service_type = 'key-manager' + _service_types = ['key-manager'] @classmethod def _get_client_class(cls): @@ -700,7 +707,7 @@ class BarbicanAction(base.OpenStackAction): class DesignateAction(base.OpenStackAction): - _service_type = 'dns' + _service_types = ['dns'] @classmethod def _get_client_class(cls): @@ -781,7 +788,7 @@ class TackerAction(base.OpenStackAction): class AodhAction(base.OpenStackAction): - _service_type = 'alarming' + _service_types = ['alarming'] @classmethod def _get_client_class(cls): @@ -812,7 +819,7 @@ class AodhAction(base.OpenStackAction): class GnocchiAction(base.OpenStackAction): - _service_type = 'metric' + _service_types = ['metric'] @classmethod def _get_client_class(cls): @@ -846,7 +853,7 @@ class GnocchiAction(base.OpenStackAction): class VitrageAction(base.OpenStackAction): - _service_type = 'rca' + _service_types = ['rca'] @classmethod def _get_client_class(cls): @@ -918,7 +925,7 @@ class ZunAction(base.OpenStackAction): class ManilaAction(base.OpenStackAction): - _service_type = 'sharev2' + _service_types = ['sharev2'] @classmethod def _get_client_class(cls): diff --git a/mistral_extra/actions/openstack/base.py b/mistral_extra/actions/openstack/base.py index 463356e..a70f8cf 100644 --- a/mistral_extra/actions/openstack/base.py +++ b/mistral_extra/actions/openstack/base.py @@ -38,7 +38,7 @@ class OpenStackAction(actions.Action): _kwargs_for_run = {} client_method_name = None _service_name = None - _service_type = None + _service_types = [] _client_class = None def __init__(self, **kwargs): @@ -95,12 +95,28 @@ class OpenStackAction(actions.Action): :param context: the action context :return: dict that can be used to initialize service clients """ + sess = None + for service_type in self._service_types: + try: + sess = keystone_utils.get_session_and_auth( + service_name=self._service_name, + service_type=service_type, + region_name=self.action_region, + ctx=context) + except exc.MistralKeystoneException: + # Maybe this service_type was not found + pass - return keystone_utils.get_session_and_auth( - service_name=self._service_name, - service_type=self._service_type, - region_name=self.action_region, - ctx=context) + if not sess: + raise exc.MistralException( + "Unable to get keystone session. Maybe endpoints are " + "missing? (service_name=%s, service_types=%s," + " region_name=%s)" + % (self._service_name, self._service_types, + self.action_region) + ) + + return sess def get_service_endpoint(self): """Get OpenStack service endpoint. @@ -108,11 +124,26 @@ class OpenStackAction(actions.Action): 'service_name' and 'service_type' are defined in specific OpenStack service action. """ - endpoint = keystone_utils.get_endpoint_for_project( - service_name=self._service_name, - service_type=self._service_type, - region_name=self.action_region - ) + endpoint = None + for service_type in self._service_types: + try: + endpoint = keystone_utils.get_endpoint_for_project( + service_name=self._service_name, + service_type=service_type, + region_name=self.action_region + ) + except exc.MistralKeystoneException: + # Maybe this service_type was not found + pass + + if not endpoint: + raise exc.MistralException( + "Unable to get service endpoint. Maybe endpoints are " + "missing? (service_name=%s, service_types=%s," + " region_name=%s)" + % (self._service_name, self._service_types, + self.action_region) + ) return endpoint diff --git a/mistral_extra/actions/openstack/utils/exceptions.py b/mistral_extra/actions/openstack/utils/exceptions.py index c658433..ff2fda9 100644 --- a/mistral_extra/actions/openstack/utils/exceptions.py +++ b/mistral_extra/actions/openstack/utils/exceptions.py @@ -27,3 +27,7 @@ class ApplicationContextNotFoundException(MistralException): class ActionException(MistralException): http_code = 400 + + +class MistralKeystoneException(MistralException): + message = "A unknown Keystone exception occurred" diff --git a/mistral_extra/actions/openstack/utils/keystone.py b/mistral_extra/actions/openstack/utils/keystone.py index db2cba0..efd2ee9 100644 --- a/mistral_extra/actions/openstack/utils/keystone.py +++ b/mistral_extra/actions/openstack/utils/keystone.py @@ -203,7 +203,7 @@ def get_endpoint_for_project(service_name=None, service_type=None, break if not endpoint: - raise exceptions.MistralException( + raise exceptions.MistralKeystoneException( "No endpoints found [service_name=%s, service_type=%s," " region_name=%s]" % (service_name, service_type, region) diff --git a/releasenotes/notes/switch-volumev3-to-block-storage-ea7aff76e436f692.yaml b/releasenotes/notes/switch-volumev3-to-block-storage-ea7aff76e436f692.yaml new file mode 100644 index 0000000..f4f8052 --- /dev/null +++ b/releasenotes/notes/switch-volumev3-to-block-storage-ea7aff76e436f692.yaml @@ -0,0 +1,6 @@ +--- +deprecations: + - | + Use ``block-storage`` as default cinder service type in mistral actions. + Also adding ``volumev3`` and ``block-store`` as valid aliases. + See lp-2085878.